如何使用逗号作为千位分隔符打印数字
- 2024-11-29 08:42:00
- admin 原创
- 114
问题描述:
如何打印以逗号作为千位分隔符的整数?
1234567 ⟶ 1,234,567
不需要根据特定语言环境来决定句号和逗号之间的区别。
解决方案 1:
与语言环境无关:用作_
千位分隔符
f'{value:_}' # For Python ≥3.6
请注意,这不会在用户当前的语言环境中格式化,并且始终用作_
千位分隔符,例如:
1234567 ⟶ 1_234_567
英文格式:用作,
千位分隔符
'{:,}'.format(value) # For Python ≥2.7
f'{value:,}' # For Python ≥3.6
区域感知
import locale
locale.setlocale(locale.LC_ALL, '') # Use '' for auto, or force e.g. to 'en_US.UTF-8'
'{:n}'.format(value) # For Python ≥2.7
f'{value:n}' # For Python ≥3.6
参考
根据格式规范微语言,
此
','
选项表示使用逗号作为千位分隔符。对于区域感知分隔符,请改用'n'
整数表示类型。
和:
此
'_'
选项表示在浮点表示类型和整数表示类型中使用下划线作为千位分隔符'd'
。对于整数表示类型'b'
、、和'o'
,每 4 位数字插入一个下划线。'x'
`'X'`
解决方案 2:
我很惊讶没有人提到你可以使用 Python 3.6+ 中的 f 字符串轻松地做到这一点:
>>> num = 10000000
>>> print(f"{num:,}")
10,000,000
...冒号后面的部分是格式说明符。逗号是您想要的分隔符,因此f"{num:_}"
使用下划线代替逗号。此方法只能使用“,”和“_”。
这相当于使用format(num, ",")
旧版本的 Python 3。
第一次看到它时,它可能看起来像魔术,但事实并非如此。它只是语言的一部分,并且通常需要提供快捷方式。要了解更多信息,请查看group subcomponent。
解决方案 3:
我让它工作了:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US')
'en_US'
>>> locale.format_string("%d", 1255000, grouping=True)
'1,255,000'
当然,您不需要国际化支持,但它清晰、简洁并使用内置库。
PS 那个“%d”是通常的 % 样式格式化程序。您只能有一个格式化程序,但它可以是任何您需要的字段宽度和精度设置。
PPS 如果您无法locale
上班,我建议您修改一下 Mark 的答案:
def intWithCommas(x):
if type(x) not in [type(0), type(0L)]:
raise TypeError("Parameter must be an integer.")
if x < 0:
return '-' + intWithCommas(-x)
result = ''
while x >= 1000:
x, r = divmod(x, 1000)
result = ",%03d%s" % (r, result)
return "%d%s" % (x, result)
递归对于否定情况很有用,但每个逗号一次递归对我来说似乎有点过分。
PPPS 较旧的 Python 用来format
代替format_string
。
解决方案 4:
就效率低下和难以阅读而言,它很难被打败:
>>> import itertools
>>> s = '-1234567'
>>> ','.join(["%s%s%s" % (x[0], x[1] or '', x[2] or '') for x in itertools.izip_longest(s[::-1][::3], s[::-1][1::3], s[::-1][2::3])])[::-1].replace('-,','-')
解决方案 5:
以下是删除不相关的部分并稍微清理后的语言环境分组代码:
(以下仅适用于整数)
def group(number):
s = '%d' % number
groups = []
while s and s[-1].isdigit():
groups.append(s[-3:])
s = s[:-3]
return s + ','.join(reversed(groups))
>>> group(-23432432434.34)
'-23,432,432,434'
这里已经有一些很好的答案了。我只是想添加这个以供将来参考。在 python 2.7 中,将有一个千位分隔符的格式说明符。根据python 文档,它的工作原理如下
>>> '{:20,.2f}'.format(f)
'18,446,744,073,709,551,616.00'
在 python3.1 中你可以做同样的事情,如下所示:
>>> format(1234567, ',d')
'1,234,567'
解决方案 6:
这是我为浮点数所做的。不过,老实说,我不确定它适用于哪个版本 - 我使用的是 2.7:
my_number = 4385893.382939491
my_string = '{:0,.2f}'.format(my_number)
回报:4,385,893.38
更新:我最近遇到了这种格式的问题(无法告诉您具体原因),但可以通过删除以下内容来修复它0
:
my_string = '{:,.2f}'.format(my_number)
解决方案 7:
以下是一行正则表达式替换:
re.sub("(d)(?=(d{3})+(?!d))", r",", "%d" % val)
仅适用于整体输出:
import re
val = 1234567890
re.sub("(d)(?=(d{3})+(?!d))", r",", "%d" % val)
# Returns: '1,234,567,890'
val = 1234567890.1234567890
# Returns: '1,234,567,890'
或者对于少于 4 位数字的浮点数,将格式说明符更改为%.3f
:
re.sub("(d)(?=(d{3})+(?!d))", r",", "%.3f" % val)
# Returns: '1,234,567,890.123'
注意:当小数位数超过三位时,它将无法正常工作,因为它将尝试对小数部分进行分组:
re.sub("(d)(?=(d{3})+(?!d))", r",", "%.5f" % val)
# Returns: '1,234,567,890.12,346'
工作原理
让我们分解一下:
re.sub(pattern, repl, string)
pattern = \n "(d) # Find one digit...
(?= # that is followed by...
(d{3})+ # one or more groups of three digits...
(?!d) # which are not followed by any more digits.
)",
repl = \n r",", # Replace that one digit by itself, followed by a comma,
# and continue looking for more matches later in the string.
# (re.sub() replaces all matches it finds in the input)
string = \n "%d" % val # Format the string as a decimal to begin with
解决方案 8:
您还可以使用'{:n}'.format( value )
它来表示区域设置。我认为这是解决区域设置问题最简单的方法。
欲了解更多信息,请在Python DOCthousands
中搜索。
对于货币,您可以使用locale.currency
,设置标志grouping
:
代码
import locale
locale.setlocale( locale.LC_ALL, '' )
locale.currency( 1234567.89, grouping = True )
输出
'Portuguese_Brazil.1252'
'R$ 1.234.567,89'
解决方案 9:
稍微扩展一下 Ian Schneider 的回答:
如果您想使用自定义千位分隔符,最简单的解决方案是:
'{:,}'.format(value).replace(',', your_custom_thousands_separator)
示例
'{:,.2f}'.format(123456789.012345).replace(',', ' ')
如果你想要这样的德语表示,事情会变得有点复杂:
('{:,.2f}'.format(123456789.012345)
.replace(',', ' ') # 'save' the thousands separators
.replace('.', ',') # dot to comma
.replace(' ', '.')) # thousand separators to dot
解决方案 10:
更新:我确信一定有一个标准库函数可以实现这一点,但尝试使用递归自己编写它很有趣,所以这就是我想出的:
sep = ',' # some countries has '.' and Python 3 sees as float
if type(x) is not int and type(x) is not float:
raise TypeError("Not an number!")
if x < 0:
return '-' + intToStringWithCommas(-x)
elif x < 1000:
return str(x)
else:
return intToStringWithCommas(x / 1000) + sep + '%03d' % (x % 1000)
话虽如此,如果其他人确实找到了标准方法来做到这一点,那么你应该使用它。
解决方案 11:
根据对 activestate 配方498181 的评论,我重新修改了这一点:
import re
def thous(x, sep=',', dot='.'):
num, _, frac = str(x).partition(dot)
num = re.sub(r'(d{3})(?=d)', r''+sep, num[::-1])[::-1]
if frac:
num += dot + frac
return num
它使用正则表达式功能:前瞻,即(?=d)
确保只有“后面”有一个数字的三位数字组才会得到逗号。我说“后面”是因为此时字符串是反向的。
[::-1]
只是反转一个字符串。
解决方案 12:
Python 3
--
整数(不带小数):
"{:,d}".format(1234567)
--
浮点数(带小数):
"{:,.2f}".format(1234567)
其中之前的数字f
指定小数的位数。
--
奖金
印度十万/千万数字系统 (12,34,567) 的快速启动函数:
https://stackoverflow.com/a/44832241/4928578
解决方案 13:
从 Python 2.6 版本开始你可以这样做:
def format_builtin(n):
return format(n, ',')
对于 Python 版本 <2.6 并且仅供您参考,这里有 2 个手动解决方案,它们将浮点数转换为整数,但负数可以正常工作:
def format_number_using_lists(number):
string = '%d' % number
result_list = list(string)
indexes = range(len(string))
for index in indexes[::-3][1:]:
if result_list[index] != '-':
result_list.insert(index+1, ',')
return ''.join(result_list)
这里有几点需要注意:
这一行:string = '%d' %number将数字完美地转换为字符串,它支持负数,并从浮点数中删除分数,使其成为整数;
这个切片indexes[::-3]从末尾开始返回每个第三个项目,因此我使用另一个切片[1:]来删除最后一项,因为最后一个数字后不需要逗号;
此条件if l[index] != '-'被用于支持负数,不要在减号后插入逗号。
还有一个更硬核的版本:
def format_number_using_generators_and_list_comprehensions(number):
string = '%d' % number
generator = reversed(
[
value+',' if (index!=0 and value!='-' and index%3==0) else value
for index,value in enumerate(reversed(string))
]
)
return ''.join(generator)
解决方案 14:
我是一名 Python 初学者,但是一名经验丰富的程序员。我有 Python 3.5,所以我只能使用逗号,但这仍然是一个有趣的编程练习。考虑无符号整数的情况。用于添加千位分隔符的最易读的 Python 程序似乎是:
def add_commas(instr):
out = [instr[0]]
for i in range(1, len(instr)):
if (len(instr) - i) % 3 == 0:
out.append(',')
out.append(instr[i])
return ''.join(out)
也可以使用列表推导:
add_commas(instr):
rng = reversed(range(1, len(instr) + (len(instr) - 1)//3 + 1))
out = [',' if j%4 == 0 else instr[-(j - j//4)] for j in rng]
return ''.join(out)
这个比较短,可能只有一行代码,但你必须花点脑力才能理解它为什么有效。在这两种情况下,我们都会得到:
for i in range(1, 11):
instr = '1234567890'[:i]
print(instr, add_commas(instr))
1 1
12 12
123 123
1234 1,234
12345 12,345
123456 123,456
1234567 1,234,567
12345678 12,345,678
123456789 123,456,789
1234567890 1,234,567,890
如果您希望程序能够被理解,那么第一个版本是更明智的选择。
解决方案 15:
这是一个也适用于浮点数的方法:
def float2comma(f):
s = str(abs(f)) # Convert to a string
decimalposition = s.find(".") # Look for decimal point
if decimalposition == -1:
decimalposition = len(s) # If no decimal, then just work from the end
out = ""
for i in range(decimalposition+1, len(s)): # do the decimal
if not (i-decimalposition-1) % 3 and i-decimalposition-1: out = out+","
out = out+s[i]
if len(out):
out = "."+out # add the decimal point if necessary
for i in range(decimalposition-1,-1,-1): # working backwards from decimal point
if not (decimalposition-i-1) % 3 and decimalposition-i-1: out = ","+out
out = s[i]+out
if f < 0:
out = "-"+out
return out
使用示例:
>>> float2comma(10000.1111)
'10,000.111,1'
>>> float2comma(656565.122)
'656,565.122'
>>> float2comma(-656565.122)
'-656,565.122'
解决方案 16:
适用于 Python 2.5+ 和 Python 3 的一个衬垫(仅限正整数):
''.join(reversed([x + (',' if i and not i % 3 else '') for i, x in enumerate(reversed(str(1234567)))]))
解决方案 17:
我正在使用 python 2.5,因此无法访问内置格式。
我查看了 Django 代码 intcomma(下面代码中的 intcomma_recurs),发现它效率低下,因为它是递归的,而且每次运行时编译正则表达式也不是一件好事。这不一定是一个“问题”,因为 Django 并没有真正关注这种低级性能。此外,我原本预计性能会有 10 倍的差异,但实际上只慢了 3 倍。
出于好奇,我实现了几个版本的 intcomma,看看使用正则表达式时的性能优势是什么。我的测试数据表明这项任务略有优势,但令人惊讶的是优势并不大。
我也很高兴地看到了我所怀疑的事情:在没有正则表达式的情况下,使用反向 xrange 方法是不必要的,但它确实使代码看起来稍微好一些,但性能却降低了约 10%。
另外,我假设您传递的是一个字符串,看起来有点像数字。否则结果不确定。
from __future__ import with_statement
from contextlib import contextmanager
import re,time
re_first_num = re.compile(r"d")
def intcomma_noregex(value):
end_offset, start_digit, period = len(value),re_first_num.search(value).start(),value.rfind('.')
if period == -1:
period=end_offset
segments,_from_index,leftover = [],0,(period-start_digit) % 3
for _index in xrange(start_digit+3 if not leftover else start_digit+leftover,period,3):
segments.append(value[_from_index:_index])
_from_index=_index
if not segments:
return value
segments.append(value[_from_index:])
return ','.join(segments)
def intcomma_noregex_reversed(value):
end_offset, start_digit, period = len(value),re_first_num.search(value).start(),value.rfind('.')
if period == -1:
period=end_offset
_from_index,segments = end_offset,[]
for _index in xrange(period-3,start_digit,-3):
segments.append(value[_index:_from_index])
_from_index=_index
if not segments:
return value
segments.append(value[:_from_index])
return ','.join(reversed(segments))
re_3digits = re.compile(r'(?<=d)d{3}(?!d)')
def intcomma(value):
segments,last_endoffset=[],len(value)
while last_endoffset > 3:
digit_group = re_3digits.search(value,0,last_endoffset)
if not digit_group:
break
segments.append(value[digit_group.start():last_endoffset])
last_endoffset=digit_group.start()
if not segments:
return value
if last_endoffset:
segments.append(value[:last_endoffset])
return ','.join(reversed(segments))
def intcomma_recurs(value):
"""
Converts an integer to a string containing commas every three digits.
For example, 3000 becomes '3,000' and 45000 becomes '45,000'.
"""
new = re.sub("^(-?d+)(d{3})", 'g<1>,g<2>', str(value))
if value == new:
return new
else:
return intcomma(new)
@contextmanager
def timed(save_time_func):
begin=time.time()
try:
yield
finally:
save_time_func(time.time()-begin)
def testset_xsimple(func):
func('5')
def testset_simple(func):
func('567')
def testset_onecomma(func):
func('567890')
def testset_complex(func):
func('-1234567.024')
def testset_average(func):
func('-1234567.024')
func('567')
func('5674')
if __name__ == '__main__':
print 'Test results:'
for test_data in ('5','567','1234','1234.56','-253892.045'):
for func in (intcomma,intcomma_noregex,intcomma_noregex_reversed,intcomma_recurs):
print func.__name__,test_data,func(test_data)
times=[]
def overhead(x):
pass
for test_run in xrange(1,4):
for func in (intcomma,intcomma_noregex,intcomma_noregex_reversed,intcomma_recurs,overhead):
for testset in (testset_xsimple,testset_simple,testset_onecomma,testset_complex,testset_average):
for x in xrange(1000): # prime the test
testset(func)
with timed(lambda x:times.append(((test_run,func,testset),x))):
for x in xrange(50000):
testset(func)
for (test_run,func,testset),_delta in times:
print test_run,func.__name__,testset.__name__,_delta
测试结果如下:
intcomma 5 5
intcomma_noregex 5 5
intcomma_noregex_reversed 5 5
intcomma_recurs 5 5
intcomma 567 567
intcomma_noregex 567 567
intcomma_noregex_reversed 567 567
intcomma_recurs 567 567
intcomma 1234 1,234
intcomma_noregex 1234 1,234
intcomma_noregex_reversed 1234 1,234
intcomma_recurs 1234 1,234
intcomma 1234.56 1,234.56
intcomma_noregex 1234.56 1,234.56
intcomma_noregex_reversed 1234.56 1,234.56
intcomma_recurs 1234.56 1,234.56
intcomma -253892.045 -253,892.045
intcomma_noregex -253892.045 -253,892.045
intcomma_noregex_reversed -253892.045 -253,892.045
intcomma_recurs -253892.045 -253,892.045
1 intcomma testset_xsimple 0.0410001277924
1 intcomma testset_simple 0.0369999408722
1 intcomma testset_onecomma 0.213000059128
1 intcomma testset_complex 0.296000003815
1 intcomma testset_average 0.503000020981
1 intcomma_noregex testset_xsimple 0.134000062943
1 intcomma_noregex testset_simple 0.134999990463
1 intcomma_noregex testset_onecomma 0.190999984741
1 intcomma_noregex testset_complex 0.209000110626
1 intcomma_noregex testset_average 0.513000011444
1 intcomma_noregex_reversed testset_xsimple 0.124000072479
1 intcomma_noregex_reversed testset_simple 0.12700009346
1 intcomma_noregex_reversed testset_onecomma 0.230000019073
1 intcomma_noregex_reversed testset_complex 0.236999988556
1 intcomma_noregex_reversed testset_average 0.56299996376
1 intcomma_recurs testset_xsimple 0.348000049591
1 intcomma_recurs testset_simple 0.34600019455
1 intcomma_recurs testset_onecomma 0.625
1 intcomma_recurs testset_complex 0.773999929428
1 intcomma_recurs testset_average 1.6890001297
1 overhead testset_xsimple 0.0179998874664
1 overhead testset_simple 0.0190000534058
1 overhead testset_onecomma 0.0190000534058
1 overhead testset_complex 0.0190000534058
1 overhead testset_average 0.0309998989105
2 intcomma testset_xsimple 0.0360000133514
2 intcomma testset_simple 0.0369999408722
2 intcomma testset_onecomma 0.207999944687
2 intcomma testset_complex 0.302000045776
2 intcomma testset_average 0.523000001907
2 intcomma_noregex testset_xsimple 0.139999866486
2 intcomma_noregex testset_simple 0.141000032425
2 intcomma_noregex testset_onecomma 0.203999996185
2 intcomma_noregex testset_complex 0.200999975204
2 intcomma_noregex testset_average 0.523000001907
2 intcomma_noregex_reversed testset_xsimple 0.130000114441
2 intcomma_noregex_reversed testset_simple 0.129999876022
2 intcomma_noregex_reversed testset_onecomma 0.236000061035
2 intcomma_noregex_reversed testset_complex 0.241999864578
2 intcomma_noregex_reversed testset_average 0.582999944687
2 intcomma_recurs testset_xsimple 0.351000070572
2 intcomma_recurs testset_simple 0.352999925613
2 intcomma_recurs testset_onecomma 0.648999929428
2 intcomma_recurs testset_complex 0.808000087738
2 intcomma_recurs testset_average 1.81900000572
2 overhead testset_xsimple 0.0189998149872
2 overhead testset_simple 0.0189998149872
2 overhead testset_onecomma 0.0190000534058
2 overhead testset_complex 0.0179998874664
2 overhead testset_average 0.0299999713898
3 intcomma testset_xsimple 0.0360000133514
3 intcomma testset_simple 0.0360000133514
3 intcomma testset_onecomma 0.210000038147
3 intcomma testset_complex 0.305999994278
3 intcomma testset_average 0.493000030518
3 intcomma_noregex testset_xsimple 0.131999969482
3 intcomma_noregex testset_simple 0.136000156403
3 intcomma_noregex testset_onecomma 0.192999839783
3 intcomma_noregex testset_complex 0.202000141144
3 intcomma_noregex testset_average 0.509999990463
3 intcomma_noregex_reversed testset_xsimple 0.125999927521
3 intcomma_noregex_reversed testset_simple 0.126999855042
3 intcomma_noregex_reversed testset_onecomma 0.235999822617
3 intcomma_noregex_reversed testset_complex 0.243000030518
3 intcomma_noregex_reversed testset_average 0.56200003624
3 intcomma_recurs testset_xsimple 0.337000131607
3 intcomma_recurs testset_simple 0.342000007629
3 intcomma_recurs testset_onecomma 0.609999895096
3 intcomma_recurs testset_complex 0.75
3 intcomma_recurs testset_average 1.68300008774
3 overhead testset_xsimple 0.0189998149872
3 overhead testset_simple 0.018000125885
3 overhead testset_onecomma 0.018000125885
3 overhead testset_complex 0.0179998874664
3 overhead testset_average 0.0299999713898
解决方案 18:
通用解决方案
我发现之前得票最高的答案中的点分隔符存在一些问题。我设计了一个通用解决方案,您可以使用任何您想要的千位分隔符,而无需修改语言环境。我知道这不是最优雅的解决方案,但它可以完成工作。请随意改进它!
def format_integer(number, thousand_separator='.'):
def reverse(string):
string = "".join(reversed(string))
return string
s = reverse(str(number))
count = 0
result = ''
for char in s:
count = count + 1
if count % 3 == 0:
if len(s) == count:
result = char + result
else:
result = thousand_separator + char + result
else:
result = char + result
return result
print(format_integer(50))
# 50
print(format_integer(500))
# 500
print(format_integer(50000))
# 50.000
print(format_integer(50000000))
# 50.000.000
解决方案 19:
python 中的 babel 模块具有根据提供的语言环境应用逗号的功能。
要安装 babel,请运行以下命令。
pip install babel
用法
format_currency(1234567.89, 'USD', locale='en_US')
# Output: $1,234,567.89
format_currency(1234567.89, 'USD', locale='es_CO')
# Output: US$ 1.234.567,89 (raw output US$xa01.234.567,89)
format_currency(1234567.89, 'INR', locale='en_IN')
# Output: ₹12,34,567.89
解决方案 20:
在浮点数中同时使用分隔符和小数点:(在此示例中为两位小数)
large_number = 4545454.26262666
print(f"Formatted: {large_number:,.2f}")
结果:格式化:4,545,454.26
解决方案 21:
这和逗号一起赚钱
def format_money(money, presym='$', postsym=''):
fmt = '%0.2f' % money
dot = string.find(fmt, '.')
ret = []
if money < 0 :
ret.append('(')
p0 = 1
else :
p0 = 0
ret.append(presym)
p1 = (dot-p0) % 3 + p0
while True :
ret.append(fmt[p0:p1])
if p1 == dot : break
ret.append(',')
p0 = p1
p1 += 3
ret.append(fmt[dot:]) # decimals
ret.append(postsym)
if money < 0 : ret.append(')')
return ''.join(ret)
解决方案 22:
我有此代码的 Python 2 和 Python 3 版本。我知道这个问题是针对 Python 2 提出的,但现在(8 年后哈哈)人们可能会使用 Python 3。Python
3 代码:
import random
number = str(random.randint(1, 10000000))
comma_placement = 4
print('The original number is: {}. '.format(number))
while True:
if len(number) % 3 == 0:
for i in range(0, len(number) // 3 - 1):
number = number[0:len(number) - comma_placement + 1] + ',' + number[len(number) - comma_placement + 1:]
comma_placement = comma_placement + 4
else:
for i in range(0, len(number) // 3):
number = number[0:len(number) - comma_placement + 1] + ',' + number[len(number) - comma_placement + 1:]
break
print('The new and improved number is: {}'.format(number))
Python 2 代码:(编辑。python 2 代码不起作用。我认为语法不同)。
import random
number = str(random.randint(1, 10000000))
comma_placement = 4
print 'The original number is: %s.' % (number)
while True:
if len(number) % 3 == 0:
for i in range(0, len(number) // 3 - 1):
number = number[0:len(number) - comma_placement + 1] + ',' + number[len(number) - comma_placement + 1:]
comma_placement = comma_placement + 4
else:
for i in range(0, len(number) // 3):
number = number[0:len(number) - comma_placement + 1] + ',' + number[len(number) - comma_placement + 1:]
break
print 'The new and improved number is: %s.' % (number)
解决方案 23:
单独使用 f 字符串replace
、和格式说明符:
input = 100000
# Comma as thousands separator
f'{input:,}' # '100,000'
# Period as thousands separator
f'{input:,}'.replace(',', '.') # '100.000'
# Space as thousands separator
f'{input:,}'.replace(',', ' ') # '100 000'
使用浮点数(例如货币):
# Comma as thousands separator and
# period as decimal separator
f'{input:,.2f}' # '100,000.00'
# Period as thousands separator and
# comma as decimal separator
f'{input:_.2f}'\n.replace('.', ',')\n.replace('_', '.') # '100.000,00'
# Space as thousands separator and
# comma as decimal separator
f'{input:_.2f}'\n.replace('.', ',')\n.replace('_', ' ') # '100 000,00'
# (The backslashes are just line breaks
# to line up the output for presentation)
如果在野外这样做,下一个查看您代码的人可能会感激您留下评论或将代码放入函数中。对于大多数普通人来说,微语言代码看起来相当神秘。
解决方案 24:
以下是使用适用于整数的生成器函数的另一种变体:
def ncomma(num):
def _helper(num):
# assert isinstance(numstr, basestring)
numstr = '%d' % num
for ii, digit in enumerate(reversed(numstr)):
if ii and ii % 3 == 0 and digit.isdigit():
yield ','
yield digit
return ''.join(reversed([n for n in _helper(num)]))
这是一个测试:
>>> for i in (0, 99, 999, 9999, 999999, 1000000, -1, -111, -1111, -111111, -1000000):
... print i, ncomma(i)
...
0 0
99 99
999 999
9999 9,999
999999 999,999
1000000 1,000,000
-1 -1
-111 -111
-1111 -1,111
-111111 -111,111
-1000000 -1,000,000
解决方案 25:
意大利:
>>> import locale
>>> locale.setlocale(locale.LC_ALL,"")
'Italian_Italy.1252'
>>> f"{1000:n}"
'1.000'
解决方案 26:
只需子类化long
(或float
,或其他)。这非常实用,因为这样您仍然可以在数学运算中使用数字(因此可以使用现有代码),但它们都会很好地打印在您的终端上。
>>> class number(long):
def __init__(self, value):
self = value
def __repr__(self):
s = str(self)
l = [x for x in s if x in '1234567890']
for x in reversed(range(len(s)-1)[::3]):
l.insert(-x, ',')
l = ''.join(l[1:])
return ('-'+l if self < 0 else l)
>>> number(-100000)
-100,000
>>> number(-100)
-100
>>> number(-12345)
-12,345
>>> number(928374)
928,374
>>> 345
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)