Python實(shí)現(xiàn)數(shù)字小寫轉(zhuǎn)大寫的示例詳解
前言
這絕對是個非常有趣的問題哈哈,但用python列表實(shí)現(xiàn)就變得比較燒腦,正常人不會非常較真這樣的程序,我也只是閑來無事,如果代碼還是有bug,那么我也沒辦法。
注:經(jīng)過廣泛搜索和仔細(xì)深究,似乎沒有幾套開源代碼能100%滿足要求
參考標(biāo)準(zhǔn):大小寫轉(zhuǎn)換器_人民幣大寫在線轉(zhuǎn)換工具
代碼實(shí)現(xiàn)
首先將一個數(shù)字根據(jù)小數(shù)點(diǎn),進(jìn)行分割。建立字典和數(shù)據(jù)集(left_chinese, right_chinese),這里left_chinese不加元,是因為后面可以統(tǒng)一處理,避免庸人自擾。
def Digital_to_Chinese(digital):
if not isinstance(digital, str): # 首先將內(nèi)容轉(zhuǎn)換為浮點(diǎn)數(shù)
str_digital = str(digital)
else:
str_digital = digital
print("小寫數(shù)字", digital)
chinese = {'1': '壹', '2': '貳', '3': '叁',
'4': '肆', '5': '伍', '6': '陸',
'7': '柒', '8': '捌', '9': '玖', '0': '零'}
left_chinese = ['', '拾', '佰', '仟', '萬'] # 小數(shù)點(diǎn)左邊
right_chinese = ["角", "分"] # 小數(shù)點(diǎn)右邊
left_Str, right_Str = "", "" # 根據(jù)小數(shù)點(diǎn)將浮點(diǎn)數(shù)分成整數(shù)小數(shù)兩部分
if '.' in str_digital:
left_Str, right_Str = str_digital.split('.')
else:
left_Str = str_digital # 沒有的話就直接都是整數(shù)部分
leftStrArr = [] # 處理整數(shù)部分
將左邊數(shù)字從高位向低位讀取,再翻轉(zhuǎn)——即從低向高。之后,把每個數(shù)字對應(yīng)的權(quán)重附在數(shù)字后面(empty, 拾, 佰, 仟, 萬),同樣的思路也適用于右半塊數(shù)字。
if left_Str:
leftStrArr = [chinese[v] for v in left_Str] # 使用列表推導(dǎo)式獲取大寫中文列表
leftStrArr.reverse() # 由于數(shù)字是從前到后讀,所以從低位向高位轉(zhuǎn)換需要倒置列表
for i in range(0, len(leftStrArr)):
if leftStrArr[i] != "零": # 只要這一位不是0,就在后面賦值他對應(yīng)的權(quán)重,如果為0則i自增1將其略過
leftStrArr[i] += left_chinese[i]
leftStrArr.reverse()
rightStrArr = [] # 處理小數(shù)部分
if right_Str:
rightStrArr = [chinese[v] for v in right_Str]
for i in range(0, len(rightStrArr)):
if rightStrArr[i] != "零":
rightStrArr[i] += right_chinese[i] # 和前面一樣的道理
之后,我們需要進(jìn)行二次處理,首先剛剛那樣的算法會多輸出0,比如 2001 會被寫成 兩仟零零壹,針對這個問題我們可以直接去重處理,這里注意,101是不會被去除的,因為那是[壹佰,零,壹],所以不會被去重。
但這并不完美,因為還會有這樣的問題:10 會被寫成 壹拾零,解決方法是判斷末尾字符是否為零,是則刪去不是則跳過。
此外,由于正常的計費(fèi)只到“分”,所以右半部分正常情況下不需要過多的處理,因此代碼就寫完了。
leftStrArr_temp = []
for xleft in leftStrArr:
if xleft not in leftStrArr_temp: # 去重,防止出現(xiàn) xx零零xx
leftStrArr_temp.append(xleft)
leftStrArr_temp.reverse()
for temp in leftStrArr_temp: # 去掉末尾的零
if temp == "零":
leftStrArr_temp.remove(temp)
else:
break
leftStrArr_temp.reverse()
print("------\n左", ''.join(leftStrArr_temp))
rightStrArr_temp = []
for xright in rightStrArr:
if xright not in rightStrArr_temp:
rightStrArr_temp.append(xright)
print("右", ''.join(rightStrArr_temp))
return ''.join(leftStrArr_temp) + "元" + ''.join(rightStrArr_temp) # 將列表合并成一個字符串,作為結(jié)果返回
測試
# test = input("請輸入測試用例:")
test_list = [1, 1.1, 11.01, 10.10, 10.01, 101.01, 2300.02, 34004.09]
for test in test_list:
print("結(jié)果", Digital_to_Chinese(test), "\n------\n")
這個測試應(yīng)該沒有問題,整數(shù)部分的高位可以直接加在列表中,低位部分各位可以自行完善。結(jié)果如下:
| 小寫數(shù)字 | 左串 | 右串 | 結(jié)果 |
| 1 | 壹 | 空 | 壹元 |
| 1.1 | 壹 | 壹角 | 壹元壹角 |
| 11.01 | 壹拾壹 | 零壹分 | 壹拾壹元零壹分 |
| 10.1 | 壹拾 | 壹角 | 壹拾元壹角 |
| 10.01 | 壹拾 | 零壹分 | 壹拾元零壹分 |
| 101.01 | 壹佰零壹 | 零壹分 | 壹佰零壹元零壹分 |
| 2300.02 | 貳仟叁佰 | 零貳分 | 貳仟叁佰元零貳分 |
| 34004.09 | 叁萬肆仟零肆 | 零玖分 | 叁萬肆仟零肆元零玖分 |
補(bǔ)充
除了上面的方法,小編也為大家整理了一些其他簡單的方法,需要的可以參考一下
小寫數(shù)字轉(zhuǎn)為大寫
def lowertoupper(number, recursive_depth=0):
str_number = str(number)
if len(str_number) > 4:
str_number = str_number[-4:]
bits = "零 一 二 三 四 五 六 七 八 九".split(" ")
units = " 十 百 千".split(" ")
large_unit = ' 萬 億 萬'.split(" ") # 可擴(kuò)展,以萬為單位
number_len = len(str_number)
result = ""
for i in range(number_len):
result += bits[int(str_number[i])]
if str_number[i] != "0":
result += units[number_len - i - 1]
# 去除連續(xù)的零
while "零零" in result:
result = result.replace("零零", "零")
# 去除尾部的零
if result[-1] == "零":
result = result[:-1]
# 調(diào)整10~20之間的數(shù)
if result[:2] == "一十":
result = result[1:]
# 字符串連接上大單位
result += large_unit[recursive_depth]
# 判斷是否遞歸
if len(str(number)) > 4:
recursive_depth += 1
return lowertoupper(str(number)[:-4], recursive_depth) + result
else:
return result阿拉伯?dāng)?shù)字的大小寫轉(zhuǎn)換
# 數(shù)據(jù)源
Upper0 = "零、壹、貳、叁、肆、伍、陸、柒、捌、玖"
Upper1 = Upper0.split('、')
# 封裝函數(shù)
num_list = []
for number in range(10):
num_list.append(number)
def Swap_func(lower,upper):
swap = {}
swap[lower] = upper
return swap
m = map(Swap_func, num_list, Upper1)
info = list(m)
# [{0: '零'}, {1: '壹'}, {2: '貳'}, {3: '叁'}, {4: '肆'}, {5: '伍'}, {6: '陸'}, {7: '柒'}, {8: '捌'}, {9: '玖'}]
print("{0:-^74}".format("數(shù)字間用英文逗號間隔,輸入結(jié)束后,按回車結(jié)束"))
print("{0:-^80}".format("若為單個數(shù)字,請以英文逗號隔開哦"))
Input0 = eval(input("請輸入你需要轉(zhuǎn)換的任意小寫數(shù)字:"))
print()
print()
print(f'小寫數(shù)字 {Input0} 對應(yīng)的中文大寫數(shù)字為: {[list(info[number].values()) for number in Input0]}')
print()
零,壹,貳,叁,肆,伍,陸,柒,捌,玖 = [i for i in range(10)]
print("{0:-^63}".format("大寫數(shù)字間用英文逗號間隔,輸入結(jié)束后,為方便您查詢,請按回車結(jié)束鴨~"))
print("{0:-^80}".format("若為單個漢字,請以英文逗號隔開哦"))
print(f'提示:{"零、壹、貳、叁、肆、伍、陸、柒、捌、玖 (復(fù)制任意大寫數(shù)字或手動輸入)".replace("、",",")}')
Input1 = eval(input("請輸入你需要轉(zhuǎn)換的任意中文大寫數(shù)字:"))
Upper_list = [零,壹,貳,叁,肆,伍,陸,柒,捌,玖]
print()
print()
print(f'大寫數(shù)字 {[list(info[number].values()) for number in Input1]} 對應(yīng)的小寫數(shù)字為: {Input1}')
print()
print("{0:-^86}".format("歡迎您下次使用,再見~"))
到此這篇關(guān)于Python實(shí)現(xiàn)數(shù)字小寫轉(zhuǎn)大寫的示例詳解的文章就介紹到這了,更多相關(guān)Python數(shù)字小寫轉(zhuǎn)大寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)將doc轉(zhuǎn)化pdf格式文檔的方法
這篇文章主要介紹了Python實(shí)現(xiàn)將doc轉(zhuǎn)化pdf格式文檔的方法,結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)doc格式文件讀取及轉(zhuǎn)換pdf格式文件的操作技巧,以及php調(diào)用py文件的具體實(shí)現(xiàn)方法,需要的朋友可以參考下2018-01-01
基于python實(shí)現(xiàn)判斷字符串是否數(shù)字算法
這篇文章主要介紹了基于python實(shí)現(xiàn)判斷字符串是否數(shù)字算法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
用python介紹4種常用的單鏈表翻轉(zhuǎn)的方法小結(jié)
這篇文章主要介紹了用python介紹4種常用的單鏈表翻轉(zhuǎn)的方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
python fabric實(shí)現(xiàn)遠(yuǎn)程部署
這篇文章主要為大家詳細(xì)介紹了 python fabric實(shí)現(xiàn)遠(yuǎn)程部署,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01
Mac上Python使用ffmpeg完美解決方案(避坑必看!)
ffmpeg是一個強(qiáng)大的開源命令行多媒體處理工具,下面這篇文章主要給大家介紹了關(guān)于Mac上Python使用ffmpeg完美解決方案的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02

