当前位置: 首页 > news >正文

Python实现半角数字转全角数字的完整教程

文章目录

  • 一、半角与全角数字概述
  • 二、实现方法
    • 方法1:基础字符转换(推荐)
    • 方法2:使用str.translate()(更高效)
    • 方法3:正则表达式替换
  • 三、性能比较
  • 四、完整工具类实现
  • 五、实际应用场景
  • 六、注意事项
  • 七、总结

一、半角与全角数字概述

半角数字(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码点+65248full_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 redef 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 timeitdef test_performance():test_str = "Python 3.10发布于2021年10月,版本号1234567890" * 100methods = [("基础方法", 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秒

性能分析

  1. translate()方法最快,适合处理大量文本
  2. 基础方法次之,代码更直观
  3. 正则表达式方法最慢,但灵活性最高

四、完整工具类实现

class HalfFullWidthConverter:"""半角全角字符转换工具类"""@staticmethoddef half_to_full_number(text):"""半角数字转全角数字"""return text.translate(str.maketrans('0123456789','0123456789'))@staticmethoddef half_to_full_alpha(text):"""半角字母转全角字母"""return text.translate(str.maketrans('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'))@staticmethoddef half_to_full(text):"""半角数字和字母转全角"""return HalfFullWidthConverter.half_to_full_alpha(HalfFullWidthConverter.half_to_full_number(text))@staticmethoddef 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

五、实际应用场景

  1. 中文排版处理
text = "本文发布于2023年5月1日,阅读量已达10000+"
full_text = HalfFullWidthConverter.half_to_full(text)
print(full_text)
# 输出: 本文发布于2023年5月1日,阅读量已达10000+
  1. 数据清洗
def clean_phone_number(phone):"""清洗电话号码,确保所有数字为半角"""return HalfFullWidthConverter.full_to_half_number(phone).replace(" ", "")phone = "138 0013 8000"
print(clean_phone_number(phone))  # 输出: 13800138000
  1. 验证码生成
import randomdef generate_verification_code(length=6):"""生成全角数字验证码"""code = ''.join(random.choices('0123456789', k=length))return HalfFullWidthConverter.half_to_full_number(code)print("验证码:", generate_verification_code())  # 输出类似: 验证码: 789456

六、注意事项

  1. 非数字字符:转换函数会保留所有非数字字符不变
  2. 性能考虑:处理大量文本时推荐使用translate()方法
  3. 反向转换:可以使用chr(ord(char) - 0xFEE0)将全角转回半角
  4. 扩展性:工具类可以方便地扩展支持更多字符类型的转换

七、总结

本教程介绍了三种Python实现半角数字转全角数字的方法:

  1. 基础字符遍历转换 - 直观易懂
  2. translate()方法 - 性能最佳
  3. 正则表达式方法 - 灵活但性能较低

还提供了完整的工具类实现,可以方便地进行半角/全角数字、字母的相互转换。根据实际需求选择合适的方法,在性能要求高的场景使用translate(),需要灵活处理时使用正则表达式,教学演示则适合基础方法。

所有代码都附带了完整的测试用例和运行结果,方便读者理解和验证。

http://www.dtcms.com/a/358269.html

相关文章:

  • 《中国棒垒球》垒球世界纪录多少米·垒球8号位
  • Visual Studio(vs)免费版下载安装C/C++运行环境配置
  • LeetCode 287.寻找重复数
  • Java试题-选择题(23)
  • 【LeetCode 热题 100】62. 不同路径——(解法四)组合数学
  • 聊一聊 .NET 的 AssemblyLoadContext 可插拔程序集
  • rhel-server-7.9-x86_64-dvd.iso
  • 机器学习中KNN算法介绍
  • 笔记共享平台|基于Java+vue的读书笔记共享平台系统(源码+数据库+文档)
  • 数据库原理及应用_数据库基础_第3章数据库编程_常用系统函数
  • 骑行商城怎么开发
  • 【金仓数据库产品体验官】KingbaseES-ORACLE兼容版快速体验
  • 国家统计局数据分析01——机器学习
  • GD32VW553-IOT 基于 vscode 的 bootloader 移植(基于Cmake)
  • 【DreamCamera2】相机应用修改成横屏后常见问题解决方案
  • 阿里云营业执照OCR接口的PHP实现与技术解析:从签名机制到企业级应用
  • LZ4 解压工具(WPF / .NET 8)说明书
  • Java Stream API并行流性能优化实践指南
  • 基于Kubernetes自定义调度器的资源隔离与性能优化实践指南
  • 从 0 到 1 构建零丢失 RabbitMQ 数据同步堡垒:第三方接口数据零丢失的终极方案
  • 人工智能学习:Python相关面试题
  • 人工智能学习:Linux相关面试题
  • 98、23种设计模式之代理模式(7/23)
  • spark.sparkContext.broadcast() 与 org.apache.spark.sql.functions.broadcast 的区别
  • 开源PPT生成智能体(Agent)全景透视:技术路线、代表项目与未来趋势
  • 鸿蒙ArkTS 核心篇-15-条件渲染(组件)
  • 三重积分的性质
  • [论文阅读] 人工智能 + 软件工程 | 从“法律条文”到“Gherkin脚本”:Claude与Llama谁更懂合规开发?
  • comfUI背后的技术——VAE
  • [创业之路-581]:如何驾驭不确定性和风险,并从中获利?