利用Python将阿拉伯数字转化为中文大写,其实最麻烦的地方就是中间空多个0的问题,这种情况下,采用拆分法则,将一个大数字,先拆分成整数部分和小数部分,再对整数部分按照仟、万、亿、兆分位拆分为四个字符串组成的List,每个字符串最多4个字符,然后对每个分位的字符串用大写函数转换成大写,最后合并,这样等于缩减了问题,处理就相对简单了。
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
85
86
87
88
89
90
91
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
#算法说明:要求字符串输入,现将字符串差费为整数部分和小数部分生成list[整数部分,小数部分]
#将整数部分拆分为:[亿,万,仟]三组字符串组成的List:['0000','0000','0000'](根据实际输入生成阶梯List)
#例如:600190000010.70整数部分拆分为:['600','1900','0010']
#然后对list中每个字符串分组进行大写化再合并
#最后处理小数部分的大写化
'''
class
cnumber:
cdict
=
{}
gdict
=
{}
xdict
=
{}
def
__init__(
self
):
self
.cdict
=
{
1
:u'
',2:u'
拾
',3:u'
佰
',4:u'
仟'}
self
.xdict
=
{
1
:u
'元'
,
2
:u
'万'
,
3
:u
'亿'
,
4
:u
'兆'
}
#数字标识符
self
.gdict
=
{
0
:u
'零'
,
1
:u
'壹'
,
2
:u
'贰'
,
3
:u
'叁'
,
4
:u
'肆'
,
5
:u
'伍'
,
6
:u
'陆'
,
7
:u
'柒'
,
8
:u
'捌'
,
9
:u
'玖'
}
def
csplit(
self
,cdata):
#拆分函数,将整数字符串拆分成[亿,万,仟]的list
g
=
len
(cdata)
%
4
csdata
=
[]
lx
=
len
(cdata)
-
1
if
g>
0
:
csdata.append(cdata[
0
:g])
k
=
g
while
k<
=
lx:
csdata.append(cdata[k:k
+
4
])
k
+
=
4
return
csdata
def
cschange(
self
,cki):
#对[亿,万,仟]的list中每个字符串分组进行大写化再合并
lenki
=
len
(cki)
i
=
0
lk
=
lenki
chk
=
u''
for
i
in
range
(lenki):
if
int
(cki[i])
=
=
0
:
if
i<lenki
-
1
:
if
int
(cki[i
+
1
])!
=
0
:
chk
=
chk
+
self
.gdict[
int
(cki[i])]
else
:
chk
=
chk
+
self
.gdict[
int
(cki[i])]
+
self
.cdict[lk]
lk
-
=
1
return
chk
def
cwchange(
self
,data):
cdata
=
str
(data).split(
'.'
)
cki
=
cdata[
0
]
if
len
(cdata)
=
=
1
:
i
=
0
chk
=
u''
cski
=
self
.csplit(cki)
#分解字符数组[亿,万,仟]三组List:['0000','0000','0000']
ikl
=
len
(cski)
#获取拆分后的List长度
#大写合并
for
i
in
range
(ikl):
if
self
.cschange(cski[i])
=
=
'':
#有可能一个字符串全是0的情况
chk
=
chk
+
self
.cschange(cski[i])
#此时不需要将数字标识符引入
else
:
chk
=
chk
+
self
.cschange(cski[i])
+
self
.xdict[ikl
-
i]
#合并:前字符串大写+当前字符串大写+标识符
chk
=
chk
+
u
'整'
else
:
i
=
0
chk
=
u''
cski
=
self
.csplit(cki)
#分解字符数组[亿,万,仟]三组List:['0000','0000','0000']
ikl
=
len
(cski)
#获取拆分后的List长度
#大写合并
for
i
in
range
(ikl):
if
self
.cschange(cski[i])
=
=
'':
#有可能一个字符串全是0的情况
chk
=
chk
+
self
.cschange(cski[i])
#此时不需要将数字标识符引入
else
:
chk
=
chk
+
self
.cschange(cski[i])
+
self
.xdict[ikl
-
i]
#合并:前字符串大写+当前字符串大写+标识符
#处理小数部分
ckj
=
cdata[
1
]
lenkj
=
len
(ckj)
if
lenkj
=
=
1
:
#若小数只有1位
if
int
(ckj[
0
])
=
=
0
:
chk
=
chk
+
u
'整'
else
:
chk
=
chk
+
self
.gdict[
int
(ckj[
0
])]
+
u
'角整'
else
:
#若小数有两位的四种情况
if
int
(ckj[
0
])
=
=
0
and
int
(ckj[
1
])!
=
0
:
chk
=
chk
+
u
'零'
+
self
.gdict[
int
(ckj[
1
])]
+
u
'分'
elif
int
(ckj[
0
])
=
=
0
and
int
(ckj[
1
])
=
=
0
:
chk
=
chk
+
u
'整'
elif
int
(ckj[
0
])!
=
0
and
int
(ckj[
1
])!
=
0
:
chk
=
chk
+
self
.gdict[
int
(ckj[
0
])]
+
u
'角'
+
self
.gdict[
int
(ckj[
1
])]
+
u
'分'
else
:
chk
=
chk
+
self
.gdict[
int
(ckj[
0
])]
+
u
'角整'
return
chk
if
__name__
=
=
'__main__'
:
pt
=
cnumber()
print
pt.cwchange(
'123410505632.09'
).encode(
'utf-8'
)
|
本文参照网上的一些写法做了一些改动,使用起来更加严谨。
本文转自 lover00751CTO博客,原文链接:http://blog.51cto.com/wangwei007/1223368,如需转载请自行联系原作者