数字和货币

Number模块提供针对不同区域设置格式化数字的功能。这包括任意数字和货币。

数字格式化属性

babel.numbers.format_number(number: float | Decimal | str, locale: Locale | str | None = 'en_US') str

返回针对特定区域设置格式化的给定数字。

>>> format_number(1099, locale='en_US')  
u'1,099'
>>> format_number(1099, locale='de_DE')  
u'1.099'

自 2.6.0 版本弃用: 改用Babel.nums.format_decimal()。

参数:
  • number -- 要格式化的数字

  • locale -- 这个 Locale 对象或区域设置标识符

babel.numbers.format_decimal(number: float | decimal.Decimal | str, format: str | NumberPattern | None = None, locale: Locale | str | None = 'en_US', decimal_quantization: bool = True, group_separator: bool = True, *, numbering_system: Literal['default'] | str = 'latn') str

返回针对特定区域设置格式化的给定十进制数。

>>> format_decimal(1.2345, locale='en_US')
u'1.234'
>>> format_decimal(1.2346, locale='en_US')
u'1.235'
>>> format_decimal(-1.2346, locale='en_US')
u'-1.235'
>>> format_decimal(1.2345, locale='sv_SE')
u'1,234'
>>> format_decimal(1.2345, locale='de')
u'1,234'
>>> format_decimal(1.2345, locale='ar_EG', numbering_system='default')
u'1٫234'
>>> format_decimal(1.2345, locale='ar_EG', numbering_system='latn')
u'1.234'

每个区域设置都使用适当的千位分组和小数分隔符:

>>> format_decimal(12345.5, locale='en_US')
u'12,345.5'

默认情况下,允许区域设置通过将高精度数字的格式模式强制到小数部分来截断和舍入高精度数字。属性可以绕过此行为。 decimal_quantization 参数:

>>> format_decimal(1.2346, locale='en_US')
u'1.235'
>>> format_decimal(1.2346, locale='en_US', decimal_quantization=False)
u'1.2346'
>>> format_decimal(12345.67, locale='fr_CA', group_separator=False)
u'12345,67'
>>> format_decimal(12345.67, locale='en_US', group_separator=True)
u'12,345.67'
参数:
  • number -- 要格式化的数字

  • format --

  • locale -- 这个 Locale 对象或区域设置标识符

  • decimal_quantization -- 截断高精度数字并将其舍入到格式模式。默认为 True .

  • group_separator -- 用于以区域设置的数字格式打开/关闭组分隔符的布尔值。

  • numbering_system -- 用于格式化数字符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

抛出:

UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

babel.numbers.format_compact_decimal(number: float | decimal.Decimal | str, *, format_type: Literal['short', 'long'] = 'short', locale: Locale | str | None = 'en_US', fraction_digits: int = 0, numbering_system: Literal['default'] | str = 'latn') str

以紧凑形式返回针对特定区域设置格式化的给定十进制数。

>>> format_compact_decimal(12345, format_type="short", locale='en_US')
u'12K'
>>> format_compact_decimal(12345, format_type="long", locale='en_US')
u'12 thousand'
>>> format_compact_decimal(12345, format_type="short", locale='en_US', fraction_digits=2)
u'12.34K'
>>> format_compact_decimal(1234567, format_type="short", locale="ja_JP")
u'123万'
>>> format_compact_decimal(2345678, format_type="long", locale="mk")
u'2 милиони'
>>> format_compact_decimal(21000000, format_type="long", locale="mk")
u'21 милион'
>>> format_compact_decimal(12345, format_type="short", locale='ar_EG', fraction_digits=2, numbering_system='default')
u'12٫34 ألف'
参数:
  • number -- 要格式化的数字

  • format_type -- 要使用的紧凑格式(“短”或“长”)

  • locale -- 这个 Locale 对象或区域设置标识符

  • fraction_digits -- 要使用的小数点后的位数。默认为 0

  • numbering_system -- 用于格式化数字符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

抛出:

UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

