转换小数点

Til*_*l B 28 python locale decimal-point

我有一个包含数据读取的CSV文件,我想读入Python.我得到包含字符串的列表"2,5".现在做的float("2,5")不起作用,因为它有错误的小数点.

我如何将其作为Python阅读2.5

Lau*_*low 55

您可以使用区域设置识别方式:

import locale

# Set to users preferred locale:
locale.setlocale(locale.LC_ALL, '')
# Or a specific locale:
locale.setlocale(locale.LC_NUMERIC, "en_DK.UTF-8")

print locale.atof("3,14")
Run Code Online (Sandbox Code Playgroud)

在使用此方法之前,请阅读节.

  • 还应该记住,这不是线程安全的:http://stackoverflow.com/questions/2186327/thread-safe-locale-techniques (2认同)

eum*_*iro 23

float("2,5".replace(',', '.')) 在大多数情况下会这样做

如果value是一个很大的数字,.已经使用了数千,你可以:

替换点的所有逗号: value.replace(",", ".")

除去最后一点之外的所有内容: value.replace(".", "", value.count(".") -1)

  • 标准分隔符是逗号.每个人都知道,除了美国人和英国人:D (26认同)
  • 只是好奇,这是真正的解决方案吗?对我来说太可怕了. (20认同)
  • @ loki2302使用逗号作为十进制分隔符的国家/地区的标准csv格式[在csv文件中使用`;`作为字段分隔符](http://en.wikipedia.org/wiki/Comma-separated_values). (8认同)
  • 它不是全球*标准*.例如,在俄罗斯,逗号是标准的,点数没有被广泛使用.所以,我相信,这个问题的正确解决方案是以某种方式了解该文档的作者区域设置.另一个问题是 - *因为我们谈论的是CSV,他们是如何设法用逗号保存花车的?: - )*.我相信3,14是2个整数而不是浮点数. (7认同)
  • @ Jean-FrançoisCorbett我想我还不够清楚.我的观点很简单,分隔符取决于您使用的语言,主要是历史上数字的表示方式.基于英语的语言和基于拉丁语的语言使用不兼容的系统,这就是为什么英国和前殖民地在你的列表中的特色.问候! (3认同)
  • 这是一个丹麦语csv文件,这里的逗号是标准的十进制分隔符.事实上,字段分隔符是";". (2认同)
  • @Jean-FrançoisCorbett 都是英联邦系统用户。点站立。 (2认同)

eyq*_*uem 6

使用正则表达式会更可靠

import re

decmark_reg = re.compile('(?<=\d),(?=\d)')

ss = 'abc , 2,5 def ,5,88 or (2,5, 8,12, 8945,3 )'

print ss
print decmark_reg.sub('.',ss)
Run Code Online (Sandbox Code Playgroud)

结果

abc , 2,5 def ,5,88 or (2,5, 8,12, 8945,3 )
abc , 2.5 def ,5.88 or (2.5, 8.12, 8945.3 )
Run Code Online (Sandbox Code Playgroud)

如果你想处理更复杂的情况(例如小数点之前没有数字的数字),我在下面的线程中检测所有类型的数字的正则表达可能对你有用:

stackoverflow.com/questions/5917082/regular-expression-to-match-numbers-with-or-without-commas-and-decimals-in-text/5929469