1

我以十进制存储货币。从客户端,我可以接收以下格式的字符串:

US$1,000.00
€1.000,00

到目前为止,我已经写过:

re.sub(r'[^\d\.]', '', 'US$1,000.00')

对于第一个示例和第二个示例(我没有),它将返回1000.00(按照我想要的方式格式化)。1.000

正确捕获两个小数的最佳方法是什么?

4

5 回答 5

2

您可以尝试拆分然后将它们粘在一起

import re;
z = re.split("[,.]", re.sub([^\d\.\,], '', "$1,000.00"))
''.join(z[0:-2]) + ".".join(z[-2:])  # '1000.00'
于 2013-07-03T16:23:09.077 回答
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("€"):
    ...
于 2013-07-03T16:22:44.183 回答
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)
于 2013-07-03T17:10:49.807 回答
0

我同意乔丹的观点:如果有更多可能的货币格式,那么这不是要走的路。

但是,如果您知道只有这两种格式,您可以删除所有非数字字符,除了句点和逗号后面只有数字:

output = re.sub(r'(?![.,]\d+$)\D', '', input)
于 2013-07-03T17:10:59.573 回答
0

我发现一个模块可以处理货币格式的很多复杂性(特别是关于句点、逗号和更多的东西)。这个包被称为Babel,这里是一个可以帮助的特定方法的链接:http://babel.edgewall.org/wiki/ApiDocs/babel.numbers#babel.numbers: parse_decimal

文档: http ://babel.edgewall.org/wiki/ApiDocs/babel.numbers

那里还有很多其他有用的国际化工具。

于 2013-07-26T19:22:37.843 回答