BigDecimal、DecimalFormat工具类-浮点类型计算格式化-史上最全=_=

继上一篇屌的一批的时间操作工具类之后又一力作BigDecimal浮点类型操作/DecimalFormat浮点类型格式化保留小数

注意:强制依赖jdk8以上

方法:支持可变长参数,所有数值类型以及collection类型

声明:可变长参数的方法跟传入两个参数的方法其实是可以用重载来声明相同的方法名的。这里个人认为在使用工具类的时候其实大概知道自己传入参数的数量,所以用更鲜明的方法名来区分会更易阅读,在自身知道传入的是两个参数的时候建议不要调用可变长参数,这样的性能会更优。

/*
 * Copyright 2016-2018. Individual ownership panw
 *
 * Tech blog at http://blog.csdn.net/hatsune_miku_.
 *
 * Contact Mailbox at [email protected].
 *
 * panwang All Rights Reserved.
 */
package com.miku.common.utils.numeric;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Collection;

/**
 * File Name:BigDecimalUtils
 *
 * @author:panwang
 * @description: 浮点类型计算工具类
 * @date:2017/11/24
 * @version:V1.0
 * @see:jdk8 Copyright (c) 2017, [email protected] All Rights Reserved.
 */
public class BigDecimalUtils {

    private static final String DECIMAL_DEFAULT="0.00";

    private static final DecimalFormat DECIMALFORMAT_DEFAULT = new DecimalFormat("0.00");

    /**
     * 将数值转换为BigDecimal
     *
     * @param o object
     * @return
     */
    public static BigDecimal objectToBigDecimal (Object o) {
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(o)));
    }

    /**
     * 将两个数值相加并返回浮点类型
     *
     * @param o1 object
     * @param o2 object
     * @return bigDecimal
     */
    public static BigDecimal plus (Object o1, Object o2) {
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(o1)))
                .add(BigDecimal.valueOf(Double.valueOf(String.valueOf(o2))));
    }

    /**
     * 将传入的数值累加返回,入参必须是数字,任意类型
     *
     * @param o objects
     * @return bigDecimal
     */
    public static BigDecimal objectsTotalToBD (Object... o) {
        return Arrays.stream(o)
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal::add).get();
    }

    /**
     * 将集合的所有数值做累计操作,collection元素任意类型
     *
     * @param t extends collection
     * @param  object
     * @return
     */
    public static > BigDecimal arrTotalToBD (T t) {
        return t.stream()
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal::add).get();
    }

    /**
     * 参数一减去参数二返回浮点类型
     *
     * @param o1 object
     * @param o2 object
     * @return
     */
    public static BigDecimal subtract (Object o1, Object o2) {
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(o1)))
                .subtract(BigDecimal.valueOf(Double.valueOf(String.valueOf(o2))));
    }

    /**
     * 将参数一减去后续所有数值,任意类型
     *
     * @param total object
     * @param o objects
     * @return
     */
    public static BigDecimal subtractObjectsToBD (Object total, Object... o) {
        return Arrays.stream(o)
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal.valueOf(Double.valueOf(String.valueOf(total))),(a,b) -> a.subtract(b));
    }

    /**
     * 将参数一减去后续集合中所有数值,collection元素任意类型
     *
     * @param total object
     * @param t extends collection
     * @param  object
     * @return
     */
    public static > BigDecimal subtractArrToBD (Object total, T t) {
        return t.stream()
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal.valueOf(Double.valueOf(String.valueOf(total))),(a,b) -> a.subtract(b));
    }

    /**
     * 计算两个数值的乘积
     *
     * @param o1 object
     * @param o2 object
     * @return
     */
    public static BigDecimal multiply (Object o1, Object o2) {
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(o1)))
                .multiply(BigDecimal.valueOf(Double.valueOf(String.valueOf(o2))));
    }

    /**
     * 计算多个数值的乘积,任意类型长度
     *
     * @param o objects
     * @return
     */
    public static BigDecimal multiplyObjectsToBD (Object... o) {
        return Arrays.stream(o)
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal::multiply).get();
    }

    /**
     * 计算集合中数值的乘积,collection元素任意类型
     *
     * @param t extends collection
     * @param  object
     * @return
     */
    public static > BigDecimal multiplyArrToBD (T t) {
        return t.stream()
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal::multiply).get();
    }

    /**
     * 两个数相除四舍五入
     * 根据指定保留小数,如果不指定则默认保留两位
     *
     * @param o1 object
     * @param o2 object
     * @return
     */
    public static BigDecimal divide(Object o1, Object o2,Integer i) {
        if (i == null) {
            i = 2;
        }
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(o1)))
                .divide(BigDecimal.valueOf(
                        Double.valueOf(String.valueOf(o2))),i,BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 格式化浮点类型成指定的小数四舍五入,缺省格式0.00
     * 设置格式请看DecimalFormat
     *
     * @param o object
     * @param format string
     * @return strng
     * @see java.text.DecimalFormat
     */
    public static String objectFormatToString(Object o,String format) {
        if (format == null) {
            format = DECIMAL_DEFAULT;
        }
        DecimalFormat decimalFormat = new DecimalFormat(format);
        return decimalFormat.format(
                BigDecimal.valueOf(Double.valueOf(String.valueOf(o))));
    }

    /**
     * 格式化浮点类型成指定的小数四舍五入,缺省格式0.00
     * 设置格式请看DecimalFormat
     *
     * @param o object
     * @param format string
     * @return bigDecimal
     * @see java.text.DecimalFormat
     */
    public static BigDecimal objectFormatToBD(Object o,String format) {
        if (format == null) {
            format = DECIMAL_DEFAULT;
        }
        DecimalFormat decimalFormat = new DecimalFormat(format);
        return BigDecimalUtils.objectToBigDecimal(
                decimalFormat.format(
                BigDecimal.valueOf(Double.valueOf(String.valueOf(o)))));
    }
}

结语:如有觉得不够力,不够用的请留言注明!!
博客原创:写作不易,转载请标明出处。文章地址:文章地址(๑˃∀˂๑)♪阿里嘎多(๑˃∀˂๑)♪

你可能感兴趣的:(java8,Lambda)