我正在以十進制格式存儲貨幣。從客戶端,我可以在下列格式接收字符串:Python正則表達式:格式化逗號的使用,國際期間
US$1,000.00
€1.000,00
到目前爲止,我已經寫了:
re.sub(r'[^\d\.]', '', 'US$1,000.00')
這將返回1000.00
(我想格式化的方式)第一個例子和1.000
第二個(我不這樣做)。
什麼是正確捕獲兩位小數的最佳方法?
我正在以十進制格式存儲貨幣。從客戶端,我可以在下列格式接收字符串:Python正則表達式:格式化逗號的使用,國際期間
US$1,000.00
€1.000,00
到目前爲止,我已經寫了:
re.sub(r'[^\d\.]', '', 'US$1,000.00')
這將返回1000.00
(我想格式化的方式)第一個例子和1.000
第二個(我不這樣做)。
什麼是正確捕獲兩位小數的最佳方法?
我發現了一個模塊,可以處理貨幣格式的複雜問題(特別是關於期間,逗號和其他更多事情)。該軟件包被稱爲Babel
,這裏是一個鏈接到特定方法(S),可以幫助:http://babel.edgewall.org/wiki/ApiDocs/babel.numbers#babel.numbers:parse_decimal
文檔: http://babel.edgewall.org/wiki/ApiDocs/babel.numbers
地段在那裏其他有用的國際utils軟件包。
您需要爲每種貨幣使用不同的表達式。有很多不同的貨幣規則,如果你試圖通過一個正則表達式來處理它們,你將會處於一個受到傷害的世界。也許正則表達式在這裏是正確的解決方案,也許不是。
無論如何,這樣的事情是確定:
money = "US$1,000.00"
decimal_rep = Decimal(0)
if money.startswith("US$"):
decimal_rep = Decimal(re.sub(r'[^\d\.]', '', money))
elif money.startswith("€"):
...
更多比它是什麼貨幣,我有興趣獲得客戶端發送的十進制數。所以,基本上我需要的東西總是會按照以下方式返回格式化的數字:'1000.00'(因此它可以保存到數據庫),無論它是從客戶端發送的1,000或1,000或1,000.00或1.000,00您看看我在做什麼? – tzenderman
是的,這就是我的意思是關於每種貨幣格式化規則的不同。作爲一個不同的正則表達式來處理每個案例應該更簡單一些。所以你爲美國製造一個正則表達式(你已經擁有),另一個用於歐元。它應該是相同的,除了用逗號代替句點。 – Jordan
你可以嘗試拆分和再膠合的東西重新走到一起
import re;
z = re.split("[,.]", re.sub([^\d\.\,], '', "$1,000.00"))
''.join(z[0:-2]) + ".".join(z[-2:]) # '1000.00'
# -*- 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)
剛剛在約旦的消息上發表了評論。我對這種貨幣不太感興趣,因爲我在其他地方儲蓄。我對'.'和','的格式感興趣,並確保表達式總是返回格式如下所示的十進制數:'1.00' – tzenderman
您對'$ 1.000'的期望輸出是什麼?或者你會總是有兩位小數? –
如果我在我的ubuntu系統上粘貼'€1.000,00',通過膩子連接,它會打印'.1.000,00'('echo€1.000,00'變成'echo .1.000,00',然後按下回車鍵本身)。本地化有一些問題。因此,首先檢查python正在接收什麼輸入。 – anishsane