2015-03-13 209 views
1

我從格式爲10.990,00的站點提取價格,這樣做沒有意義。需要什麼使它成爲10,990.00。我試過以下,但它取代了所有。如何交換字符串中的逗號和點號

price = "10.990,00" 
price = price.replace(',','.',1) 
price = price.replace('.',',',1) 

我在做什麼錯?

+5

現有答案在回答您的問題方面做得很好,但退後一步,您想完成什麼?如果您試圖「從網站獲取價格並以當地貨幣顯示價格,而不考慮源貨幣」,則可以將價格轉換爲數字,然後使用您的區域設置正確顯示價格:http: //stackoverflow.com/questions/8421922/how-do-i-convert-a-currency-string-to-a-floating-point-number-in-python和http://stackoverflow.com/questions/3606517/ python-how-to-format-currency-string – Peach 2015-03-13 15:29:17

+0

當然,我上面的建議沒有考慮到貨幣轉換...但這是一個完整的其他問題... – Peach 2015-03-13 15:30:38

+0

我正在刮的網站錯誤地換了逗號和點。 – Volatil3 2015-03-13 15:33:54

回答

9

用第一個逗號替換第一個逗號後,用逗號代替第一個點。插入的第一個點str.replace()不能被第二個str.replace()調用取代。

使用str.translate() method代替:

try: 
    from string import maketrans # Python 2 
except ImportError: 
    maketrans = str.maketrans  # Python 3 

price = price.translate(maketrans(',.', '.,')) 

在其穿過字符串,不會使雙置換,是非常快啓動這會爲交換點,反之亦然逗號。

我使代碼與Python 2和3兼容,其中string.maketrans()被替換爲static str.maketrans() function

這裏的例外是Python 2 unicode;它與Python 3中的str.translate()一樣工作,但沒有maketrans工廠爲您創建映射。您可以使用字典是:

unicode_price = unicode_price.translate({u'.': u',', u',': u'.'}) 

演示:

>>> try: 
...  from string import maketrans # Python 2 
... except ImportError: 
...  maketrans = str.maketrans  # Python 3 
... 
>>> price = "10.990,00" 
>>> price.translate(maketrans(',.', '.,')) 
'10,990.00' 
+0

這很有趣我在Py27上,它說'maketrans'的Uresolved Reference'' – Volatil3 2015-03-13 15:29:42

+0

@ Volatil3:聽起來像你的IDE告訴你那樣;是PyCharm嗎?你可以使用第一行而不用'try..except',PyCharm不會再抱怨,或者你可以忽略這個警告; IDE會看到'maketrans = str.maketrans'行,但不知道它永遠不會在Python 2上執行。 – 2015-03-13 15:30:36

+0

是的,它是PyCharm :-)讓我跑然後 – Volatil3 2015-03-13 15:31:15

3

您的代碼不工作的原因是因爲你轉換到10.990,0010.990.00然後要更換所有點與逗號。

相反,你可以轉換,爲符號,然後轉換.,和符號.

price = "10.990,00" 
price = price.replace(',','COMMA') 
price = price.replace('.',',') 

price = price.replace('COMMA','.') 

print(price) 

或者通過georg

price = price.replace(',','COMMA').replace('.',',').replace('COMMA','.') 

注意,我在刪除可選參數的建議replace(),因爲像1.200.000,30這樣的數字不會按預期進行轉換。

+2

你實際上並不需要「COMMA」這個東西,只需要'price.replace('。','@')。replace(',','。')。replace('@',',') ' – georg 2015-03-13 15:30:12

+0

@georg你是對的。我會相應地編輯。 – 2015-03-13 15:32:34

+0

如果OP不得不交換3個字符,4個字符等等,那將是一個很大的麻煩:D – Heisenberg 2015-03-13 15:56:39

2

@Martijn給出了最好的答案。您也可以遍歷pricereplace

swap = {'.':',',',':'.'} 
def switchDotsAndCommas(text): 
    text = ''.join(swap.get(k, k) for k in text) 
    print text 

switchDotsAndCommas('10.990,00') 
+1

這實際上是'str.translate()'*做的*。但方式,方式更快。 – 2015-03-13 15:37:36

+0

@MartijnPieters由於使用了其他算法或其他方法,速度更快嗎? – Volatil3 2015-03-13 15:39:17

+2

@ Volatil3:它更快,因爲它完全在C中完成。 – 2015-03-13 15:40:56

相關問題