我需要将"1.234.345,00"
格式的字符串转换为float
值{
一种方法是使用repeatedstr.replace
:
x = "1.234.345,00"
res = float(x.replace('.', '').replace(',', '.'))
print(res, type(res))
1234345.0 <class 'float'>
然而,这似乎是手动的和非通用的。这个heavily upvoted answer建议使用locale
库。但是我的默认区域设置与输入字符串没有相同的约定。然后,我发现了一种方法,可以提取当地惯例中使用的字符作为字典:
是否有方法更新此词典,另存为自定义区域设置,然后能够继续调用此自定义区域设置。比如:
mylocale = locale.create_new_locale() # "blank" conventions or copied from default
mylocale.localeconv()['thousands_sep'] = '.'
mylocale.localeconv()['decimal_point'] = ','
setlocale(LC_NUMERIC, mylocale)
atof('123.456,78') # 123456.78
如果这是不可能的,我们如何获得所有可用的语言环境及其约定的列表?似乎反模式可以从约定中“推断”正确的配置(更不用说低效/手动),所以我希望有一个通用的解决方案,比如上面的伪代码。在
{
import locale
from collections import defaultdict
d = defaultdict(list)
for alias in locale.locale_alias:
locale.setlocale(locale.LC_ALL, alias)
env = locale.localeconv()
d[(env['thousands_sep'], env['decimal_point'])].append(alias)
结果:
---------------------------------------------------------------------------
Error Traceback (most recent call last)
<ipython-input-164-f8f6a6db7637> in <module>()
5
6 for alias in locale.locale_alias:
----> 7 locale.setlocale(locale.LC_ALL, alias)
8 env = locale.localeconv()
9 d[(env['thousands_sep'], env['decimal_point'])].append(alias)
C:\Program Files\Anaconda3\lib\locale.py in setlocale(category, locale)
596 # convert to string
597 locale = normalize(_build_localename(locale))
--> 598 return _setlocale(category, locale)
599
600 def resetlocale(category=LC_ALL):
Error: unsupported locale setting
{为了测试源代码,你可以看到一个源代码。在
尝试以下操作似乎确实会在不更改整个区域设置的情况下重写字典,但可能会产生一些意外的后果,特别是因为更改区域设置不是线程安全的。小心!在
^{pr2}$Try it online!
你的问题有两个部分:
您可以同时使用令人惊叹的Babel库。在
如何以通用方式解析“1.234.345,00”?在
与
.
千位分隔符和,
十进制分隔符关联的一个区域设置是ger_de
,用于德语。在要解析它,只需使用
如何轻松找到与“1.234.345,00”关联的区域设置?在
使用此例程检查要根据所有区域设置的预期值进行分析的字符串,并返回兼容的值:
^{pr2}$例如:
额外的好处是:我怎样才能获得这些语言环境的可读版本?在
使用以下例程,其中
my_locale
应该是您自己的语言环境:然后可以这样使用它:
Try it online!
有件事,用巴别塔,对我有用。在
首先,您向它提供一些测试数据和您的期望值,然后它将构建一个分隔符字典,以匹配区域设置别名。在
然后你可以从那一点开始转换。在
输出:
^{pr2}$相关问题 更多 >
编程相关推荐