2015-03-13 56 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