ATOF 返回无法将字符串转换为浮点数:“2, 5”

atof returns could not convert string to float: '2, 5'

提问人:jjk 提问时间:7/2/2020 更新时间:7/2/2020 访问量:972

问:

我正在尝试理解 atof 方法,但是,下面的块失败,主题标题出现错误:

 import locale
 s='2,5'
 x=locale.atof(s)

我能做些什么?

评论

1赞 EJoshuaS - Stand with Ukraine 7/2/2020
试试吧 - 你所拥有的在欧洲很常见,但在美国却不常见。2.5
5赞 gen_Eric 7/2/2020
您的区域设置是什么(即您在世界的哪个地方)?它可能想要(有一个句点)。该方法使用区域设置。LC_NUMERIC选项。2.5atof
3赞 EJoshuaS - Stand with Ukraine 7/2/2020
@SowjanyaRBhat 在这种情况下,这实际上并不那么明显 - 在欧洲部分地区(只是在美国不是)完全有效。(事实上,我碰巧知道这一点的唯一原因是我在一家德国公司工作)。2,5
1赞 EJoshuaS - Stand with Ukraine 7/2/2020
想想看,+1 来自我,因为它并不明显。

答:

5赞 dawg 7/2/2020 #1

实际上,您必须将语言环境设置为数字分隔符的位置,而不仅仅是导入模块。该类别LC_NUMERIC,

import locale
s='2,5'
locale.setlocale(locale.LC_NUMERIC, 'de_DE')  # 'de_DE' is just an example
x=locale.atof(s)

或者,如果您的操作系统环境设置为数字分隔符所在的区域设置,您通常可以按照以下语言环境文档中的建议执行操作:,

import locale
locale.setlocale(locale.LC_ALL, '')

这会将所有类别的区域设置设置为用户的默认设置 (通常在 LANG 环境变量中指定)。

评论

1赞 Dietrich Epp 7/2/2020
您可能更喜欢 ,因为这将使用用户的环境来选择语言环境,而不是硬编码。setlocale(locale.LC_NUMERIC, '')de_DE
0赞 dawg 7/2/2020
@DietrichEpp:举个例子,因为我不知道他的操作系统本地设置是什么......我补充了这个解释。谢谢!
0赞 jjk 7/2/2020
工程。不过需要添加utf8。locale.setlocale(locale.LC_NUMERIC, 'de_DE.utf8')
2赞 Tony Suffolk 66 7/2/2020 #2

您没有设置区域设置 - 所以我不知道它可能默认是什么;大概是系统默认值。

试试这个:

 import locale
 locale.setlocale(locale.LC_ALL, '')
 s='2,5'
 x=locale.atof(s)

这会将所有类别的区域设置设置为用户默认值。

那行得通吗?

评论

2赞 Dietrich Epp 7/2/2020
如果不设置区域设置,则会获得“C”区域设置。
0赞 Tony Suffolk 66 7/2/2020
@DietrichEpp - 什么是“C”语言环境 - 我从未接近过本地化
1赞 Dietrich Epp 7/2/2020
C 语言环境使用英语,但简化了规则。例如,仅在 C 语言环境中(但它在“en”语言环境中的行为可能有所不同)。请参见:unix.stackexchange.com/questions/87745/what-does-lc-all-c-dostrcoll()strcmp()
0赞 Tony Suffolk 66 7/2/2020
@DietrichEpp - 谢谢。我真的应该考虑如何对我的一些库进行适当的本地化。