【问题标题】:Format numbers as currency in Python在 Python 中将数字格式化为货币
【发布时间】:2016-10-01 11:22:19
【问题描述】:

我向Currency formatting in Python 学习,使用locale 模块将数字格式化为货币。例如,

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import locale

value = 123456789

l = locale.setlocale(locale.LC_ALL, '')     # LC_CTYPE=en_US.UTF-8;LC_NUMERIC=fr_FR.UTF-8;LC_TIME=fr_FR.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=fr_FR.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=fr_FR.UTF-8;LC_NAME=fr_FR.UTF-8;LC_ADDRESS=fr_FR.UTF-8;LC_TELEPHONE=fr_FR.UTF-8;LC_MEASUREMENT=fr_FR.UTF-8;LC_IDENTIFICATION=fr_FR.UTF-8
s = locale.currency(value, grouping=True)   # 123 456 789,00 €

locale.setlocale(locale.LC_ALL, 'en_US.utf-8') 
s = locale.currency(value, grouping=True)   # $123,456,789.00

locale.setlocale(locale.LC_ALL, 'en_US')    # WHY? locale.Error: unsupported locale setting
s = locale.currency(value, grouping=True)

我想将数字格式化为其他货币,例如de_DE。我遇到了locale.Error: unsupported locale setting 的问题,因为语言环境de_DE 不在locale -a 的列表中。

locale.setlocale(locale.LC_ALL, 'de_DE')        # locale.Error: unsupported locale setting
s = locale.currency(value, grouping=True)

一种解决方案是将此语言环境添加到我的机器上。有没有更好的办法?

【问题讨论】:

    标签: python locale currency-formatting


    【解决方案1】:

    我知道有两种解决方案:

    通天塔

    Babel 是最佳解决方案,因为您可以选择任何货币,而无需考虑区域设置。

    缺点是它的文档记录很差。要了解所有选项,您必须阅读 Babel source code 以了解您要使用的功能

    安装 Babel:

    $ pip install Babel
    

    使用方法:

    import babel.numbers
    
    amount = 123456789.123
    
    print(babel.numbers.format_currency(amount, 'EUR', locale='fr_CA'))
    # 123 456 789,12 €
    
    print(babel.numbers.format_currency(amount, 'EUR', locale='en_CA'))
    # €123,456,789.12
    
    print(babel.numbers.format_currency(amount, '', locale='en_CA'))
    # 123,456,789.12
    

    localize.currency()

    locale.currency() 的一个限制是它假定货币与区域设置匹配。例如en_US => $/USDfr_FR => €/EUR,所以如果显示的货币与区域设置不匹配,您可能需要使用String.replace() 方法替换货币符号。

    根据区域设置,例如en_USen_GBfr_FRfr_CA,它会知道:

    • 使用哪个小数点分隔符(例如 100.00100,00
    • 使用哪个千位分隔符(例如 1,0001.000
    • 使用哪种货币符号(例如$100 vs €100USD 100 vs EUR 100
    • 货币符号的放置位置(例如$100 vs 100 $
    import locale
    
    locale.setlocale(locale.LC_ALL, 'fr_FR')
    
    amount = 123456789.123
    grouping = True  # thousands separator
    
    # '123.456.789,12 Eu'
    locale.currency(amount, symbol=True, grouping=True, international=False)
    
    # '123.456.789,12 EUR'
    locale.currency(amount, symbol=True, grouping=True, international=False)
    
    # '123.456,789'
    locale.currency(amount, symbol=False, grouping=True)
    
    # '123456,789'
    locale.currency(amount, symbol=False, grouping=True)
    

    可选参数如下

    # which currency symbol to use, and where to place it
    symbol=True and international=True # => 'USD 100.00'
    symbol=True and international=False # => '$100.00'
    symbol=False # => '100.00'
    
    # thousands separator
    grouping = True # => '1000.00'
    grouping = False # => '1,000.00'
    

    【讨论】:

      【解决方案2】:

      作为参考(对于那些希望格式化数字类似于格式化货币的人),您可以使用 locale.format_string 格式化数字

      value = 123456789
      
      import locale
      locale.setlocale(locale.LC_ALL, 'de_DE') 
      print(locale.format_string('%.2f', value, True))
      

      会回来

      123.456.789,00
      

      【讨论】:

      • 这似乎不适用于 python 3.7.6。我使用包 babel 和 format_number 代替。
      【解决方案3】:

      babel.numbers

      In [22]: from babel.numbers import format_decimal
      In [23]:  format_decimal(12345, locale='de_DE')
      Out[23]: u'12.345'
      
      In [24]: format_decimal(1.2345, locale='sv_SE')
      Out[24]: u'1,234'
      

      或者在你的情况下format_currency

      In [7]: from babel.numbers import format_currency
      
      In [8]: print format_currency(1099.98, 'USD', locale='en_US')
      $1,099.98
      
      In [9]: print format_currency(1099.98, 'USD', locale='es_CO')
      1.099,98 US$
      
      In [10]: print format_currency(1099.98, 'EUR', locale='de_DE')
      1.099,98 €
      

      【讨论】:

      • 谢谢。我刚刚在您的指导下找到了babel.numbers.format_currency
      • 不用担心,它是一个非常简洁的库,它可以做很多事情。我添加了指向 format_currency 和文档示例的链接。
      • 我知道如果你通过语言环境,你可以在没有美元符号的情况下进行解析,但使用$123,456,789.00 我不确定你如何或是否可以处理它。 babel.pocoo.org/en/latest/numbers.html#parsing-numbers
      • 没有问题,我实际上有一个可以适用于任何货币的解析器的想法,当我得到一些工作时我会给你一个 ping 但希望已经有一个不错的库
      • 我重新打开了这个问题,因为它肯定不是骗子,从格式化的货币字符串回到小数还有很多
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      相关资源
      最近更新 更多