转换小数点

时间:2011-08-18 11:08:19

标签: python locale decimal-point

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

如何将此作为2.5读入Python?

7 个答案:

答案 0 :(得分: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")

在使用此方法之前阅读this部分。

答案 1 :(得分:22)

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

如果value是一个很大的数字而.已被用于数千,您可以:

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

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

答案 2 :(得分:16)

Pandas支持开箱即用:

df = pd.read_csv(r'data.csv', decimal=',')

请参阅http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

答案 3 :(得分: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)

结果

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 )

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

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

答案 4 :(得分:3)

尝试用小数点替换所有小数点逗号:

floatAsStr = "2,5"
floatAsStr = floatAsStr.replace(",", ".");
myFloat = float(floatAsStr)

函数replace当然适用于任何子字符串,因为python现在可以区分char和string。

答案 5 :(得分:2)

首先,您必须确保使用哪种语言环境提供号码。如果不这样做,肯定会出现随机问题。

import locale

loc = locale.getlocale()  # get and save current locale
# use locale that provided the number;
# example if German locale was used:
locale.setlocale(locale.LC_ALL, 'de_DE')
pythonnumber = locale.atof(value)
locale.setlocale(locale.LC_ALL, loc)  # restore saved locale

答案 6 :(得分:0)

如果点用作千位分隔符,要交换逗号和点,您可以使用第三个符号作为临时占位符,如下所示:

value.replace('.', '#').replace(',', '.').replace('#', ',')

但是如果您想从字符串转换为浮点数,您可以删除任何点,然后用点替换任何逗号

float(value.replace('.', '').replace(',', '.'))

IMO 这是最易读的解决方案