go 阿拉伯?dāng)?shù)字 轉(zhuǎn) 中文漢字(123轉(zhuǎn)一百二十三)

昨天用到一個(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)零一十

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末股缸,一起剝皮案震驚了整個(gè)濱河市毙死,隨后出現(xiàn)的幾起案子烂瘫,更是在濱河造成了極大的恐慌,老刑警劉巖趁尼,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異划咐,居然都是意外死亡熟史,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)类垦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狈邑,“玉大人,你說(shuō)我怎么就攤上這事蚤认∶灼唬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵砰琢,是天一觀的道長(zhǎng)蘸嘶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)氯析,這世上最難降的妖魔是什么亏较? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮掩缓,結(jié)果婚禮上雪情,老公的妹妹穿的比我還像新娘。我一直安慰自己你辣,他們只是感情好巡通,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布尘执。 她就那樣靜靜地躺著,像睡著了一般宴凉。 火紅的嫁衣襯著肌膚如雪誊锭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天弥锄,我揣著相機(jī)與錄音丧靡,去河邊找鬼。 笑死籽暇,一個(gè)胖子當(dāng)著我的面吹牛温治,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戒悠,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼熬荆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绸狐?” 一聲冷哼從身側(cè)響起卤恳,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寒矿,沒(méi)想到半個(gè)月后突琳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡符相,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年本今,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片主巍。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挪凑,靈堂內(nèi)的尸體忽然破棺而出孕索,到底是詐尸還是另有隱情,我是刑警寧澤躏碳,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布搞旭,位于F島的核電站,受9級(jí)特大地震影響菇绵,放射性物質(zhì)發(fā)生泄漏肄渗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一咬最、第九天 我趴在偏房一處隱蔽的房頂上張望翎嫡。 院中可真熱鬧,春花似錦永乌、人聲如沸惑申。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)圈驼。三九已至人芽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绩脆,已是汗流浹背萤厅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留靴迫,地道東北人惕味。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矢劲,于是被迫代替她去往敵國(guó)和親赦拘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容