Python中如何用下划线作为千位分隔符格式化Decimal实例?
Decimal用
_f格式符报错的原因及替代方案 为什么会报错?
Decimal类型并没有完全实现Python的格式规范迷你语言,下划线千位分隔符这个选项不在它支持的格式化参数里——这不是bug,是Decimal自身格式化逻辑的设计差异。它的格式化规则是独立实现的,和float等内置数值类型的格式化逻辑不共享,所以部分格式符无法通用。
另外你提到的Decimal能解析带下划线的字符串,这是解析阶段的特性,和格式化输出是两个独立的功能模块,所以两者不冲突。
替代实现方法
这里给你几种可行的方案:
1. 手动字符串处理(无需第三方库)
自己拆分整数和小数部分,给整数部分添加下划线分隔:
from decimal import Decimal x = Decimal("123456789.123456") num_str = str(x) if '.' in num_str: int_part, dec_part = num_str.split('.', 1) else: int_part, dec_part = num_str, "" # 反向遍历整数部分,每三位分割 split_int = [] for i in range(len(int_part), 0, -3): split_int.append(int_part[max(0, i-3):i]) split_int.reverse() formatted_int = '_'.join(split_int) result = f"{formatted_int}.{dec_part}" if dec_part else formatted_int print(result) # 输出: 123_456_789.123456
2. 借助locale模块(系统环境需支持对应locale)
利用locale的分组格式化,再把逗号替换成下划线:
from decimal import Decimal import locale # 设置支持千位分隔的locale,比如英文环境 locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8') x = Decimal("123456789.123456") num_str = str(x) if '.' in num_str: int_part, dec_part = num_str.split('.', 1) # 格式化整数部分 grouped_int = locale.format_string("%d", int(int_part), grouping=True) formatted_int = grouped_int.replace(',', '_') result = f"{formatted_int}.{dec_part}" else: grouped_int = locale.format_string("%d", int(num_str), grouping=True) result = grouped_int.replace(',', '_') print(result) # 输出: 123_456_789.123456
3. 使用第三方库简化操作
比如humanize库,它能快速处理数字分组,再替换分隔符:
pip install humanize
from decimal import Decimal import humanize x = Decimal("123456789.123456") num_str = str(x) if '.' in num_str: int_part, dec_part = num_str.split('.', 1) grouped_int = humanize.intcomma(int_part) formatted_int = grouped_int.replace(',', '_') result = f"{formatted_int}.{dec_part}" else: result = humanize.intcomma(num_str).replace(',', '_') print(result) # 输出: 123_456_789.123456
内容的提问来源于stack exchange,提问作者HaroldFinch
相关产品推荐
相关产品推荐

