通貨を Decimal に格納しています。クライアントから、次の形式の文字列を受け取る可能性があります。
US$1,000.00
€1.000,00
これまでのところ、私は書いてきました:
re.sub(r'[^\d\.]', '', 'US$1,000.00')
最初の例と2番目の例(私はそうではありません)に対して(1000.00
私が望むようにフォーマットされて)返されます。1.000
両方の小数を正しくキャッチする最良の方法は何でしょうか?
分割してから接着して元に戻すことができます
import re;
z = re.split("[,.]", re.sub([^\d\.\,], '', "$1,000.00"))
''.join(z[0:-2]) + ".".join(z[-2:]) # '1000.00'
通貨ごとに異なる表現が必要です。多くの異なる通貨ルールがあり、それらすべてを 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("€"):
...
# -*- 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)
私はヨルダンに同意します。より多くの可能な通貨形式がある場合、これは進むべき道ではありません.
ただし、これら 2 つの形式しかないことがわかっている場合は、数字だけが続くピリオドとコンマを除いて、数字以外のすべての文字を削除できます。
output = re.sub(r'(?![.,]\d+$)\D', '', input)