2013-07-03 25 views
1

我正在以十進制格式存儲貨幣。從客戶端,我可以在下列格式接收字符串:Python正則表達式:格式化逗號的使用,國際期間

US$1,000.00 
€1.000,00 

到目前爲止,我已經寫了:

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

這將返回1000.00(我想格式化的方式)第一個例子和1.000第二個(我不這樣做)。

什麼是正確捕獲兩位小數的最佳方法?

+0

您對'$ 1.000'的期望輸出是什麼?或者你會總是有兩位小數? –

+0

如果我在我的ubuntu系統上粘貼'€1.000,00',通過膩子連接,它會打印'.1.000,00'('echo€1.000,00'變成'echo .1.000,00',然後按下回車鍵本身)。本地化有一些問題。因此,首先檢查python正在接收什麼輸入。 – anishsane

回答

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("€"): 
    ... 
+0

更多比它是什麼貨幣,我有興趣獲得客戶端發送的十進制數。所以,基本上我需要的東西總是會按照以下方式返回格式化的數字:'1000.00'(因此它可以保存到數據庫),無論它是從客戶端發送的1,000或1,000或1,000.00或1.000,00您看看我在做什麼? – tzenderman

+0

是的,這就是我的意思是關於每種貨幣格式化規則的不同。作爲一個不同的正則表達式來處理每個案例應該更簡單一些。所以你爲美國製造一個正則表達式(你已經擁有),另一個用於歐元。它應該是相同的,除了用逗號代替句點。 – Jordan

2

你可以嘗試拆分和再膠合的東西重新走到一起

import re; 
z = re.split("[,.]", re.sub([^\d\.\,], '', "$1,000.00")) 
''.join(z[0:-2]) + ".".join(z[-2:]) # '1000.00' 
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) 
0

我同意喬丹:如果有更多的可能貨幣格式,那麼這不是要走的路。

但是,如果你知道,你永遠只能有這兩種格式,您可以刪除除句號和逗號被後面什麼都沒有,但數字的所有非數字字符:

output = re.sub(r'(?![.,]\d+$)\D', '', input) 
+0

剛剛在約旦的消息上發表了評論。我對這種貨幣不太感興趣,因爲我在其他地方儲蓄。我對'.'和','的格式感興趣,並確保表達式總是返回格式如下所示的十進制數:'1.00' – tzenderman