周末在家,写了个小程序,用于将阿拉伯数字转换化大写中文。程序没经过任何优化,出没经过详细的测试,挂到网上,方便将来有需要的时候直接拿来用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
#!/usr/bin/python
#-*- encoding: utf-8 -*-
import types
class NotIntegerError(Exception):
pass
class OutOfRangeError(Exception):
pass
_MAPPING = (u '零' , u '一' , u '二' , u '三' , u '四' , u '五' , u '六' , u '七' , u '八' , u '九' , )
_P0 = (u' ', u' 十 ', u' 百 ', u' 千', )
_S4, _S8, _S16 = 10 * * 4 , 10 * * 8 , 10 * * 16
_MIN, _MAX = 0 , 9999999999999999
def _to_chinese4(num):
'''转换[0, 10000)之间的阿拉伯数字
'''
assert ( 0 < = num and num < _S4)
if num < 10 :
return _MAPPING[num]
else :
lst = [ ]
while num > = 10 :
lst.append(num % 10 )
num = num / 10
lst.append(num)
c = len (lst) # 位数
result = u''
for idx, val in enumerate (lst):
if val ! = 0 :
result + = _P0[idx] + _MAPPING[val]
if idx < c - 1 and lst[idx + 1 ] = = 0 :
result + = u '零'
return result[:: - 1 ].replace(u '一十' , u '十' )
def _to_chinese8(num):
assert (num < _S8)
to4 = _to_chinese4
if num < _S4:
return to4(num)
else :
mod = _S4
high, low = num / mod, num % mod
if low = = 0 :
return to4(high) + u '万'
else :
if low < _S4 / 10 :
return to4(high) + u '万零' + to4(low)
else :
return to4(high) + u '万' + to4(low)
def _to_chinese16(num):
assert (num < _S16)
to8 = _to_chinese8
mod = _S8
high, low = num / mod, num % mod
if low = = 0 :
return to8(high) + u '亿'
else :
if low < _S8 / 10 :
return to8(high) + u '亿零' + to8(low)
else :
return to8(high) + u '亿' + to8(low)
def to_chinese(num):
if type (num) ! = types.IntType and type (num) ! = types.LongType:
raise NotIntegerError(u '%s is not a integer.' % num)
if num < _MIN or num > _MAX:
raise OutOfRangeError(u '%d out of range[%d, %d)' % (num, _MIN, _MAX))
if num < _S4:
return _to_chinese4(num)
elif num < _S8:
return _to_chinese8(num)
else :
return _to_chinese16(num)
if __name__ = = '__main__' :
print to_chinese( 9000 )
|