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
}