デジタルフォーマット設定

デジタルの地域固有設定のフォーマットと解析の支援 babel.numbers モジュール:

>>> from babel.numbers import format_number, format_decimal, format_percent

例:

>>> format_decimal(1.2345, locale='en_US')
u'1.234'
>>> format_decimal(1.2345, locale='sv_SE')
u'1,234'
>>> format_decimal(12345, locale='de_DE')
u'12.345'

モード文法

While Babel makes it simple to use the appropriate number format for a given locale, you can also force it to use custom patterns. As with date/time formatting patterns, the patterns Babel supports for number formatting are based on the Locale Data Markup Language specification (LDML).

例:

>>> format_decimal(-1.2345, format='#,##0.##;-#', locale='en')
u'-1.23'
>>> format_decimal(-1.2345, format='#,##0.##;(#)', locale='en')
u'(1.23)'

仕様では,番号フォーマットモデルをカスタマイズした文法を詳細に紹介した.次の表は比較的簡単な概要に過ぎない。

記号

説明する.

0

数字

1-9

‘1’から‘9’は四捨五入を表す.

@

有効数字

#

数字、ゼロは存在しないことを表す

.

小数セパレータまたは貨幣小数セパレータ

-

減号.

,

グループ分け子

E

科学記数法では仮数と指数を分ける

+

正指数の前に現地化プラス番号をつける

;

正負子パターンを区切る

%

100を乗じてパーセントで表示します

1000を乗じてミリ秒で表示します

¤

貨幣記号は、貨幣記号に置き換えられる。倍にすれば、国際通貨記号に置き換えられる。3倍数であれば,10進符号の長い形を用いる.

'

引用符接頭辞または接尾辞に使用される特殊な文字

*

フィラー変換は、文字を充填する前に位置します

切り込みモード

バベルタはPythonの Decimal タイプは、フォーマットされる前にデジタル丸めを実行し、ユーザは、アクティブ制御によって丸めモードおよび他の構成可能なパラメータを制御する機会がある。 Context 例を挙げましょう

デフォルトの場合、Python丸めモードは ROUND_HALF_EVEN それは一致している UTS #35 section 3.3 それがそうです。しかしながら、発信者は、デジタルまたは通貨をフォーマットする前に現在のコンテキストを調整する機会がある:

>>> from babel.numbers import decimal, format_decimal
>>> with decimal.localcontext(decimal.Context(rounding=decimal.ROUND_DOWN)):
>>>    txt = format_decimal(123.99, format='#', locale='en_US')
>>> txt
u'123'

まだ使えます decimal.setcontext 直接修正したり decimal.getcontext それがそうです。しかし,それらの能力を自動的に回復および入れ子するために,コンテキストマネージャを使用した方がつねに便利である.

どの仕組みを選んでも常に使っています decimal 以下の位置から導入したモジュール babel.numbers それがそうです。効率的な理由で、Babelは利用可能な最も速い10進実装を使用して、例えば cdecimal それがそうです。これらの異なる実装は、同じAPIを提供するが、それらのタイプおよびインスタンスは、同じAPIを提供する。 not 相互に相互操作を行う.

例えば、Python 2.7上で意外な結果を生成し、使用するために、前の例を少し修正することができる。 cdecimal インストールされたモジュール:

>>> from decimal import localcontext, Context, ROUND_DOWN
>>> from babel.numbers import format_decimal
>>> with localcontext(Context(rounding=ROUND_DOWN)):
>>>    txt = format_decimal(123.99, format='#', locale='en_US')
>>> txt
u'124'

精度のような他のパラメータを変更することも、デジタルフォーマット関数の結果を変更することができる。あなたのコードをテストして、その行動が期待通りになることを確実にしてください。

数字を解析する

Babelは地域設定を区別してデジタルデータを解析することもできます

>>> from babel.numbers import parse_decimal, parse_number

例:

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

注意:バージョン2.8.0から parse_number 関数の機能は限られている.これは、いくつかの領域に設定されたグループ記号をデジタル文字列から削除することができるが、その論理がより多くの符号化問題や他の特殊な場合を処理する前に、意外な行動が生じる可能性がある。

例:

>>> parse_number('1,099', locale='en_US')
1099
>>> parse_number('1.099.024', locale='de')
1099024
>>> parse_number('123' + u'\xa0' + '4567', locale='ru')
1234567
>>> parse_number('123 4567', locale='ru')
  ...
NumberFormatError: '123 4567' is not a valid number