babel.numbers.format_currency(number: float | decimal.Decimal | str, currency: str, format: str | NumberPattern | None = None, locale: Locale | str | None = 'en_US', currency_digits: bool = True, format_type: Literal['name', 'standard', 'accounting'] = 'standard', decimal_quantization: bool = True, group_separator: bool = True, *, numbering_system: Literal['default'] | str = 'latn') str

返回格式化的货币值。

>>> format_currency(1099.98, 'USD', locale='en_US')
'$1,099.98'
>>> format_currency(1099.98, 'USD', locale='es_CO')
u'US$1.099,98'
>>> format_currency(1099.98, 'EUR', locale='de_DE')
u'1.099,98\xa0\u20ac'
>>> format_currency(1099.98, 'EGP', locale='ar_EG', numbering_system='default')
u'‏1٬099٫98 ج.م.‏'

格式也可以显式指定。货币是用‘’标志放置的。随着符号的重复,格式扩展(?是符号,?是货币缩写,?是货币的全称):

>>> format_currency(1099.98, 'EUR', u'¤¤ #,##0.00', locale='en_US')
u'EUR 1,099.98'
>>> format_currency(1099.98, 'EUR', u'#,##0.00 ¤¤¤', locale='en_US')
u'1,099.98 euros'

货币通常有特定数量的小数位。此函数优先于给定格式的信息:

>>> format_currency(1099.98, 'JPY', locale='en_US')
u'\xa51,100'
>>> format_currency(1099.98, 'COP', u'#,##0.00', locale='es_ES')
u'1.099,98'

但是,通过将最后一个参数设置为,可以覆盖货币信息中的小数位数 False

>>> format_currency(1099.98, 'JPY', locale='en_US', currency_digits=False)
u'\xa51,099.98'
>>> format_currency(1099.98, 'COP', u'#,##0.00', locale='es_ES', currency_digits=False)
u'1.099,98'

如果未指定格式,则可以指定区域设置中要使用的货币格式的类型:

>>> format_currency(1099.98, 'EUR', locale='en_US', format_type='standard')
u'\u20ac1,099.98'

当给定的货币格式类型不可用时,将引发异常:

>>> format_currency('1099.98', 'EUR', locale='root', format_type='unknown')
Traceback (most recent call last):
    ...
UnknownCurrencyFormatError: "'unknown' is not a known currency format type"
>>> format_currency(101299.98, 'USD', locale='en_US', group_separator=False)
u'$101299.98'
>>> format_currency(101299.98, 'USD', locale='en_US', group_separator=True)
u'$101,299.98'

您还可以传递format_type=‘name’以使用长显示名称。数字和货币名称的顺序以及货币名称的正确本地化复数形式根据区域设置进行选择:

>>> format_currency(1, 'USD', locale='en_US', format_type='name')
u'1.00 US dollar'
>>> format_currency(1099.98, 'USD', locale='en_US', format_type='name')
u'1,099.98 US dollars'
>>> format_currency(1099.98, 'USD', locale='ee', format_type='name')
u'us ga dollar 1,099.98'

默认情况下,允许区域设置通过将高精度数字的格式模式强制到小数部分来截断和舍入高精度数字。属性可以绕过此行为。 decimal_quantization 参数:

>>> format_currency(1099.9876, 'USD', locale='en_US')
u'$1,099.99'
>>> format_currency(1099.9876, 'USD', locale='en_US', decimal_quantization=False)
u'$1,099.9876'
参数:
  • number -- 要格式化的数字

  • currency -- 货币代码

  • format -- 要使用的格式字符串

  • locale -- 这个 Locale 对象或区域设置标识符

  • currency_digits -- 使用货币的自然小数位数

  • format_type -- 要使用的货币格式类型

  • decimal_quantization -- 截断高精度数字并将其舍入到格式模式。默认为 True .

  • group_separator -- 用于以区域设置的数字格式打开/关闭组分隔符的布尔值。

  • numbering_system -- 用于格式化数字符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

抛出:

UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

