From 37f52097847f9025589c79034be2454432c55433 Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期五, 02 十月 2026 10:12:27 +0800
Subject: [PATCH] docs(交接): 记录关机前开发服务已停止

---
 traffic-audit-server/src/main/java/com/trafficaudit/holiday/HolidayNumberUtils.java |   70 +++++++++++++++++++++++++++++++++++
 1 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/holiday/HolidayNumberUtils.java b/traffic-audit-server/src/main/java/com/trafficaudit/holiday/HolidayNumberUtils.java
new file mode 100644
index 0000000..fb0ea58
--- /dev/null
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/holiday/HolidayNumberUtils.java
@@ -0,0 +1,70 @@
+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();
+    }
+}

--
Gitblit v1.9.1