【问题标题】:Convert Python strings into floats explicitly using the comma or the point as separators使用逗号或点作为分隔符将 Python 字符串显式转换为浮点数
【发布时间】:2012-11-13 14:04:00
【问题描述】:

如何明确告诉 python 使用点或逗号作为小数分隔符读取十进制数?我不知道将运行我的脚本的 PC 的本地化设置,这应该不会影响我的应用程序,我只想说:

f = read_float_with_point("3.14")

f = read_float_with_comma("3,14")

我认为写作

def read_float_with_comma(num):
    return float(num.replace(",", ".")

不安全,因为我不知道区域设置!

【问题讨论】:

    标签: python localization floating-point type-conversion


    【解决方案1】:

    因为我不知道区域设置

    您可以使用 locale module 进行查找:

    >>> locale.nl_langinfo(locale.RADIXCHAR)
    '.'
    

    >>> locale.localeconv()['decimal_point']
    '.'
    

    使用它,您的代码可以变成:

    import locale
    _locale_radix = locale.localeconv()['decimal_point']
    
    def read_float_with_comma(num):
        if _locale_radix != '.':
            num = num.replace(_locale_radix, ".")
        return float(num)
    

    更好的是,同一个模块有一个转换功能,称为atof()

    import locale
    
    def read_float_with_comma(num):
        return locale.atof(num)
    

    【讨论】:

    • 这将使用区域设置,这可能不是 diegogb 想要的。如果您需要在与当前不同的语言环境中输出/解析数据怎么办? locale 模块明确不鼓励更改库中的语言环境,因此此方法仅对简单脚本有效。
    • @jeckyll2hide:用于简单的脚本或桌面 GUI 程序或其他任何不需要为多个(联网)客户端提供服务的东西。
    • 嗯,不是真的:OP 想要强制一种独立于当前语言环境的格式。这意味着,要么重新发明轮子,实现他自己的函数来用逗号或点解析,要么强制使用他在每种情况下需要的语言环境。但是不鼓励更改区域设置并且速度很慢,因此使用此区域设置更改实现的任何应用程序都应该只执行一次(理想情况下在应用程序开始时)。这个应用程序将非常不灵活:它只会以预定义的格式解析/输出,更改它需要重新启动。我看不出这对 GUI 有什么好处。
    • @Martijn Pieters 仅使用是关键。将 "1.000.000,000" 之类的字符串仅使用基数转换为 "1.000.000.000" 将使代码无法使用。跨度>
    • @Martijn Pieters 如果向用户提出一种在他们的代码中创建预先已知的错误的方法不是“提出危险的事情”,那么可以。跨度>
    【解决方案2】:

    你可以使用locale.atof

    import locale
    locale.atof('12.3')
    

    http://docs.python.org/2/library/locale.html

    【讨论】:

      【解决方案3】:

      您可以使用babel 解析本地格式的小数:

      >>> parse_decimal('1,099.98', locale='en_US')
      Decimal('1099.98')
      >>> parse_decimal('1.099,98', locale='de')
      Decimal('1099.98')
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2011-11-25
      相关资源
      最近更新 更多