babel.numbers.format_compact_currency(number: float | decimal.Decimal | str, currency: str, *, format_type: Literal['short'] = 'short', locale: Locale | str | None = 'en_US', fraction_digits: int = 0, numbering_system: Literal['default'] | str = 'latn') str

将数字格式化为紧凑形式的货币值。

>>> format_compact_currency(12345, 'USD', locale='en_US')
u'$12K'
>>> format_compact_currency(123456789, 'USD', locale='en_US', fraction_digits=2)
u'$123.46M'
>>> format_compact_currency(123456789, 'EUR', locale='de_DE', fraction_digits=1)
'123,5 Mio. €'
参数:
  • number -- 要格式化的数字

  • currency -- 货币代码

  • format_type -- 要使用的紧凑格式类型。默认为“短”。

  • locale -- 这个 Locale 对象或区域设置标识符

  • fraction_digits -- 要使用的小数点后的位数。默认为 0

  • numbering_system -- 用于格式化数字符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

抛出:

UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

babel.numbers.format_percent(number: float | decimal.Decimal | str, format: str | NumberPattern | None = None, locale: Locale | str | None = 'en_US', decimal_quantization: bool = True, group_separator: bool = True, *, numbering_system: Literal['default'] | str = 'latn') str

返回特定区域设置的格式化百分比值。

>>> format_percent(0.34, locale='en_US')
u'34%'
>>> format_percent(25.1234, locale='en_US')
u'2,512%'
>>> format_percent(25.1234, locale='sv_SE')
u'2\xa0512\xa0%'
>>> format_percent(25.1234, locale='ar_EG', numbering_system='default')
u'2٬512%'

还可以显式指定格式模式:

>>> format_percent(25.1234, u'#,##0‰', locale='en_US')
u'25,123‰'

默认情况下,允许区域设置通过将高精度数字的格式模式强制到小数部分来截断和舍入高精度数字。属性可以绕过此行为。 decimal_quantization 参数:

>>> format_percent(23.9876, locale='en_US')
u'2,399%'
>>> format_percent(23.9876, locale='en_US', decimal_quantization=False)
u'2,398.76%'
>>> format_percent(229291.1234, locale='pt_BR', group_separator=False)
u'22929112%'
>>> format_percent(229291.1234, locale='pt_BR', group_separator=True)
u'22.929.112%'
参数:
  • number -- 要格式化的百分比数字

  • format --

  • locale -- 这个 Locale 对象或区域设置标识符

  • decimal_quantization -- 截断高精度数字并将其舍入到格式模式。默认为 True .

  • group_separator -- 用于以区域设置的数字格式打开/关闭组分隔符的布尔值。

  • numbering_system -- 用于格式化数字符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

抛出:

UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

babel.numbers.format_scientific(number: float | decimal.Decimal | str, format: str | NumberPattern | None = None, locale: Locale | str | None = 'en_US', decimal_quantization: bool = True, *, numbering_system: Literal['default'] | str = 'latn') str

为特定区域设置以科学记数法格式化的返回值。

>>> format_scientific(10000, locale='en_US')
u'1E4'
>>> format_scientific(10000, locale='ar_EG', numbering_system='default')
u'1اس4'

还可以显式指定格式模式:

>>> format_scientific(1234567, u'##0.##E00', locale='en_US')
u'1.23E06'

默认情况下,允许区域设置通过将高精度数字的格式模式强制到小数部分来截断和舍入高精度数字。属性可以绕过此行为。 decimal_quantization 参数:

>>> format_scientific(1234.9876, u'#.##E0', locale='en_US')
u'1.23E3'
>>> format_scientific(1234.9876, u'#.##E0', locale='en_US', decimal_quantization=False)
u'1.2349876E3'
参数:
  • number -- 要格式化的数字

  • format --

  • locale -- 这个 Locale 对象或区域设置标识符

  • decimal_quantization -- 截断高精度数字并将其舍入到格式模式。默认为 True .

  • numbering_system -- 用于格式化数字符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

抛出:

UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

数字解析

