package com.trafficaudit.holiday; import org.apache.poi.ss.util.NumberToTextConverter; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public final class HolidayNumberUtils { public static final MathContext EXCEL_MC = new MathContext(15, RoundingMode.HALF_UP); public static final BigDecimal ZERO = BigDecimal.ZERO; private HolidayNumberUtils() { } public static BigDecimal excelValue(double value) { return normalize(new BigDecimal(NumberToTextConverter.toText(value))); } public static BigDecimal decimalValue(Object value) { if (value == null || value.toString().trim().isEmpty()) return null; return normalize(new BigDecimal(value.toString().trim())); } public static BigDecimal normalize(BigDecimal value) { if (value == null) return null; BigDecimal rounded = value.round(EXCEL_MC); return rounded.signum() == 0 ? ZERO : rounded.stripTrailingZeros(); } public static BigDecimal valueOrZero(BigDecimal value) { return value == null ? ZERO : value; } public static BigDecimal sumNullable(BigDecimal left, BigDecimal right) { if (left == null && right == null) return null; return normalize(valueOrZero(left).add(valueOrZero(right))); } public static BigDecimal multiply(BigDecimal left, BigDecimal right) { if (left == null || right == null) return null; return normalize(left.multiply(right)); } public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor) { if (dividend == null || divisor == null || divisor.signum() == 0) return null; return normalize(dividend.divide(divisor, EXCEL_MC)); } public static boolean sameValue(BigDecimal left, BigDecimal right) { if (left == null || right == null) return false; return normalize(left).compareTo(normalize(right)) == 0; } public static String changeText(BigDecimal value) { if (value == null) return ""; return normalize(value).toPlainString(); } public static String format1(BigDecimal value) { if (value == null) return ""; return value.setScale(1, RoundingMode.HALF_UP).toPlainString(); } public static String format2(BigDecimal value) { if (value == null) return ""; return value.setScale(2, RoundingMode.HALF_UP).toPlainString(); } }