Python實現(xiàn)半角數(shù)字轉(zhuǎn)全角數(shù)字的完整方法
一、半角與全角數(shù)字概述
半角數(shù)字(ASCII數(shù)字)和全角數(shù)字(Unicode全角數(shù)字)是兩種不同的字符表示形式:
- 半角數(shù)字:0 1 2 3 4 5 6 7 8 9(Unicode U+0030到U+0039)
- 全角數(shù)字:0 1 2 3 4 5 6 7 8 9(Unicode U+FF10到U+FF19)
全角數(shù)字主要用于中文排版,使數(shù)字與中文字符對齊,保持視覺上的統(tǒng)一。
二、實現(xiàn)方法
方法1:基礎(chǔ)字符轉(zhuǎn)換(推薦)
def half_to_full_width_number(text):
"""
將字符串中的半角數(shù)字轉(zhuǎn)換為全角數(shù)字
參數(shù):
text: 輸入字符串
返回:
轉(zhuǎn)換后的字符串
"""
result = []
for char in text:
if '0' <= char <= '9':
# 半角數(shù)字轉(zhuǎn)全角:Unicode碼點(diǎn)+65248
full_char = chr(ord(char) + 0xFEE0)
result.append(full_char)
else:
result.append(char)
return ''.join(result)
# 測試示例
if __name__ == "__main__":
test_cases = [
"1234567890",
"電話: 13800138000",
"版本號3.14.159",
"混合123abc456",
"沒有數(shù)字的字符串"
]
print("半角數(shù)字轉(zhuǎn)全角數(shù)字測試:")
print("=" * 40)
for case in test_cases:
converted = half_to_full_width_number(case)
print(f"原始: {case}")
print(f"轉(zhuǎn)換: {converted}")
print("-" * 40)
運(yùn)行結(jié)果:
半角數(shù)字轉(zhuǎn)全角數(shù)字測試:
========================================
原始: 1234567890
轉(zhuǎn)換: 1234567890
----------------------------------------
原始: 電話: 13800138000
轉(zhuǎn)換: 電話: 13800138000
----------------------------------------
原始: 版本號3.14.159
轉(zhuǎn)換: 版本號3.14.159
----------------------------------------
原始: 混合123abc456
轉(zhuǎn)換: 混合123abc456
----------------------------------------
原始: 沒有數(shù)字的字符串
轉(zhuǎn)換: 沒有數(shù)字的字符串
----------------------------------------
方法2:使用str.translate()(更高效)
def half_to_full_width_number_fast(text):
"""
使用translate方法快速轉(zhuǎn)換
"""
# 創(chuàng)建轉(zhuǎn)換表
translation_table = str.maketrans(
'0123456789',
'0123456789'
)
return text.translate(translation_table)
# 測試
if __name__ == "__main__":
test_str = "Python 3.10發(fā)布于2021年10月"
print("快速轉(zhuǎn)換測試:")
print(f"原始: {test_str}")
print(f"轉(zhuǎn)換: {half_to_full_width_number_fast(test_str)}")
運(yùn)行結(jié)果:
快速轉(zhuǎn)換測試:
原始: Python 3.10發(fā)布于2021年10月
轉(zhuǎn)換: Python 3.10發(fā)布于2021年10月
方法3:正則表達(dá)式替換
import re
def half_to_full_width_number_regex(text):
"""
使用正則表達(dá)式替換半角數(shù)字
"""
def replace_match(match):
digit = match.group()
return chr(ord(digit) + 0xFEE0)
return re.sub(r'[0-9]', replace_match, text)
# 測試
if __name__ == "__main__":
test_str = "訂單號: 987654321, 金額: 199.99元"
print("正則表達(dá)式轉(zhuǎn)換測試:")
print(f"原始: {test_str}")
print(f"轉(zhuǎn)換: {half_to_full_width_number_regex(test_str)}")
運(yùn)行結(jié)果:
正則表達(dá)式轉(zhuǎn)換測試:
原始: 訂單號: 987654321, 金額: 199.99元
轉(zhuǎn)換: 訂單號: 987654321, 金額: 199.99元
三、性能比較
import timeit
def test_performance():
test_str = "Python 3.10發(fā)布于2021年10月,版本號1234567890" * 100
methods = [
("基礎(chǔ)方法", half_to_full_width_number),
("translate方法", half_to_full_width_number_fast),
("正則方法", half_to_full_width_number_regex)
]
print("性能測試:")
print("=" * 40)
for name, func in methods:
time = timeit.timeit(lambda: func(test_str), number=1000)
print(f"{name}: {time:.4f}秒")
if __name__ == "__main__":
test_performance()
運(yùn)行結(jié)果示例:
性能測試:
========================================
基礎(chǔ)方法: 0.8423秒
translate方法: 0.0456秒
正則方法: 1.2345秒
性能分析:
- translate()方法最快,適合處理大量文本
- 基礎(chǔ)方法次之,代碼更直觀
- 正則表達(dá)式方法最慢,但靈活性最高
四、完整工具類實現(xiàn)
class HalfFullWidthConverter:
"""
半角全角字符轉(zhuǎn)換工具類
"""
@staticmethod
def half_to_full_number(text):
"""半角數(shù)字轉(zhuǎn)全角數(shù)字"""
return text.translate(str.maketrans(
'0123456789',
'0123456789'
))
@staticmethod
def half_to_full_alpha(text):
"""半角字母轉(zhuǎn)全角字母"""
return text.translate(str.maketrans(
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
))
@staticmethod
def half_to_full(text):
"""半角數(shù)字和字母轉(zhuǎn)全角"""
return HalfFullWidthConverter.half_to_full_alpha(
HalfFullWidthConverter.half_to_full_number(text)
)
@staticmethod
def full_to_half_number(text):
"""全角數(shù)字轉(zhuǎn)半角數(shù)字"""
return text.translate(str.maketrans(
'0123456789',
'0123456789'
))
# 測試工具類
if __name__ == "__main__":
converter = HalfFullWidthConverter()
test_str = "ABCabc123測試TEST456"
print("工具類測試:")
print(f"原始: {test_str}")
print(f"數(shù)字轉(zhuǎn)全角: {converter.half_to_full_number(test_str)}")
print(f"字母轉(zhuǎn)全角: {converter.half_to_full_alpha(test_str)}")
print(f"全部轉(zhuǎn)全角: {converter.half_to_full(test_str)}")
print(f"全角數(shù)字轉(zhuǎn)半角: {converter.full_to_half_number('12345')}")
運(yùn)行結(jié)果:
工具類測試:
原始: ABCabc123測試TEST456
數(shù)字轉(zhuǎn)全角: ABCabc123測試TEST456
字母轉(zhuǎn)全角: ABCabc123測試TEST456
全部轉(zhuǎn)全角: ABCabc123測試TEST456
全角數(shù)字轉(zhuǎn)半角: 12345
五、實際應(yīng)用場景
中文排版處理:
text = "本文發(fā)布于2023年5月1日,閱讀量已達(dá)10000+" full_text = HalfFullWidthConverter.half_to_full(text) print(full_text) # 輸出: 本文發(fā)布于2023年5月1日,閱讀量已達(dá)10000+
數(shù)據(jù)清洗:
def clean_phone_number(phone):
"""清洗電話號碼,確保所有數(shù)字為半角"""
return HalfFullWidthConverter.full_to_half_number(phone).replace(" ", "")
phone = "138?。埃埃保场。福埃埃?
print(clean_phone_number(phone)) # 輸出: 13800138000
驗證碼生成:
import random
def generate_verification_code(length=6):
"""生成全角數(shù)字驗證碼"""
code = ''.join(random.choices('0123456789', k=length))
return HalfFullWidthConverter.half_to_full_number(code)
print("驗證碼:", generate_verification_code()) # 輸出類似: 驗證碼: 789456
六、注意事項
非數(shù)字字符:轉(zhuǎn)換函數(shù)會保留所有非數(shù)字字符不變
性能考慮:處理大量文本時推薦使用translate()方法
反向轉(zhuǎn)換:可以使用chr(ord(char) - 0xFEE0)將全角轉(zhuǎn)回半角
擴(kuò)展性:工具類可以方便地擴(kuò)展支持更多字符類型的轉(zhuǎn)換
七、總結(jié)
本教程介紹了三種Python實現(xiàn)半角數(shù)字轉(zhuǎn)全角數(shù)字的方法:
- 基礎(chǔ)字符遍歷轉(zhuǎn)換 - 直觀易懂
- translate()方法 - 性能最佳
- 正則表達(dá)式方法 - 靈活但性能較低
還提供了完整的工具類實現(xiàn),可以方便地進(jìn)行半角/全角數(shù)字、字母的相互轉(zhuǎn)換。根據(jù)實際需求選擇合適的方法,在性能要求高的場景使用translate(),需要靈活處理時使用正則表達(dá)式,教學(xué)演示則適合基礎(chǔ)方法。
所有代碼都附帶了完整的測試用例和運(yùn)行結(jié)果,方便讀者理解和驗證。
到此這篇關(guān)于Python實現(xiàn)半角數(shù)字轉(zhuǎn)全角數(shù)字的完整方法的文章就介紹到這了,更多相關(guān)Python半角數(shù)字轉(zhuǎn)全角數(shù)字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3 使用函數(shù)求兩個數(shù)的和與差
這篇文章主要介紹了python3 使用函數(shù)求兩個數(shù)的和與差,具有很好的參考價值,希望對大家有所幫助。2021-05-05
如何基于Python代碼實現(xiàn)高精度免費(fèi)OCR工具
這篇文章主要介紹了如何基于Python代碼實現(xiàn)高精度免費(fèi)OCR工具,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
Python使用enumerate獲取迭代元素下標(biāo)
這篇文章主要介紹了python使用enumerate獲取迭代元素下標(biāo),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
Python通過TensorFLow進(jìn)行線性模型訓(xùn)練原理與實現(xiàn)方法詳解
這篇文章主要介紹了Python通過TensorFLow進(jìn)行線性模型訓(xùn)練原理與實現(xiàn)方法,結(jié)合實例形式詳細(xì)分析了Python通過TensorFLow進(jìn)行線性模型訓(xùn)練相關(guān)概念、算法設(shè)計與訓(xùn)練操作技巧,需要的朋友可以參考下2020-01-01

