|
@@ -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()
|
|
|
}
|