BigDecimal工具类

package util;

import com.weds.framework.core.enums.CompareEnum;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.ObjectUtils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;


/**
 * @description: <br/>
 * BigDecimal  工具类
 * <p>
 * <br/>
 * @author: Qz1997
 * @create 2020/9/24 15:15
 */
@SuppressWarnings("unused")
public final class BigDecimalUtils {
    /**
     * 货币格式
     */
    private static final DecimalFormat CURRENCY_FORMAT = new DecimalFormat("0.00");
    /**
     * 百分比格式
     */
    private static final NumberFormat PERCENT_INSTANCE = NumberFormat.getPercentInstance();

    static {
        PERCENT_INSTANCE.setMaximumFractionDigits(2);
    }

    /**
     * BigDecimal转为货币
     *
     * @param money 金额
     * @return 货币字符串
     */
    public static String toCurrency(BigDecimal money) {
        if (Objects.isNull(money)) {
            return "";
        }
        return CURRENCY_FORMAT.format(money);
    }

    /**
     * BigDecimal转为百分比
     *
     * @param ratio 比例
     * @return 百分比(小数点后保留两位)
     */
    public static String toPercent(BigDecimal ratio) {
        if (Objects.isNull(ratio)) {
            return "";
        }
        return PERCENT_INSTANCE.format(ratio);
    }

    /**
     * 清除小数点后多余的零
     *
     * @param number 数字
     * @return 字符串
     */
    public static String stripTrailingZeros(BigDecimal number) {
        if (Objects.isNull(number)) {
            return "";
        }
        return number.stripTrailingZeros().toPlainString();
    }

    /**
     * 非空默认
     *
     * @param value 原数字
     * @return 后来数字
     */
    public static BigDecimal defaultIfNull(BigDecimal value) {
        return defaultIfNull(value, BigDecimal.ZERO);
    }

    /**
     * 非空默认
     *
     * @param value        原数字
     * @param defaultValue 为空数字
     * @return 后来数字
     */
    public static BigDecimal defaultIfNull(BigDecimal value, BigDecimal defaultValue) {
        return Optional.ofNullable(value).orElse(defaultValue);
    }


    /**
     * 校验参数是否为有一个空或者小于等于零
     *
     * @param zero 校验的参数
     * @return true: 有空/小于等于零  false: 没有空/小于零
     */
    public static Boolean isEmptyOrLeZero(BigDecimal... zero) {
        long count = Arrays.stream(zero).filter(ObjectUtils::isNotEmpty).filter(o -> compare(o, CompareEnum.GT, BigDecimal.ZERO)).count();
        return zero.length != count;
    }

    /**
     * 判断参数与0的比较
     *
     * @param compare 判断规则
     * @param els     校验参数
     * @return T|F
     */
    public static boolean allCompareZero(CompareEnum compare, BigDecimal... els) {
        return Arrays.stream(els).allMatch(el -> compare(el, compare, BigDecimal.ZERO));
    }


    /**
     * 校验参数是否为有一个空或者小于零
     *
     * @param zero 校验的参数
     * @return true: 有空/小于零  false: 没有空/小于零
     */
    public static Boolean isEmptyOrLtZero(BigDecimal... zero) {
        long count = Arrays.stream(zero).filter(ObjectUtils::isNotEmpty).filter(o -> compare(o, CompareEnum.GE, BigDecimal.ZERO)).count();
        return zero.length != count;
    }

    /**
     * 校验参数是否为有一个空
     *
     * @param zero 校验的参数
     * @return true: 有空  false: 没有空
     */
    public static Boolean isEmpty(BigDecimal... zero) {
        long count = Arrays.stream(zero).filter(ObjectUtils::isNotEmpty).count();
        return zero.length != count;
    }

    /**
     * 求和
     *
     * @param zero 求和的参数
     * @return 结果
     */
    public static BigDecimal add(BigDecimal... zero) {
        return Arrays.stream(zero).filter(ObjectUtils::isNotEmpty).reduce(BigDecimal.ZERO, BigDecimal::add);
    }

    /**
     * 求差
     * <br/>
     * 第一个非空 减 剩下的所有数
     *
     * @param zero 求和的参数
     * @return 结果
     */
    public static BigDecimal subtraction(BigDecimal... zero) {
        if (ArrayUtils.isEmpty(zero)) {
            return BigDecimal.ZERO;
        }
        BigDecimal init;
        int length = ArrayUtils.getLength(zero);
        List<BigDecimal> bigDecimalList = Arrays.stream(zero).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
        int count = bigDecimalList.size();
        if (length == 0 || count == 0L) {
            return BigDecimal.ZERO;
        }
        init = zero[0];
        if (count == 1L) {
            return init;
        }
        for (int i = 1; i < bigDecimalList.size(); i++) {
            BigDecimal bigDecimal = bigDecimalList.get(i);
            init = init.subtract(bigDecimal);
        }
        return init;
    }

