網站首頁 編程語言 正文
前言
這絕對是個非常有趣的問題哈哈,但用python列表實現就變得比較燒腦,正常人不會非常較真這樣的程序,我也只是閑來無事,如果代碼還是有bug,那么我也沒辦法。
注:經過廣泛搜索和仔細深究,似乎沒有幾套開源代碼能100%滿足要求
參考標準:大小寫轉換器_人民幣大寫在線轉換工具
代碼實現
首先將一個數字根據小數點,進行分割。建立字典和數據集(left_chinese, right_chinese),這里left_chinese不加元,是因為后面可以統一處理,避免庸人自擾。
def Digital_to_Chinese(digital):
if not isinstance(digital, str): # 首先將內容轉換為浮點數
str_digital = str(digital)
else:
str_digital = digital
print("小寫數字", digital)
chinese = {'1': '壹', '2': '貳', '3': '叁',
'4': '肆', '5': '伍', '6': '陸',
'7': '柒', '8': '捌', '9': '玖', '0': '零'}
left_chinese = ['', '拾', '佰', '仟', '萬'] # 小數點左邊
right_chinese = ["角", "分"] # 小數點右邊
left_Str, right_Str = "", "" # 根據小數點將浮點數分成整數小數兩部分
if '.' in str_digital:
left_Str, right_Str = str_digital.split('.')
else:
left_Str = str_digital # 沒有的話就直接都是整數部分
leftStrArr = [] # 處理整數部分
將左邊數字從高位向低位讀取,再翻轉——即從低向高。之后,把每個數字對應的權重附在數字后面(empty, 拾, 佰, 仟, 萬),同樣的思路也適用于右半塊數字。
if left_Str:
leftStrArr = [chinese[v] for v in left_Str] # 使用列表推導式獲取大寫中文列表
leftStrArr.reverse() # 由于數字是從前到后讀,所以從低位向高位轉換需要倒置列表
for i in range(0, len(leftStrArr)):
if leftStrArr[i] != "零": # 只要這一位不是0,就在后面賦值他對應的權重,如果為0則i自增1將其略過
leftStrArr[i] += left_chinese[i]
leftStrArr.reverse()
rightStrArr = [] # 處理小數部分
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] # 和前面一樣的道理
之后,我們需要進行二次處理,首先剛剛那樣的算法會多輸出0,比如 2001 會被寫成 兩仟零零壹,針對這個問題我們可以直接去重處理,這里注意,101是不會被去除的,因為那是[壹佰,零,壹],所以不會被去重。
但這并不完美,因為還會有這樣的問題:10 會被寫成 壹拾零,解決方法是判斷末尾字符是否為零,是則刪去不是則跳過。
此外,由于正常的計費只到“分”,所以右半部分正常情況下不需要過多的處理,因此代碼就寫完了。
leftStrArr_temp = []
for xleft in leftStrArr:
if xleft not in leftStrArr_temp: # 去重,防止出現 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) # 將列表合并成一個字符串,作為結果返回
測試
# 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("結果", Digital_to_Chinese(test), "\n------\n")
這個測試應該沒有問題,整數部分的高位可以直接加在列表中,低位部分各位可以自行完善。結果如下:
小寫數字 | 左串 | 右串 | 結果 |
1 | 壹 | 空 | 壹元? |
1.1 | 壹 | 壹角 | 壹元壹角 |
11.01 | 壹拾壹 | 零壹分 | 壹拾壹元零壹分 |
10.1 | 壹拾 | 壹角 | 壹拾元壹角? |
10.01 | 壹拾 | 零壹分 | 壹拾元零壹分? |
101.01 | 壹佰零壹 | 零壹分 | 壹佰零壹元零壹分 |
2300.02 | 貳仟叁佰 | 零貳分 | 貳仟叁佰元零貳分 |
34004.09 | 叁萬肆仟零肆 | 零玖分 | 叁萬肆仟零肆元零玖分 |
補充
除了上面的方法,小編也為大家整理了一些其他簡單的方法,需要的可以參考一下
小寫數字轉為大寫
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(" ") # 可擴展,以萬為單位
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]
# 去除連續的零
while "零零" in result:
result = result.replace("零零", "零")
# 去除尾部的零
if result[-1] == "零":
result = result[:-1]
# 調整10~20之間的數
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
阿拉伯數字的大小寫轉換
# 數據源
Upper0 = "零、壹、貳、叁、肆、伍、陸、柒、捌、玖"
Upper1 = Upper0.split('、')
# 封裝函數
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("數字間用英文逗號間隔,輸入結束后,按回車結束"))
print("{0:-^80}".format("若為單個數字,請以英文逗號隔開哦"))
Input0 = eval(input("請輸入你需要轉換的任意小寫數字:"))
print()
print()
print(f'小寫數字 {Input0} 對應的中文大寫數字為: {[list(info[number].values()) for number in Input0]}')
print()
零,壹,貳,叁,肆,伍,陸,柒,捌,玖 = [i for i in range(10)]
print("{0:-^63}".format("大寫數字間用英文逗號間隔,輸入結束后,為方便您查詢,請按回車結束鴨~"))
print("{0:-^80}".format("若為單個漢字,請以英文逗號隔開哦"))
print(f'提示:{"零、壹、貳、叁、肆、伍、陸、柒、捌、玖 (復制任意大寫數字或手動輸入)".replace("、",",")}')
Input1 = eval(input("請輸入你需要轉換的任意中文大寫數字:"))
Upper_list = [零,壹,貳,叁,肆,伍,陸,柒,捌,玖]
print()
print()
print(f'大寫數字 {[list(info[number].values()) for number in Input1]} 對應的小寫數字為: {Input1}')
print()
print("{0:-^86}".format("歡迎您下次使用,再見~"))
原文鏈接:https://blog.csdn.net/qq_52504945/article/details/128307333
相關推薦
- 2022-08-12 Python3.8安裝tensorflow的簡單方法步驟_python
- 2022-12-06 R語言如何畫豎線、橫線、添加標簽以及畫固定長度的線段_R語言
- 2022-06-16 ASP.NET?Core?6.0?添加?JWT?認證和授權功能_實用技巧
- 2022-06-09 使用FreeRTOS遇到死等異常的解決_操作系統
- 2022-07-13 RedisDesktopManager遠程連接redis的實現_Redis
- 2024-03-04 css鼠標移動上去才顯示滾動條
- 2022-07-16 typescript封裝websocket,監測心跳,斷開重連
- 2022-11-02 Go?語言簡單實現Vigenere加密算法_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支