我将货币存储在十进制中。从客户端,我可以接收以下格式的字符串:
US$1,000.00
€1.000,00
到目前为止,我写过:
re.sub(r'[^\d\.]', '', 'US$1,000.00')
对于第一个示例将返回1000.00
(格式化我想要的格式),对于第二个示例将返回1.000
(我不这样做)。
正确捕获两位小数的最佳方法是什么?
答案 0 :(得分:2)
您可以尝试拆分然后再粘合在一起
import re;
z = re.split("[,.]", re.sub([^\d\.\,], '', "$1,000.00"))
''.join(z[0:-2]) + ".".join(z[-2:]) # '1000.00'
答案 1 :(得分:1)
您需要为每种货币设置不同的表达式。有很多不同的货币规则,如果你试图通过一个正则表达式处理它们,你将处于一个受伤的世界。也许正则表达式是正确的解决方案,也许不是。
无论如何,这样的事情就可以了:
money = "US$1,000.00"
decimal_rep = Decimal(0)
if money.startswith("US$"):
decimal_rep = Decimal(re.sub(r'[^\d\.]', '', money))
elif money.startswith("€"):
...
答案 2 :(得分:0)
# -*- 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)
答案 3 :(得分:0)
我同意约旦:如果有更多可能的货币格式,那么这不是可行的方法。
但是,如果您知道,您将只拥有这两种格式,则可以删除所有非数字字符,除了句点和逗号后面只有数字:
output = re.sub(r'(?![.,]\d+$)\D', '', input)
答案 4 :(得分:0)
我发现了一个模块,它可以解决很多货币格式的复杂性(特别是关于句号,逗号和更多东西)。该包名为Babel
,这里是指向可能有用的特定方法的链接:http://babel.edgewall.org/wiki/ApiDocs/babel.numbers#babel.numbers:parse_decimal
文档: http://babel.edgewall.org/wiki/ApiDocs/babel.numbers
其中有很多其他有用的国际化工具。