wangchuanjin 2 ماه پیش
والد
کامیت
038d69d3ad
1فایلهای تغییر یافته به همراه37 افزوده شده و 17 حذف شده
  1. 37 17
      common/numtochinese.go

+ 37 - 17
common/numtochinese.go

@@ -4,26 +4,46 @@ import (
 	"strings"
 )
 
-// 中文数字映射表
-var chineseNums = []string{"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}
-var chinesePlaces = []string{"", "十", "百", "千", "万"} // 这里可以扩展到亿等更高位
+var digitMap = map[int]string{
+	0: "零", 1: "一", 2: "二", 3: "三", 4: "四",
+	5: "五", 6: "六", 7: "七", 8: "八", 9: "九",
+}
 
-// 将数字转换为中文大写形式
 func NumToChinese(num int) string {
-	if num == 0 {
-		return chineseNums[0] // 特殊处理0
+	if num < 1 || num > 100 {
+		return ""
+	}
+
+	if num == 100 {
+		return "一百"
 	}
-	var result []string // 用于存放每位的中文表示
-	placeIndex := 0     // 用于记录当前的中文单位位置(十、百、千等)
-	for num > 0 {
-		digit := num % 10 // 获取当前最低位的数字
-		if digit != 0 {
-			result = append([]string{chineseNums[digit] + chinesePlaces[placeIndex]}, result...) // 将当前位的中文和单位加入结果列表,并反转以保持正确的顺序
-		} else if placeIndex != 0 && len(result) > 0 && result[0] != chineseNums[0] { // 如果当前位是0,且不是最右边且前面不是零,则添加“零”
-			result = append([]string{chineseNums[0]}, result...) // 在前面添加“零”
+
+	var sb strings.Builder
+
+	tens := num / 10
+	units := num % 10
+
+	// 十几的特殊情况
+	if tens == 1 {
+		if units == 0 {
+			return "十"
 		}
-		num /= 10    // 移除已处理的最低位
-		placeIndex++ // 更新中文单位的索引
+		sb.WriteString("十")
+		if units > 0 {
+			sb.WriteString(digitMap[units])
+		}
+		return sb.String()
+	}
+
+	// 二十、三十一 等
+	if tens > 1 {
+		sb.WriteString(digitMap[tens])
+		sb.WriteString("十")
 	}
-	return strings.Join(result, "") // 将结果列表合并为一个字符串并返回
+
+	if units > 0 {
+		sb.WriteString(digitMap[units])
+	}
+
+	return sb.String()
 }