阿拉伯数字转汉字算法
本文最后更新于 411 天前,其中的信息可能已经有所发展或是发生改变。

最近的项目中遇到了如下需求:

给定一个阿拉伯数字,输出对应的汉语,如:10086 -> 一万零八十六

网上查了很多,根本不靠谱,有不能过千的,有直接翻译数字的,让我也是很头疼,最后还是觉得自己写好一些。

才开始我想的是这样:给的任何一个数字,每一位都有相应的权重(姑且这么叫吧),还有的信息就是该位的值。那么,我们将所有位的值翻译成汉字,拼接对应的权,不就实现啦!如下所示:

  1. 例如给定数字为23,将其拆分为 [2, 3]
  2. 从个位开始(也就是倒序)遍历列表,然后得到:
  3. 3 对应权重为 个位,我们这里可以留个空,翻译该位得到 “三”
  4. 2 对应权重为 十位,我们这里加上汉字 “十”,翻译该位得到 “二十”
  5. 拼接以上结果,得到正确的结果 “二十三”

我们用每一位的位数对应一个权重值,每一位的值对应数字值,那么我们可以有如下的权重列表与数字列表:

weightHans = ["", "十", "百", "千", "万", "十万", "百万", "千万", "亿"]
bitsHans = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']

上面的结果是正确的,可是在做测试时,我发现我忽略了三个问题:

  • 当 (10 < 数字 < 20)时,汉语习惯于直接说 “十“ + “某”,例如:13 -> ”十三“,而不是 ”一十三“
  • 当 (数字 >= 20) && (数字 mod 10 == 0) 时,该程序得到的结果是错误的,例如:20 -> 二十十
  • 当 (数字 > 100) && (数字 mod 10 != 0) 时,该程序获得的结果也是错误的,例如:103 -> 一百十三

这该怎么办呢?

可以想想出现的问题:前面是有限情况的问题,后面是无限情况的问题。那么我们从解决特殊入手,针对第一个问题作优化:

if convertNum <= 10 : return bitsHans[convertNum]
if 10 < convertNum < 20 : return ("十" + bitsHans[convertNum - 10])

这样第一个问题就解决了。

如果你细心的话,你会发现后面这两个问题都和数字中 “0” 的翻译有关,其实基本是一个问题。

在一段时间的思考过后,我的头上冒出了金光….不对,我想到了一个解决方法:

通过在遍历字符串时加入一个判断零的标志位(初始值为 True),开始倒序遍历时,如果发现 0 ,则不做处理,continue掉,如果遍历时发现遇到非零数字,则将标志位设置为 False,在以后的遍历过程中,如果遇到零,那么将标志位设置为 True,并插入一个 “零”;因为这里一定是数字中间的 “0”,而在汉语习惯中,遇到很多 0 的情况只添加一个 “零”来表示。

如此一来程序便正确了。

以下是全部代码(Python版本):

# author : [email protected]
# numberToHans(int) : str
# 该函数用于将输入的数字转化为汉字
#
def numberToHans(convertNum):
    if not isinstance(convertNum, int):
        raise ValueError("convertNum must be int.")
    weightHans = ["", "十", "百", "千", "万", "十万", "百万", "千万", "亿"]
    bitsHans = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']
    if convertNum <= 10 : return bitsHans[convertNum]
    if 10 < convertNum < 20 : return ("十" + bitsHans[convertNum - 10])
    convertNum = str(convertNum)
    numLength = len(convertNum)
    result = []
    zeroFlag = True
    currentBit = -1
    for char in convertNum[::-1]:
        currentBit += 1
        char = int(char)
        if char == 0 and zeroFlag == True : continue
        zeroFlag = False
        rank = weightHans[currentBit]
        if char == 0:
            rank = ""
            zeroFlag = True
        number = bitsHans[char]
        result.append(number + rank)
    result = "".join(result[::-1])
    return result

另外,该程序没有考虑负数的情况,因为项目中不存在这种情况,如果有需要的朋友可以自行更改。

现在机器学习是越来越厉害了,神经网络也能干这种事,轻轻松松啊。(不懂,纯嘴炮)

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