网上看了许多说法,感觉这个事情本身不复杂,不过也没许多人嘴炮说得那么简单。想法谁都有,都觉得自己能实现,不过许多人“信誓旦旦”地把这个写了之后,发现会报各种各样的错误。在此我把代码写上,附上我的想法。
1.区分各种项
1.1 转换项
这种最简单,1——一,2——二,以此类推。记住不要忘了0——零
1.2 数量级项
十——10,百——100,千——1000,记住没有万,因为万和亿很特殊,前后的级数都是数字计数法
1.3 乘积项
这些项出现的时候,前面累计求和的所有数字都要乘以该项。比如“三百三十七万”
万——10000
1.4 分隔项
这一项的设计是防止亿和万同时出现的时候,被乘了两次。
2.是正着读入还是负着读入
许多人自以为是的倒着读入,实际上是为问题新增了许多难度。
我倾向于正着读入,比如“一千三百四十八”这个数,读了1,再读数量级项“千”,就把刚刚读入的数乘以1000,然后加到总和里归零。
【注意】在正着读入的时候,要判断某一项后面没有“乘积项”【或者到达了数字末尾】,如果有,说明读到了个位,这时候不应继续读下去了,而是应直接加上该个位数。不要再等着乘以数量级项了。
代码如下:
vocabulary = {u"一":1,u"二":2,u"三":3,u"四":4,u"五":5,u"六":6,u"七":7,u"八":8,u"九":9,u"零":0}
quantity_dict = {u"十":10,u"百":100,u"千":1000}
stamp_dict = {u"万":10000,u"亿":100000000}
def liter_to_number_under_yi(a):
if not a:
return 0
sum = 0
value = 0
for num in range(len(a)):
if a[num] in vocabulary:
print
value = vocabulary[a[num]]
if num+1 >= len(a) or a[num+1] in stamp_dict:
sum += value
value = 0
elif a[num] in quantity_dict:
value = value * quantity_dict[a[num]]
sum += value
value = 0
elif a[num] in stamp_dict:
sum *= stamp_dict[a[num]]
#最后加一个判断,sum_all和sum哪个大。【汉字转数字,技巧:从左往右转,判断下一位是不是万,亿等。在万亿的时候,要记得清空】
return sum
def litertonum(a):
a_list = a.split(u"亿")
print a_list[0]
print a_list[1]
return liter_to_number_under_yi(a_list[0])*100000000+liter_to_number_under_yi(a_list[1])
a = u"一千二百五十一万零一亿一千二百五十八万零一百三十四"
litertonum(a)
代码从“亿”这个地方分隔,分隔后两边分别跑这个子函数。然后得到结果