昨天用到一個(gè)處理細(xì)節(jié),需要把阿拉伯?dāng)?shù)字轉(zhuǎn)成中文漢字,本想網(wǎng)上肯定有現(xiàn)成的 ctrl c ctrl v的代碼,結(jié)果搜了會(huì)都寫(xiě)的太復(fù)雜了,不理解這么簡(jiǎn)單的事為什么把代碼搞得那么復(fù)雜,結(jié)果測(cè)試了網(wǎng)上教程代碼還不對(duì)...
簡(jiǎn)單思路
就是數(shù)字的長(zhǎng)度 去對(duì)'單位'個(gè)十百千萬(wàn)
長(zhǎng)度1 就對(duì) 個(gè)
長(zhǎng)度2 就對(duì) 十
長(zhǎng)度3 就對(duì) 百
... ...
特殊處理下 :
- 一位長(zhǎng)度時(shí),0 直接返回0,1-9直接返回
- 中間多個(gè)零的,只保留一個(gè)
- 末位是零的去掉末位零
其實(shí)就2個(gè)特殊,中間多零,末位抹零
按平時(shí)說(shuō)話習(xí)慣, 10(一十)到19(一十九) 我們會(huì)把前面的'一'去掉(看喜好注釋吧)
上代碼
package main
import (
"errors"
"fmt"
"strconv"
"strings"
)
/**
關(guān)于中文單位 千億后表示有疑議 有 萬(wàn)億 有 兆
個(gè),十,百,千,萬(wàn),十萬(wàn),百萬(wàn),千萬(wàn),億,十億,百億,千億,萬(wàn)億,十萬(wàn)億,百萬(wàn)億,千萬(wàn)億,億億……
個(gè),十,百,千,萬(wàn),十萬(wàn),百萬(wàn),千萬(wàn),億,十億,百億,千億,兆, 十兆, 百兆, 千兆, 京
*/
// 單位對(duì)照數(shù)組,第一位的"個(gè)"就不要顯示了
var unitList = []string{"", "十", "百", "千", "萬(wàn)", "十萬(wàn)", "百萬(wàn)", "千萬(wàn)", "億", "十億", "百億", "千億", "萬(wàn)億", "十萬(wàn)億", "百萬(wàn)億", "千萬(wàn)億", "億億"}
// 數(shù)字映射字典
var numMap = map[int]string{
0: "零",
1: "一",
2: "二",
3: "三",
4: "四",
5: "五",
6: "六",
7: "七",
8: "八",
9: "九",
}
func NumberToChinese(num int) (string, error) {
if num == 0 {
return numMap[num], nil
}
numStr := strconv.Itoa(num)
pre := ""
resule := ""
if num < 0 { // 如果是負(fù)數(shù),記錄一下,并去掉負(fù)號(hào)
pre = "負(fù)"
numStr = numStr[1:]
num, _ = strconv.Atoi(numStr)
}
length := len(numStr)
if length == 1 {
resule = pre + numMap[num]
return resule, nil
}
if length > len(unitList) {
return "", errors.New("超出轉(zhuǎn)換范圍")
}
beforeIsZero := false
for i, digit := range numStr {
x, _ := strconv.Atoi(string(digit))
num := numMap[x] // 該位的數(shù)字
unit := unitList[length-i-1] // 該位的單位
if beforeIsZero && num == "零" { // 前面一位是零,當(dāng)前位也是零,則不需要重復(fù)添加
continue
}
beforeIsZero = (num == "零")
if num == "零" {
if i == length-1 { // 如果是零,并且是最后一位
continue
}
resule = resule + num
} else {
resule = resule + num + unit
}
}
// 最后一位是零,則去掉零
if strings.HasSuffix(resule, "零") {
resule = resule[:len(resule)-len("零")]
}
// 如果是一十開(kāi)頭,則去掉一
if strings.HasPrefix(resule, "一十") {
resule = resule[len("一"):]
}
resule = pre + resule
return resule, nil
}
func main() {
testNumbers := []int{
0, 8, 10, 19, 80, 100, 1000, 10000, 1001, 10100, 100020010, -8, -10, -19, -80, -100, -1000, -10000, -1001, -10100, -100020010,
}
for _, number := range testNumbers {
result, err := NumberToChinese(number)
if err != nil {
fmt.Printf("error: %v\n", err)
} else {
fmt.Printf("%d=%s \n", number, result)
}
}
}
測(cè)試輸出結(jié)果
0=零
8=八
10=十
19=十九
80=八十
100=一百
1000=一千
10000=一萬(wàn)
1001=一千零一
10100=一萬(wàn)零一百
100020010=一億零二萬(wàn)零一十
-8=負(fù)八
-10=負(fù)十
-19=負(fù)十九
-80=負(fù)八十
-100=負(fù)一百
-1000=負(fù)一千
-10000=負(fù)一萬(wàn)
-1001=負(fù)一千零一
-10100=負(fù)一萬(wàn)零一百
-100020010=負(fù)一億零二萬(wàn)零一十