Intl.NumberFormat

公開日: · タグ: Intl

最新の環境では既にしばらくの間サポートされているため、Intl.NumberFormat API には既に精通しているかもしれません。

  • Chrome: バージョン 24 からサポート
  • Firefox: バージョン 29 からサポート
  • Safari: バージョン 10 からサポート
  • Node.js: バージョン 0.12 からサポート
  • Babel: サポート済み

最も基本的な形式では、Intl.NumberFormat を使用すると、ロケール対応の数字フォーマットをサポートする再利用可能なフォーマッターインスタンスを作成できます。他の Intl.*Format API と同様に、フォーマッターインスタンスは format メソッドと formatToParts メソッドの両方をサポートしています。

const formatter = new Intl.NumberFormat('en');
formatter.format(987654.321);
// → '987,654.321'
formatter.formatToParts(987654.321);
// → [
// → { type: 'integer', value: '987' },
// → { type: 'group', value: ',' },
// → { type: 'integer', value: '654' },
// → { type: 'decimal', value: '.' },
// → { type: 'fraction', value: '321' }
// → ]

注: Intl.NumberFormat の機能の多くは Number.prototype.toLocaleString を使用して実現できますが、Intl.NumberFormat は再利用可能なフォーマッターインスタンスを作成できるため、多くの場合、より効率的 な選択肢となります。

最近、Intl.NumberFormat API にいくつかの新しい機能が追加されました。

BigInt のサポート #

Number に加えて、Intl.NumberFormatBigInt もフォーマットできるようになりました。

const formatter = new Intl.NumberFormat('fr');
formatter.format(12345678901234567890n);
// → '12 345 678 901 234 567 890'
formatter.formatToParts(123456n);
// → [
// → { type: 'integer', value: '123' },
// → { type: 'group', value: ' ' },
// → { type: 'integer', value: '456' }
// → ]

測定単位 #

Intl.NumberFormat は、現在、以下のいわゆる *単純な単位* をサポートしています。

  • 角度: degree (度)
  • 面積: acre (エーカー), hectare (ヘクタール)
  • 濃度: percent (パーセント)
  • デジタル: bit (ビット), byte (バイト), kilobit (キロビット), kilobyte (キロバイト), megabit (メガビット), megabyte (メガバイト), gigabit (ギガビット), gigabyte (ギガバイト), terabit (テラビット), terabyte (テラバイト), petabyte (ペタバイト)
  • 期間: millisecond (ミリ秒), second (秒), minute (分), hour (時間), day (日), week (週), month (月), year (年)
  • 長さ: millimeter (ミリメートル), centimeter (センチメートル), meter (メートル), kilometer (キロメートル), inch (インチ), foot (フィート), yard (ヤード), mile (マイル), mile-scandinavian (スカンジナビアマイル)
  • 質量: gram (グラム), kilogram (キログラム), ounce (オンス), pound (ポンド), stone (ストーン)
  • 温度: celsius (摂氏), fahrenheit (華氏)
  • 体積: liter (リットル), milliliter (ミリリットル), gallon (ガロン), fluid-ounce (液量オンス)

ローカライズされた単位で数値をフォーマットするには、style オプションと unit オプションを使用します。

const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'kilobyte',
});
formatter.format(1.234);
// → '1.234 kB'
formatter.format(123.4);
// → '123.4 kB'

時間の経過とともに、より多くの単位のサポートが追加される可能性があります。 最新のリストについては、仕様書を参照してください。

上記の単純な単位は、任意の分子と分母のペアに組み合わせて、「リットル/エーカー」や「メートル/秒」などの複合単位を表すことができます。

const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'meter-per-second',
});
formatter.format(299792458);
// → '299,792,458 m/s'
  • Chrome: バージョン 77 からサポート
  • Firefox: サポートされていません
  • Safari: サポートされていません
  • Node.js: サポートされていません
  • Babel: サポートされていません

コンパクト表記、科学表記、工学表記 #

*コンパクト表記* は、ロケール固有の記号を使用して大きな数を表します。科学表記法よりも人間に優しい代替手段です。

{
// Test standard notation.
const formatter = new Intl.NumberFormat('en', {
notation: 'standard', // This is the implied default.
});
formatter.format(1234.56);
// → '1,234.56'
formatter.format(123456);
// → '123,456'
formatter.format(123456789);
// → '123,456,789'
}

{
// Test compact notation.
const formatter = new Intl.NumberFormat('en', {
notation: 'compact',
});
formatter.format(1234.56);
// → '1.2K'
formatter.format(123456);
// → '123K'
formatter.format(123456789);
// → '123M'
}

注: デフォルトでは、コンパクト表記は最も近い整数に丸めますが、常に2桁の有効数字を保持します。 {minimum,maximum}FractionDigits または {minimum,maximum}SignificantDigits を設定して、その動作をオーバーライドできます。

Intl.NumberFormat は、科学表記法で数値をフォーマットすることもできます。

const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'meter-per-second',
notation: 'scientific',
});
formatter.format(299792458);
// → '2.998E8 m/s'

工学表記もサポートされています。

const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'meter-per-second',
notation: 'engineering',
});
formatter.format(299792458);
// → '299.792E6 m/s'
  • Chrome: バージョン 77 からサポート
  • Firefox: サポートされていません
  • Safari: サポートされていません
  • Node.js: サポートされていません
  • Babel: サポートされていません

符号の表示 #

特定の状況(デルタの表示など)では、数値が正の場合でも符号を明示的に表示すると役立ちます。新しい signDisplay オプションでこれが可能になります。

const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'percent',
signDisplay: 'always',
});
formatter.format(-12.34);
// → '-12.34%'
formatter.format(12.34);
// → '+12.34%'
formatter.format(0);
// → '+0%'
formatter.format(-0);
// → '-0%'

値が 0 のときに符号が表示されないようにするには、signDisplay: 'exceptZero' を使用します。

const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'percent',
signDisplay: 'exceptZero',
});
formatter.format(-12.34);
// → '-12.34%'
formatter.format(12.34);
// → '+12.34%'
formatter.format(0);
// → '0%'
// Note: -0 still displays with a sign, as you’d expect:
formatter.format(-0);
// → '-0%'

通貨の場合、`currencySign` オプションは *会計フォーマット* を有効にします。これは、負の通貨金額に対してロケール固有のフォーマットを有効にします。たとえば、金額を括弧で囲みます。

const formatter = new Intl.NumberFormat('en', {
style: 'currency',
currency: 'USD',
signDisplay: 'exceptZero',
currencySign: 'accounting',
});
formatter.format(-12.34);
// → '($12.34)'
formatter.format(12.34);
// → '+$12.34'
formatter.format(0);
// → '$0.00'
formatter.format(-0);
// → '($0.00)'
  • Chrome: バージョン 77 からサポート
  • Firefox: サポートされていません
  • Safari: サポートされていません
  • Node.js: サポートされていません
  • Babel: サポートされていません

詳細情報 #

関連する 仕様書提案 には、個々の Intl.NumberFormat 機能を検出する方法のガイダンスなど、詳細な情報と例が記載されています。