gpt4 book ai didi

python - 用于浮点转换的自定义语言环境配置

转载 作者:太空狗 更新时间:2023-10-29 18:07:29 25 4
gpt4 key购买 nike

我需要将格式为 "1.234.345,00" 的字符串转换为 float1234345.00

一种方法是使用重复的str.replace:

x = "1.234.345,00"
res = float(x.replace('.', '').replace(',', '.'))

print(res, type(res))
1234345.0 <class 'float'>

但是,这似乎是手动的且非通用的。这个 heavily upvoted answer 建议使用 locale 库。但是我的默认语言环境与我的输入字符串没有相同的约定。然后我发现了一种方法来提取本地约定中使用的字符作为字典:

import locale

print(locale.localeconv())

{'int_curr_symbol': '', 'currency_symbol': '', 'mon_decimal_point': '',
..., 'decimal_point': '.', 'thousands_sep': '', 'grouping': []}

有没有办法更新这个字典,保存为自定义语言环境,然后能够调用这个自定义语言环境。像这样的东西:

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

如果这不可能,我们如何获得所有可用语言环境及其约定的列表?从约定中“推断”正确配置似乎是反模式(更不用说低效/手动),所以我希望有一个通用的解决方案,例如上面的伪代码。


编辑:这是我尝试查找所有 thousands_sep == '.'decimal_point == ',' 的语言环境。事实上,更一般地说,通过这些参数的组合对语言环境进行分组:

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

最佳答案

如果打开 locale 的源代码,您会看到有一个名为 _override_localeconv 的变量(这似乎是用于测试目的)。

# With this dict, you can override some items of localeconv's return value.
# This is useful for testing purposes.
_override_localeconv = {}

尝试以下操作似乎确实会在不更改整个语言环境的情况下覆盖字典,尽管它可能会产生一些意想不到的后果,尤其是因为更改语言环境不是线程安全的。小心!

import locale

locale._override_localeconv["thousands_sep"] = "."
locale._override_localeconv["decimal_point"] = ","

print locale.atof('123.456,78')

Try it online!

关于python - 用于浮点转换的自定义语言环境配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51912028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com