Python實現(xiàn)半角數(shù)字轉全角數(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:基礎字符轉換(推薦)
def half_to_full_width_number(text):
"""
將字符串中的半角數(shù)字轉換為全角數(shù)字
參數(shù):
text: 輸入字符串
返回:
轉換后的字符串
"""
result = []
for char in text:
if '0' <= char <= '9':
# 半角數(shù)字轉全角:Unicode碼點+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ù)字轉全角數(shù)字測試:")
print("=" * 40)
for case in test_cases:
converted = half_to_full_width_number(case)
print(f"原始: {case}")
print(f"轉換: {converted}")
print("-" * 40)
運行結果:
半角數(shù)字轉全角數(shù)字測試:
========================================
原始: 1234567890
轉換: 1234567890
----------------------------------------
原始: 電話: 13800138000
轉換: 電話: 13800138000
----------------------------------------
原始: 版本號3.14.159
轉換: 版本號3.14.159
----------------------------------------
原始: 混合123abc456
轉換: 混合123abc456
----------------------------------------
原始: 沒有數(shù)字的字符串
轉換: 沒有數(shù)字的字符串
----------------------------------------
方法2:使用str.translate()(更高效)
def half_to_full_width_number_fast(text):
"""
使用translate方法快速轉換
"""
# 創(chuàng)建轉換表
translation_table = str.maketrans(
'0123456789',
'0123456789'
)
return text.translate(translation_table)
# 測試
if __name__ == "__main__":
test_str = "Python 3.10發(fā)布于2021年10月"
print("快速轉換測試:")
print(f"原始: {test_str}")
print(f"轉換: {half_to_full_width_number_fast(test_str)}")
運行結果:
快速轉換測試:
原始: Python 3.10發(fā)布于2021年10月
轉換: Python 3.10發(fā)布于2021年10月
方法3:正則表達式替換
import re
def half_to_full_width_number_regex(text):
"""
使用正則表達式替換半角數(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("正則表達式轉換測試:")
print(f"原始: {test_str}")
print(f"轉換: {half_to_full_width_number_regex(test_str)}")
運行結果:
正則表達式轉換測試:
原始: 訂單號: 987654321, 金額: 199.99元
轉換: 訂單號: 987654321, 金額: 199.99元
三、性能比較
import timeit
def test_performance():
test_str = "Python 3.10發(fā)布于2021年10月,版本號1234567890" * 100
methods = [
("基礎方法", 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()
運行結果示例:
性能測試:
========================================
基礎方法: 0.8423秒
translate方法: 0.0456秒
正則方法: 1.2345秒
性能分析:
- translate()方法最快,適合處理大量文本
- 基礎方法次之,代碼更直觀
- 正則表達式方法最慢,但靈活性最高
四、完整工具類實現(xiàn)
class HalfFullWidthConverter:
"""
半角全角字符轉換工具類
"""
@staticmethod
def half_to_full_number(text):
"""半角數(shù)字轉全角數(shù)字"""
return text.translate(str.maketrans(
'0123456789',
'0123456789'
))
@staticmethod
def half_to_full_alpha(text):
"""半角字母轉全角字母"""
return text.translate(str.maketrans(
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
))
@staticmethod
def half_to_full(text):
"""半角數(shù)字和字母轉全角"""
return HalfFullWidthConverter.half_to_full_alpha(
HalfFullWidthConverter.half_to_full_number(text)
)
@staticmethod
def full_to_half_number(text):
"""全角數(shù)字轉半角數(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ù)字轉全角: {converter.half_to_full_number(test_str)}")
print(f"字母轉全角: {converter.half_to_full_alpha(test_str)}")
print(f"全部轉全角: {converter.half_to_full(test_str)}")
print(f"全角數(shù)字轉半角: {converter.full_to_half_number('12345')}")
運行結果:
工具類測試:
原始: ABCabc123測試TEST456
數(shù)字轉全角: ABCabc123測試TEST456
字母轉全角: ABCabc123測試TEST456
全部轉全角: ABCabc123測試TEST456
全角數(shù)字轉半角: 12345
五、實際應用場景
中文排版處理:
text = "本文發(fā)布于2023年5月1日,閱讀量已達10000+" full_text = HalfFullWidthConverter.half_to_full(text) print(full_text) # 輸出: 本文發(fā)布于2023年5月1日,閱讀量已達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ù)字字符:轉換函數(shù)會保留所有非數(shù)字字符不變
性能考慮:處理大量文本時推薦使用translate()方法
反向轉換:可以使用chr(ord(char) - 0xFEE0)將全角轉回半角
擴展性:工具類可以方便地擴展支持更多字符類型的轉換
七、總結
本教程介紹了三種Python實現(xiàn)半角數(shù)字轉全角數(shù)字的方法:
- 基礎字符遍歷轉換 - 直觀易懂
- translate()方法 - 性能最佳
- 正則表達式方法 - 靈活但性能較低
還提供了完整的工具類實現(xiàn),可以方便地進行半角/全角數(shù)字、字母的相互轉換。根據(jù)實際需求選擇合適的方法,在性能要求高的場景使用translate(),需要靈活處理時使用正則表達式,教學演示則適合基礎方法。
所有代碼都附帶了完整的測試用例和運行結果,方便讀者理解和驗證。
到此這篇關于Python實現(xiàn)半角數(shù)字轉全角數(shù)字的完整方法的文章就介紹到這了,更多相關Python半角數(shù)字轉全角數(shù)字內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python自動化操作之動態(tài)驗證碼、滑動驗證碼的降噪和識別
很多網站登錄都需要輸入驗證碼,如果要實現(xiàn)自動登錄就不可避免的要識別驗證碼,下面這篇文章主要給大家介紹了關于python自動化操作之動態(tài)驗證碼、滑動驗證碼的降噪和識別,需要的朋友可以參考下2021-08-08
python Django實戰(zhàn)之歌曲搜索功能實現(xiàn)
這篇文章主要為大家詳細介紹了如何利用python Django實現(xiàn)歌曲搜索功能,文中的示例代碼講解詳細,具有一定的參考價值,有需要的小伙伴開業(yè)了解下2023-10-10
對pandas將dataframe中某列按照條件賦值的實例講解
今天小編就為大家分享一篇對pandas將dataframe中某列按照條件賦值的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11