    /**
     * 两BigDecimal比较
     *
     * @param param1      BigDecimal
     * @param compareEnum 比较表达式
     * @param param2      BigDecimal
     * @return true: param1 表达式 param2 成立
     * <br/>
     * false: param1 表达式 param2 不成立 或 param1/param2为空
     */
    public static Boolean compare(BigDecimal param1, CompareEnum compareEnum, BigDecimal param2) {
        // 有空   return false
        if (isEmpty(param1, param2) || ObjectUtils.isEmpty(compareEnum)) {
            return false;
        }
        switch (compareEnum) {
            case GT:
                return param1.compareTo(param2) > 0;
            case GE:
                return param1.compareTo(param2) >= 0;
            case LT:
                return param1.compareTo(param2) < 0;
            case LE:
                return param1.compareTo(param2) <= 0;
            case EQ:
                return param1.compareTo(param2) == 0;
            case NE:
                return param1.compareTo(param2) != 0;
            default:
                return false;
        }
    }

    /**
     * bigDecimal转字符串
     *
     * @param bigDecimal 原bigDecimal
     * @return 字符串
     */
    public static String toString(BigDecimal bigDecimal) {
        if (bigDecimal == null) {
            return null;
        }
        return bigDecimal.toPlainString();
    }

    /**
     * bigDecimal转字符串 并去除多余零
     *
     * @param bigDecimal 原bigDecimal
     * @return 字符串
     */
    public static String toStripTrailingZeros(BigDecimal bigDecimal) {
        if (bigDecimal == null) {
            return null;
        }
        return bigDecimal.stripTrailingZeros().toPlainString();
    }

    /**
     * 寻找最大的一个BigDecimal
     *
     * @param param BigDecimal数组
     * @return 最大的一个BigDecimal
     */
    public static BigDecimal max(BigDecimal... param) {
        if (ArrayUtils.isEmpty(param)) {
            return BigDecimal.ZERO;
        }
        return Arrays.stream(param).filter(ObjectUtils::isNotEmpty).max(BigDecimal::compareTo).orElse(BigDecimal.ZERO);
    }

    /**
     * 寻找最小的一个BigDecimal
     *
     * @param param BigDecimal数组
     * @return 最小的一个BigDecimal
     */
    public static BigDecimal min(BigDecimal... param) {
        if (ArrayUtils.isEmpty(param)) {
            return BigDecimal.ZERO;
        }
        return Arrays.stream(param).filter(ObjectUtils::isNotEmpty).min(BigDecimal::compareTo).orElse(BigDecimal.ZERO);
    }

    /**
     * 保留小数 2位 四舍五入
     *
     * @param decimal BigDecimal
     * @return 保留小数的BigDecimal
     */
    public static BigDecimal decimalSetScale(BigDecimal decimal) {
        return decimalSetScale(decimal, 2);
    }

    /**
     * 保留小数 四舍五入
     *
     * @param decimal BigDecimal
     * @param digits  小数位数
     * @return 保留小数的BigDecimal
     */
    public static BigDecimal decimalSetScale(BigDecimal decimal, int digits) {
        return decimalSetScale(decimal, digits, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 保留小数 四舍五入
     *
     * @param decimal      BigDecimal
     * @param digits       小数位数
     * @param roundingMode 舍入模式
     * @return 保留小数的BigDecimal
     */
    public static BigDecimal decimalSetScale(BigDecimal decimal, int digits, int roundingMode) {
        int min = 0;
        int max = 7;
        // 舍入模式 < 0 || 舍入模式 > 7
        if (roundingMode < min || roundingMode > max) {
            // 默认四舍五入
            roundingMode = BigDecimal.ROUND_HALF_UP;
        }
        // 位数 < 0 || 位数 > 7
        if (digits < min || digits > max) {
            // 默认取两位
            digits = 2;
        }
        if (ObjectUtils.isEmpty(decimal)) {
            return BigDecimal.ZERO.setScale(digits, roundingMode);
        }
        return decimal.setScale(digits, roundingMode);
    }
}

比较枚举

/**
 * @description: <br/>
 * BigDecimal比较枚举
 * <p>
 * <br/>
 * @author: Qz1997
 * @create 2020/10/20 13:39
 */
public enum CompareEnum {
    /**
     * 大于
     */
    GT,
    /**
     * 大于等于
     */
    GE,
    /**
     * 小于
     */
    LT,
    /**
     * 小于等于
     */
    LE,
    /**
     * 等于
     */
    EQ,
    /**
     * 不等于
     */
    NE
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值