我以十进制存储货币。从客户端,我可以接收以下格式的字符串:
US$1,000.00
€1.000,00
到目前为止,我已经写过:
re.sub(r'[^\d\.]', '', 'US$1,000.00')
对于第一个示例和第二个示例(我没有),它将返回1000.00
(按照我想要的方式格式化)。1.000
正确捕获两个小数的最佳方法是什么?
您可以尝试拆分然后将它们粘在一起
import re;
z = re.split("[,.]", re.sub([^\d\.\,], '', "$1,000.00"))
''.join(z[0:-2]) + ".".join(z[-2:]) # '1000.00'
您需要对每种货币使用不同的表达式。有很多不同的货币规则,如果你试图通过一个正则表达式来处理它们,你将陷入痛苦的世界。也许正则表达式是正确的解决方案,也许不是。
无论如何,这样的事情就可以了:
money = "US$1,000.00"
decimal_rep = Decimal(0)
if money.startswith("US$"):
decimal_rep = Decimal(re.sub(r'[^\d\.]', '', money))
elif money.startswith("€"):
...
# -*- coding: cp1252 -*-
import re
text = '''US$1,000.00
US$3,000,000
€1.000,00
€4.000'''
print '%s\n-------------------' % text
pat = '([$€])[ \t]*[\d,.]+'
def ripl(mat, d = dict(('$,','€.'))):
return mat.group().replace(d[mat.group(1)],'')
print re.sub(pat,ripl,text)
我同意乔丹的观点:如果有更多可能的货币格式,那么这不是要走的路。
但是,如果您知道只有这两种格式,您可以删除所有非数字字符,除了句点和逗号后面只有数字:
output = re.sub(r'(?![.,]\d+$)\D', '', input)
我发现一个模块可以处理货币格式的很多复杂性(特别是关于句点、逗号和更多的东西)。这个包被称为Babel
,这里是一个可以帮助的特定方法的链接:http://babel.edgewall.org/wiki/ApiDocs/babel.numbers#babel.numbers: parse_decimal
文档: http ://babel.edgewall.org/wiki/ApiDocs/babel.numbers
那里还有很多其他有用的国际化工具。