一、半角与全角数字概述
半角数字(ascii数字)和全角数字(unicode全角数字)是两种不同的字符表示形式:
- 半角数字:0 1 2 3 4 5 6 7 8 9(unicode u+0030到u+0039)
- 全角数字:0 1 2 3 4 5 6 7 8 9(unicode u+ff10到u+ff19)
全角数字主要用于中文排版,使数字与中文字符对齐,保持视觉上的统一。
二、实现方法
方法1:基础字符转换(推荐)
def half_to_full_width_number(text):
"""
将字符串中的半角数字转换为全角数字
参数:
text: 输入字符串
返回:
转换后的字符串
"""
result = []
for char in text:
if '0' <= char <= '9':
# 半角数字转全角: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",
"没有数字的字符串"
]
print("半角数字转全角数字测试:")
print("=" * 40)
for case in test_cases:
converted = half_to_full_width_number(case)
print(f"原始: {case}")
print(f"转换: {converted}")
print("-" * 40)
运行结果:
半角数字转全角数字测试:
========================================
原始: 1234567890
转换: 1234567890
----------------------------------------
原始: 电话: 13800138000
转换: 电话: 13800138000
----------------------------------------
原始: 版本号3.14.159
转换: 版本号3.14.159
----------------------------------------
原始: 混合123abc456
转换: 混合123abc456
----------------------------------------
原始: 没有数字的字符串
转换: 没有数字的字符串
----------------------------------------
方法2:使用str.translate()(更高效)
def half_to_full_width_number_fast(text):
"""
使用translate方法快速转换
"""
# 创建转换表
translation_table = str.maketrans(
'0123456789',
'0123456789'
)
return text.translate(translation_table)
# 测试
if __name__ == "__main__":
test_str = "python 3.10发布于2021年10月"
print("快速转换测试:")
print(f"原始: {test_str}")
print(f"转换: {half_to_full_width_number_fast(test_str)}")
运行结果:
快速转换测试:
原始: python 3.10发布于2021年10月
转换: python 3.10发布于2021年10月
方法3:正则表达式替换
import re
def half_to_full_width_number_regex(text):
"""
使用正则表达式替换半角数字
"""
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发布于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()方法最快,适合处理大量文本
- 基础方法次之,代码更直观
- 正则表达式方法最慢,但灵活性最高
四、完整工具类实现
class halffullwidthconverter:
"""
半角全角字符转换工具类
"""
@staticmethod
def half_to_full_number(text):
"""半角数字转全角数字"""
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):
"""半角数字和字母转全角"""
return halffullwidthconverter.half_to_full_alpha(
halffullwidthconverter.half_to_full_number(text)
)
@staticmethod
def full_to_half_number(text):
"""全角数字转半角数字"""
return text.translate(str.maketrans(
'0123456789',
'0123456789'
))
# 测试工具类
if __name__ == "__main__":
converter = halffullwidthconverter()
test_str = "abcabc123测试test456"
print("工具类测试:")
print(f"原始: {test_str}")
print(f"数字转全角: {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"全角数字转半角: {converter.full_to_half_number('12345')}")
运行结果:
工具类测试:
原始: abcabc123测试test456
数字转全角: abcabc123测试test456
字母转全角: abcabc123测试test456
全部转全角: abcabc123测试test456
全角数字转半角: 12345
五、实际应用场景
中文排版处理:
text = "本文发布于2023年5月1日,阅读量已达10000+" full_text = halffullwidthconverter.half_to_full(text) print(full_text) # 输出: 本文发布于2023年5月1日,阅读量已达10000+
数据清洗:
def clean_phone_number(phone):
"""清洗电话号码,确保所有数字为半角"""
return halffullwidthconverter.full_to_half_number(phone).replace(" ", "")
phone = "138 0013 8000"
print(clean_phone_number(phone)) # 输出: 13800138000
验证码生成:
import random
def generate_verification_code(length=6):
"""生成全角数字验证码"""
code = ''.join(random.choices('0123456789', k=length))
return halffullwidthconverter.half_to_full_number(code)
print("验证码:", generate_verification_code()) # 输出类似: 验证码: 789456
六、注意事项
非数字字符:转换函数会保留所有非数字字符不变
性能考虑:处理大量文本时推荐使用translate()方法
反向转换:可以使用chr(ord(char) - 0xfee0)将全角转回半角
扩展性:工具类可以方便地扩展支持更多字符类型的转换
七、总结
本教程介绍了三种python实现半角数字转全角数字的方法:
- 基础字符遍历转换 - 直观易懂
- translate()方法 - 性能最佳
- 正则表达式方法 - 灵活但性能较低
还提供了完整的工具类实现,可以方便地进行半角/全角数字、字母的相互转换。根据实际需求选择合适的方法,在性能要求高的场景使用translate(),需要灵活处理时使用正则表达式,教学演示则适合基础方法。
所有代码都附带了完整的测试用例和运行结果,方便读者理解和验证。
到此这篇关于python实现半角数字转全角数字的完整方法的文章就介绍到这了,更多相关python半角数字转全角数字内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论