Python 支持区域设置的方法,用于打印带有逗号和小数的大数字
关于如何打印带有逗号和/或小数位的数字,有许多公认的答案,例如等等 出于某种原因,我无法找到一个明确的答案,说明如何以区域设置感知的方式对带小数的大数字执行此操作,而不强制我以精确的方式进行硬编码(例如,在读取文件并从中打印值时,事先不知道数字的大小或精确程度) 为了使事情变得更复杂,我还希望以Python 2.7/3.x交叉兼容的方式来实现这一点 因此,如果我有一个像Python 支持区域设置的方法,用于打印带有逗号和小数的大数字,python,printing,Python,Printing,关于如何打印带有逗号和/或小数位的数字,有许多公认的答案,例如等等 出于某种原因,我无法找到一个明确的答案,说明如何以区域设置感知的方式对带小数的大数字执行此操作,而不强制我以精确的方式进行硬编码(例如,在读取文件并从中打印值时,事先不知道数字的大小或精确程度) 为了使事情变得更复杂,我还希望以Python 2.7/3.x交叉兼容的方式来实现这一点 因此,如果我有一个像1000000.01这样的数字,我希望它打印为“1000000.01”,而1000000.00001打印为“1000000.00
1000000.01
这样的数字,我希望它打印为“1000000.01”,而1000000.00001
打印为“1000000.00001”
以下是我尝试过但不起作用的方法:
(使用标准)
根据文档,“{:n}”
听起来像我想要的,但实际上似乎不起作用<代码>“{:,}”给出了所需的结果,但似乎不了解区域设置(根据列出的文档;需要对此进行澄清)
(使用locale
)
似乎locale.format(“%g”,…)
与我想要的最接近,但似乎无法正常工作:
print(locale.format("%g", 1000.01, grouping = True)) # 1,000.01 ; works but only for small numbers
print(locale.format("%g", 10000.01, grouping = True)) # 10,000 ; doesn't work, loses decimal
似乎local.format
中缺少n
格式化程序
有什么想法吗?似乎真的很奇怪,至少到目前为止,我已经找到了一个通用的方法来解决这个问题。我的意思是,你可以在小数点处拆分并单独计算。这可能不太理想,但确实有效
# `input` is your number, `output` is the formatted string.
import locale #import
sep = '.' if locale.localeconv()['thousands_sep'] == ',' else ',' #get locale sep
parts = str(input).split(sep) #get part before and after the sep
parts[0] = locale.format("%d", parts[0], grouping=True) #format **part 0**
output = sep.join(parts) #rejoin
我想这就行了
这里最重要的部分是调用
locale.localeconv()['0000sep']
,它获取值分隔符。然后,在同一行上反转它,使逗号变成句点,反之亦然。“”{:n}“
听起来像我想要的,但实际上似乎不起作用。”。。。我可能错过了一些东西,但它怎么不起作用呢?“{:n}”。format(1000000.01)
返回'1e+06'
对不起,“{:,}”
怎么不起作用?“{:,}”
不支持区域设置,并且不适用于千位分隔符为
且不为,
的系统。除非我读错了文档?难道第二个答案不能解决这个问题吗?我可能又漏掉了一些东西,但是普通的print(“{:,}”).format(x))
适合我,不需要任何麻烦…@Julien你确定吗?我没有测试,所以我可能是错的,但我相信这是正确的。没关系,我重新阅读了问题,我现在明白了!我编辑了我的答案来工作!(我想…我仍然无法测试)@user5359531输入是您的非格式化数字,输出是格式化字符串。
print(locale.format("%g", 1000.01, grouping = True)) # 1,000.01 ; works but only for small numbers
print(locale.format("%g", 10000.01, grouping = True)) # 10,000 ; doesn't work, loses decimal
# `input` is your number, `output` is the formatted string.
import locale #import
sep = '.' if locale.localeconv()['thousands_sep'] == ',' else ',' #get locale sep
parts = str(input).split(sep) #get part before and after the sep
parts[0] = locale.format("%d", parts[0], grouping=True) #format **part 0**
output = sep.join(parts) #rejoin