babel.numbers.parse_number(string: str, locale: Locale | str | None = 'en_US', *, numbering_system: Literal['default'] | str = 'latn') int

将本地化数字字符串解析为整数。

>>> parse_number('1,099', locale='en_US')
1099
>>> parse_number('1.099', locale='de_DE')
1099

当无法解析给定字符串时,将引发异常:

>>> parse_number('1.099,98', locale='de')
Traceback (most recent call last):
    ...
NumberFormatError: '1.099,98' is not a valid number
参数:
  • string -- 要分析的字符串

  • locale -- 这个 Locale 对象或区域设置标识符

  • numbering_system -- 用于格式化数字符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

返回:

解析的数字

抛出:
  • NumberFormatError -- 如果字符串无法转换为数字

  • UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

babel.numbers.parse_decimal(string: str, locale: Locale | str | None = 'en_US', strict: bool = False, *, numbering_system: Literal['default'] | str = 'latn') decimal.Decimal

将本地化的十进制字符串解析为小数。

>>> parse_decimal('1,099.98', locale='en_US')
Decimal('1099.98')
>>> parse_decimal('1.099,98', locale='de')
Decimal('1099.98')
>>> parse_decimal('12 345,123', locale='ru')
Decimal('12345.123')
>>> parse_decimal('1٬099٫98', locale='ar_EG', numbering_system='default')
Decimal('1099.98')

当无法解析给定字符串时,将引发异常:

>>> parse_decimal('2,109,998', locale='de')
Traceback (most recent call last):
    ...
NumberFormatError: '2,109,998' is not a valid decimal number

如果 strict 设置为 True 并且给定的字符串包含以不规则方式格式化的数字,则会引发异常:

>>> parse_decimal('30.00', locale='de', strict=True)
Traceback (most recent call last):
    ...
NumberFormatError: '30.00' is not a properly formatted decimal number. Did you mean '3.000'? Or maybe '30,00'?
>>> parse_decimal('0.00', locale='de', strict=True)
Traceback (most recent call last):
    ...
NumberFormatError: '0.00' is not a properly formatted decimal number. Did you mean '0'?
参数:
  • string -- 要分析的字符串

  • locale -- 这个 Locale 对象或区域设置标识符

  • strict -- 控制是接受还是拒绝以奇怪方式格式化的数字

  • numbering_system -- 用于格式化数字符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

抛出:
  • NumberFormatError -- 如果字符串无法转换为十进制数

  • UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

例外情况

exception babel.numbers.NumberFormatError(message: str, suggestions: list[str] | None = None)

当字符串无法分析为数字时引发的异常。

suggestions

从无效输入派生的格式正确的数字列表

数据访问

babel.numbers.get_currency_name(currency: str, count: float | Decimal | None = None, locale: Locale | str | None = 'en_US') str

返回指定货币的区域设置使用的名称。

>>> get_currency_name('USD', locale='en_US')
u'US Dollar'

在 0.9.4 版本加入.

参数:
  • currency -- 货币代码。

  • count -- 可选计数。如果提供,货币名称将被复数化为该数字(如果可能)。

  • locale -- 这个 Locale 对象或区域设置标识符。

babel.numbers.get_currency_symbol(currency: str, locale: Locale | str | None = 'en_US') str

返回指定货币的区域设置使用的符号。

>>> get_currency_symbol('USD', locale='en_US')
u'$'
参数:
  • currency -- 货币代码。

  • locale -- 这个 Locale 对象或区域设置标识符。

babel.numbers.get_currency_unit_pattern(currency: str, count: float | Decimal | None = None, locale: Locale | str | None = 'en_US') str

返回用于长时间显示给定区域设置货币值的单位模式。这是一个包含以下内容的字符串 {{0}} 其中数字部分应被替换,并且 {{1}} 其中应替换货币长显示名称。

>>> get_currency_unit_pattern('USD', locale='en_US', count=10)
u'{0} {1}'

在 2.7.0 版本加入.

