import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
public class SmartBigDecimalUtil {
public static final int PRICE_DECIMAL_POINT = 2;
public static final int SIX_PRICE_DECIMAL_POINT = 6;
public static final int WEIGHT_DECIMAL_POINT = 3;
public static class Amount {
public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
return setScale(num1.add(num2), PRICE_DECIMAL_POINT);
}
public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
return setScale(num1.multiply(num2), PRICE_DECIMAL_POINT);
}
public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
return setScale(num1.subtract(num2), PRICE_DECIMAL_POINT);
}
public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
return setScale(num1.divide(num2, RoundingMode.HALF_UP), PRICE_DECIMAL_POINT);
}
}
public static class AmountSix {
public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
return setScale(num1.add(num2), SIX_PRICE_DECIMAL_POINT);
}
public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
return setScale(num1.multiply(num2), SIX_PRICE_DECIMAL_POINT);
}
public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
return setScale(num1.subtract(num2), SIX_PRICE_DECIMAL_POINT);
}
public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
return num1.divide(num2, PRICE_DECIMAL_POINT, RoundingMode.HALF_UP);
}
}
public static class Weight {
public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
return setScale(num1.add(num2), WEIGHT_DECIMAL_POINT);
}
public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
return setScale(num1.multiply(num2), WEIGHT_DECIMAL_POINT);
}
public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
return setScale(num1.subtract(num2), WEIGHT_DECIMAL_POINT);
}
public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
return num1.divide(num2, WEIGHT_DECIMAL_POINT, RoundingMode.HALF_UP);
}
}
public static BigDecimal add(BigDecimal num1, BigDecimal num2, int point) {
return setScale(num1.add(num2), point);
}
public static BigDecimal multiply(BigDecimal num1, BigDecimal num2, int point) {
return setScale(num1.multiply(num2), point);
}
public static BigDecimal subtract(BigDecimal num1, BigDecimal num2, int point) {
return setScale(num1.subtract(num2), point);
}
public static BigDecimal divide(BigDecimal num1, BigDecimal num2, int point) {
return num1.divide(num2, point, RoundingMode.HALF_UP);
}
public static BigDecimal setScale(BigDecimal num, int point) {
return num.setScale(point, RoundingMode.HALF_UP);
}
public static boolean isGreaterThan(BigDecimal num1, BigDecimal num2) {
return num1.compareTo(num2) == 1;
}
public static boolean isGreaterOrEqual(BigDecimal num1, BigDecimal num2) {
return isGreaterThan(num1, num2) || equals(num1, num2);
}
public static boolean isLessThan(BigDecimal num1, BigDecimal num2) {
return num1.compareTo(num2) == - 1;
}
public static boolean isLessOrEqual(BigDecimal num1, BigDecimal num2) {
return isLessThan(num1, num2) || equals(num1, num2);
}
public static boolean equals(BigDecimal num1, BigDecimal num2) {
return num1.compareTo(num2) == 0;
}
public static String getPercentage(BigDecimal num1, BigDecimal num2) {
BigDecimal result = num1.divide(num2, 4, RoundingMode.HALF_UP);
NumberFormat percent = NumberFormat.getPercentInstance();
percent.setMaximumFractionDigits(2);
return percent.format(result.doubleValue());
}
public static BigDecimal bigDecimalPercent(Integer num1, Integer num2, int point) {
if (num1 == null || num2 == null) {
return BigDecimal.ZERO;
}
if (num2.equals(Integer.valueOf(0))) {
return BigDecimal.ZERO;
}
BigDecimal bigDecimalNum1 = new BigDecimal(num1);
BigDecimal bigDecimalNum2 = new BigDecimal(num2);
return bigDecimalPercent(bigDecimalNum1, bigDecimalNum2, point);
}
public static BigDecimal bigDecimalPercent(BigDecimal num1, BigDecimal num2, int point) {
if (num1 == null || num2 == null) {
return BigDecimal.ZERO;
}
if (equals(BigDecimal.ZERO, num2)) {
return BigDecimal.ZERO;
}
BigDecimal percent = num1.divide(num2, point + 2, RoundingMode.HALF_UP);
BigDecimal percent100 = percent.multiply(new BigDecimal(100)).setScale(point);
return percent100;
}
public static Boolean isEmpty(BigDecimal num) {
return null == num || equals(BigDecimal.ZERO, num);
}
public static Boolean isNotEmpty(BigDecimal num) {
return ! isEmpty(num);
}
public static BigDecimal convertTenThousand(BigDecimal num, int point) {
BigDecimal decimal = num.divide(new BigDecimal(10000), point, RoundingMode.HALF_UP);
return decimal;
}
public static BigDecimal convertToMinusNumber(BigDecimal num) {
if (isLessOrEqual(num, BigDecimal.ZERO)) {
return num;
}
return BigDecimal.ZERO.subtract(num);
}
}