題目
python練習的一個小實驗, 題目如下圖:
附阿拉伯數字對應的中文大寫:
思路
1. 通過定義一個字典進行阿拉伯數字與大寫中文的對比儲存
2. 將用戶的輸入首先分割爲整數與小數部分分別進行處理
3. 整數部分可以分割爲以 4 位數字爲一組的列表來進行轉換處理,這樣便於進行
(兆,億,萬,圓)。的單位處理
4. 首先將分割的 4 位數字一組的數據進行轉化處理,便於對 (拾,佰,仟)的單
位進行處理(此部分應編寫到一個函數之中,接受的參數爲 4 位數的字符串,
返回轉化好的字符串)
5. 整數部分可以看做多個 4 位數字一組的數據處理,通過遍歷列表進行轉化處理
(例如你已將 123456789 分割好爲[‘1’,’2345’,’6789’],循環遍歷這個列表, 用第
四點提到的函數進行轉化,遍歷轉化時把【兆,億,萬,圓】的單位標識添加)
6. 通過這種方式進行轉化你需要定義兩個列表分別儲存(兆,億,萬,圓)和
(拾,佰,仟)這些單位標識
7. 小數部分的處理通過分支判斷情況進行轉化即可。
代碼
思路清晰了, 代碼直接碼上即可, 注意處理特殊條件和邊界:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : num_to_chinese.py
# @Author: meta
# @Contact : [email protected]
# @Date : 20-3-28下午9:48
# @Desc : 阿拉伯數字代表的金額, 轉換爲大寫數字
limit_len1 = 16 # 不超過一萬兆
limit_len2 = 2 # 小數位不超過兩位
dictionary = {
'0': '零',
'1': '壹',
'2': '貳',
'3': '叄',
'4': '肆',
'5': '伍',
'6': '陸',
'7': '柒',
'8': '捌',
'9': '玖'
}
level1 = {
1: '圓',
2: '萬',
3: '億',
4: '兆'
}
level2 = {
2: '拾',
3: '佰',
4: '仟'
}
level3 = {
1: '角',
2: '分'
}
def query():
while 1:
ans = str(input('請輸入不超過一萬兆的金額, 小數位不超過兩位: '))
if len(ans.split('.')[0]) <= limit_len1 \
and len(ans.split('.')[1]) <= limit_len2:
return ans
def process_integer(num_integer):
pre = []
length = len(num_integer)
if length <= 4:
pre.append(num_integer)
else:
extra = length % 4
if extra != 0:
pre.append(num_integer[0: extra])
length = length - extra
start, end = extra, 4 + extra
else:
start, end = 0, 4
while length:
pre.append(num_integer[start: end])
start += 4
end += 4
length -= 4
return pre
def per_conver(num):
length = len(num)
flag = True
# Special
# deal with '0000'
if num == '0000':
return ''
# deal with '1000'
if num[1:] == '000':
return dictionary[num[0]] + level2[4]
# Normal
res, p = '', length
for i in range(0, length):
# deal with prefix is '0'
if (res == '' or res == dictionary[num[i]]) and num[i] == '0':
# only one '0'
if flag:
res += dictionary[num[i]]
flag = False
p -= 1
continue
# deal with '1001'
if i + 1 < length and num[i + 1] == '0' and num[i] == '0':
p -= 1
continue
# deal with '1010' '1110'
if i == length - 1 and num[i] == '0':
continue
res += dictionary[num[i]]
if p > 1 and num[i] != '0':
res += level2[p]
p -= 1
return res
def convert_integer(ans_int):
res = ''
p = len(ans_int)
for i in ans_int:
per_res = per_conver(i)
res += per_res
if p > 0 and per_res != '':
res += level1[p]
p -= 1
return res
def convert_float(num_float):
res = ''
for i in range(0, len(num_float)):
res += dictionary[num_float[i]]
if (i + 1) <= 2:
res += level3[i + 1]
return res
def convert():
number = query()
res = ''
if '.' in number:
num_split = number.split('.')
num_integer = num_split[0]
num_float = num_split[1]
ans_int = process_integer(num_integer)
print(ans_int)
# Convert integer
res += convert_integer(ans_int)
# Convert float
res += convert_float(num_float)
else:
ans_int = process_integer(number)
res += convert_integer(ans_int)
res += '整'
print(res)
if __name__ == '__main__':
convert()
爲了校驗正確性, 附上數字金額轉中文大寫金額的在線工具: https://szjrzzwdxje.51240.com/