参数:
  • currency -- 货币代码。

  • count -- 可选计数。如果提供,将返回该号码的单位模式。

  • locale -- 这个 Locale 对象或区域设置标识符。

babel.numbers.get_decimal_symbol(locale: Locale | str | None = 'en_US', *, numbering_system: Literal['default'] | str = 'latn') str

返回区域设置用于分隔小数的符号。

>>> get_decimal_symbol('en_US')
u'.'
>>> get_decimal_symbol('ar_EG', numbering_system='default')
u'٫'
>>> get_decimal_symbol('ar_EG', numbering_system='latn')
u'.'
参数:
  • locale -- 这个 Locale 对象或区域设置标识符

  • numbering_system -- 用于获取符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

抛出:

UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

babel.numbers.get_plus_sign_symbol(locale: Locale | str | None = 'en_US', *, numbering_system: Literal['default'] | str = 'latn') str

返回当前区域设置使用的加号符号。

>>> get_plus_sign_symbol('en_US')
u'+'
>>> get_plus_sign_symbol('ar_EG', numbering_system='default')
u'؜+'
>>> get_plus_sign_symbol('ar_EG', numbering_system='latn')
u'‎+'
参数:
  • locale -- 这个 Locale 对象或区域设置标识符

  • numbering_system -- 用于获取符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

抛出:

UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

babel.numbers.get_minus_sign_symbol(locale: Locale | str | None = 'en_US', *, numbering_system: Literal['default'] | str = 'latn') str

返回当前区域设置使用的加号符号。

>>> get_minus_sign_symbol('en_US')
u'-'
>>> get_minus_sign_symbol('ar_EG', numbering_system='default')
u'؜-'
>>> get_minus_sign_symbol('ar_EG', numbering_system='latn')
u'‎-'
参数:
  • locale -- 这个 Locale 对象或区域设置标识符

  • numbering_system -- 用于获取符号的编号系统。默认为“latn”。特殊值“Default”将使用区域设置的默认编号系统。

抛出:

UnsupportedNumberingSystemError -- 如果区域设置不支持编号系统。

babel.numbers.get_territory_currencies(territory: str, start_date: date | None = None, end_date: date | None = None, tender: bool = True, non_tender: bool = False, include_details: Literal[False] = False) list[str]
babel.numbers.get_territory_currencies(territory: str, start_date: date | None = None, end_date: date | None = None, tender: bool = True, non_tender: bool = False, include_details: Literal[True] = False) list[dict[str, Any]]

返回给定地区在给定日期范围内有效的货币列表。除此之外,货币数据库区分投标货币和非投标货币。默认情况下,只返回投标货币。

返回值是按货币激活时间大致排序的所有货币的列表。货币使用的时间越长,它就会在列表的左边越多。

开始日期默认为今天。如果没有指定结束日期,它将与开始日期相同。否则,可以定义范围。例如,这可以用来查找1995至2011年间奥地利使用的货币:

>>> from datetime import date
>>> get_territory_currencies('AT', date(1995, 1, 1), date(2011, 1, 1))
['ATS', 'EUR']

同样,也可以在一个日期找到所有正在使用的货币:

>>> get_territory_currencies('AT', date(1995, 1, 1))
['ATS']
>>> get_territory_currencies('AT', date(2011, 1, 1))
['EUR']

默认情况下,返回值仅包括投标货币。但是,这是可以更改的:

>>> get_territory_currencies('US')
['USD']
>>> get_territory_currencies('US', tender=False, non_tender=True,
...                          start_date=date(2014, 1, 1))
['USN', 'USS']

在 2.0 版本加入.

参数:
  • territory -- 要查找货币的地区名称。

  • start_date -- 开始日期。如果没有给出,假设是今天。

  • end_date -- 结束日期。如果没有给定,则假定开始日期。

  • tender -- 控制是否应包括投标货币。

  • non_tender -- 控制是否应包括非投标货币。

  • include_details -- 如果设置为 True ,返回值将是带有详细信息的字典,而不是返回货币代码。在这种情况下,每个字典都将有关键字 'currency''from''to''tender' .