日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python實現數字小寫轉大寫的示例詳解_python

作者:yhryhryhr- ? 更新時間: 2023-01-13 編程語言

前言

這絕對是個非常有趣的問題哈哈,但用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

欄目分類
最近更新