Answers:
请参阅语言环境模块。
这会进行货币(和日期)格式化。
>>> import locale
>>> locale.setlocale( locale.LC_ALL, '' )
'English_United States.1252'
>>> locale.currency( 188518982.18 )
'$188518982.18'
>>> locale.currency( 188518982.18, grouping=True )
'$188,518,982.18'
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
,并且效果很好!
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
$ 123,456.78
有时会导致。编辑:markdown删除了多余的空格,假装$和数字之间还有更多内容
不太确定为什么没有在网上(或在此主题中)提及更多,但是Babel Edgewall家伙包(和Django实用程序)对于货币格式(以及许多其他i18n任务)来说很棒。很好,因为它不需要像核心Python语言环境模块那样全局地做所有事情。
OP给出的示例仅是:
>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18
locale
参数来format_currency
解决这个问题,但是要么是四年前不在文档中(当我写此评论时),要么我只是按原样测试了此答案的代码,而没有检查文档。
这是一个古老的帖子,但是我只是实现了以下解决方案:
码:
num1 = 4153.53
num2 = -23159.398598
print 'This: ${:0,.0f} and this: ${:0,.2f}'.format(num1, num2).replace('$-','-$')
输出:
This: $4,154 and this: -$23,159.40
对于原始海报,显然,只需切换$
为£
print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
我的语言环境设置似乎不完整,所以我也没有看到这样的答案,而是发现:
http://docs.python.org/library/decimal.html#recipes
与操作系统无关
只想在这里分享。
def moneyfmt(value, places=2, curr='', sep=',', dp='.', pos='', neg='-', trailneg='')
?
如果您使用的是OSX并且尚未设置区域设置模块,则此第一个答案将不起作用,您将收到以下错误:
Traceback (most recent call last):File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/locale.py", line 221, in currency
raise ValueError("Currency formatting is not possible using "ValueError: Currency formatting is not possible using the 'C' locale.
为了解决这个问题,您必须使用以下方法:
locale.setlocale(locale.LC_ALL, 'en_US')
如果我是你,我将使用BABEL:http : //babel.pocoo.org/en/latest/index.html
from babel.numbers import format_decimal
format_decimal(188518982.18, locale='en_US')
format_currency
。
哦,那是一个有趣的野兽。
我花了很多时间来解决这个问题,因地区而异的三个主要问题是:-货币符号和方向-千位分隔符-小数点
我已经编写了自己的相当广泛的实现,它是kiwi python框架的一部分,请在此处查看LGPL:ed源:
http://svn.async.com.br/cgi-bin/viewvc.cgi/kiwi/trunk/kiwi/currency.py?view=markup
该代码是Linux / Glibc特有的,但对于Windows或其他Unix来说应该不太难。
安装完成后,您可以执行以下操作:
>>> from kiwi.datatypes import currency
>>> v = currency('10.5').format()
然后会给你:
'$10.50'
要么
'10,50 kr'
取决于当前选择的语言环境。
这篇文章相对于其他文章的要点是它将与旧版本的python一起使用。locale.currency在python 2.5中引入。
10,50 kr
而不是kr 10,50
。
受以上代码启发:D
def money_format(value):
value = str(value).split('.')
money = ''
count = 1
for digit in value[0][::-1]:
if count != 3:
money += digit
count += 1
else:
money += f'{digit},'
count = 1
if len(value) == 1:
money = ('$' + money[::-1]).replace('$-','-$')
else:
money = ('$' + money[::-1] + '.' + value[1]).replace('$-','-$')
return money
我来看看同一件事,发现python-money尚未真正使用它,但也许将两者混合会很好
在@Nate 答案的帮助下,用于在函数内部进行计算的lambda
converter = lambda amount, currency: "%s%s%s" %(
"-" if amount < 0 else "",
currency,
('{:%d,.2f}'%(len(str(amount))+3)).format(abs(amount)).lstrip())
然后,
>>> converter(123132132.13, "$")
'$123,132,132.13'
>>> converter(-123132132.13, "$")
'-$123,132,132.13'
简单的python代码!
def format_us_currency(value):
value=str(value)
if value.count(',')==0:
b,n,v='',1,value
value=value[:value.rfind('.')]
for i in value[::-1]:
b=','+i+b if n==3 else i+b
n=1 if n==3 else n+1
b=b[1:] if b[0]==',' else b
value=b+v[v.rfind('.'):]
return '$'+(value.rstrip('0').rstrip('.') if '.' in value else value)
"$2,129.1468284147656"
,"$10,948.3742933"
,"$1,0908"
。使字符串乱码。
locale
模块对货币值的使用和该货币的显示属性分离开来而无法用该语言实现。