ドラフト ECMA-402 / 2025年10月13日

ECMAScript® 2026 国際化 API 仕様書

この仕様への貢献方法

この仕様書は、ECMAScriptコミュニティの協力のもと、GitHubで開発されています。仕様書の作成に貢献する方法はいくつかあります:

この文書の作成方法については、奥付 を参照してください。

はじめに

この仕様書のソースは https://github.com/tc39/ecma402 にあります。

ECMAScript 2026 国際化 API 仕様書(ECMA-402 第13版)は、ECMA-262 を補完するための主要な言語依存機能を提供します。その機能は、Unicode用国際化コンポーネント(ICU)ライブラリ (https://unicode-org.github.io/icu-docs/)、.NETフレームワーク、Javaプラットフォームなど、よく知られた国際化APIから選定されています。

第1版APIは、Nebojša Ćirić および Jungshik Shin の提案に基づき、2010年9月に Ecma TC39 により設立されたアドホックグループによって開発されました。

第2版APIは、2015年6月の総会にて、ECMAScript第6版の補完として採用されました。

第3版APIは、Ecma TC39の新しい年次リリースサイクルと公開開発プロセスのもとで初めてリリースされた版です。プレーンテキストのソース文書がECMA-402ソースから構築され、以降の開発の基盤として完全にGitHub上で進められました。この標準の開発期間中に、数十件のプルリクエストと課題が提出され、バグ修正や編集修正、その他の改善がなされました。さらに、Ecmarkup、Ecmarkdown、Grammarkdown など多くのソフトウェアツールもこの活動を支援するために開発されました。

多くの組織を代表する数十人が Ecma TC39 のもと、この版および過去の版の開発へ非常に重要な貢献をしてきました。加えて、TC39のECMAScript活動を支える活発なコミュニティが形成され、数多くのドラフトのレビュー、バグ報告、実装実験、テストスイートの提供、世界中の開発者コミュニティへのECMAScript国際化の普及が行われています。残念ながら、この活動への全ての個人や組織を特定し、感謝を表することは不可能です。

Norbert Lindenberg
ECMA-402 第1版プロジェクト編集者

Rick Waldron
ECMA-402 第2版プロジェクト編集者

Caridy Patiño
ECMA-402 第3~5版プロジェクト編集者

Caridy Patiño, Daniel Ehrenberg, Leo Balter
ECMA-402 第6版プロジェクト編集者

Leo Balter, Valerie Young, Isaac Durazo
ECMA-402 第7版プロジェクト編集者

Leo Balter, Richard Gibson
ECMA-402 第8版プロジェクト編集者

Leo Balter, Richard Gibson, Ujjwal Sharma
ECMA-402 第9版プロジェクト編集者

Richard Gibson, Ujjwal Sharma
ECMA-402 第10版プロジェクト編集者

Richard Gibson, Ujjwal Sharma
ECMA-402 第11版プロジェクト編集者

Ben Allen, Richard Gibson, Ujjwal Sharma
ECMA-402 第12版プロジェクト編集者

Ben Allen, Richard Gibson, Ujjwal Sharma
ECMA-402 第13版プロジェクト編集者

1 適用範囲

本規格は、異なる人間の言語や国で用いられる言語的・文化的慣習に対応する必要があるプログラムを支援するECMAScriptオブジェクトのアプリケーションプログラミングインターフェースを定義します。

2 適合性

この仕様への適合実装は、ECMA-262 に準拠し、本仕様書に記載されたすべてのオブジェクト、プロパティ、関数、プログラムの意味論を提供・サポートしなければなりません。本仕様のいかなる内容も、ECMA-262 により禁止されている動作を許可することを意図していません。そのような矛盾は、ECMA-262 の制約を上書きするものではなく、編集上の誤りとみなすべきです。

適合実装は、本仕様書に記載されているもの以外の追加のオブジェクト、プロパティ、関数を提供しても差し支えありません。特に、適合実装は本仕様書で記述されていないプロパティや、その値を本仕様書に記載されたオブジェクトに対して提供することができます。ただし、本仕様で定義された関数に任意の引数を追加することは許可されません。

適合実装は、追加の値を受け入れ、以下のoptions引数のプロパティに対して、実装定義の動作を行うことが許容されます。その場合、RangeErrorを投げる代わりに実装定義の振る舞いをすることができます。

3 規範参照

本書の適用に必要な参照文書を以下に示します。日付付き参照については、引用した版のみが適用されます。日付なし参照は、引用文書の最新版(修正や改訂を含む)が適用されます。

ECMAScript 2026 言語仕様 (ECMA-262 第17版、または後継)。
https://www.ecma-international.org/publications/standards/Ecma-262.htm

これらの参照に依存する本仕様の各セクションは、可能な限り最新の内容に更新されていますが、必ずしも規格と完全に一致していることは保証されません。

4 概要

このセクションは規範的ではありません。

4.1 国際化・ローカライズ・グローバリゼーション

ソフトウェアの国際化とは、異なる言語を話し、異なる文化的期待を持つユーザーのニーズをサポートする、または簡単にサポートできるように設計し、世界中のユーザー間のコミュニケーションを可能にすることを意味します。ローカライズは、特定の言語と文化への実際の適応です。ソフトウェアのグローバリゼーションは、一般的に国際化とローカライズの組み合わせと理解されています。グローバリゼーションは、世界中のすべての言語をサポートするテキスト表現を使用し、言語・国・タイムゾーンなどの標準識別子を使って識別する、最も低いレベルから始まります。その後、ユーザーが理解できるユーザーインターフェース言語やデータ表示を使用し、最終的にはユーザーの言語・文化・環境に合わせた製品固有の適応が必要となることが多いです。

ECMA-262 は、テキスト表現にUnicodeを使用し、いくつかの言語依存関数を提供することで基盤を築いていますが、これらの関数の振る舞いに対するアプリケーションの制御はほとんどありません。本仕様は、カスタマイズ可能な言語依存機能のセットを提供することでその基盤を拡張します。このAPIは、アプリケーション自体が国際化されていなくても有用です。なぜなら、たとえ1つの言語と1つの地域のみを対象としたアプリケーションでも、その言語と地域を正しくサポートする必要があるためです。しかし、このAPIは複数の言語や地域をサポートするアプリケーション、特にサーバー環境で同時に必要となる場合にも対応できます。

4.2 API の概要

本仕様は、ECMA-262 を補完するために主要な言語依存機能を提供し、その実装に全体または部分的に追加できます。本仕様は、ECMAScriptコードから観測可能な新しい言語値(例えば [[FallbackSymbol]] 内部スロットの値や %Intl% から プロパティアクセス を介して間接的に到達できる値の集合など)を導入し、また ECMA-262 で定義されている一部の関数の定義を改良します(以下参照)。いずれのカテゴリも ECMA-262 で定義された値やインターフェースに対して許可されている振る舞いを禁じるものではなく、どの実装でも本仕様の採用を可能にします。

本仕様は、多くのアプリケーションで必要となる主要な言語依存機能をいくつか提供します:ロケール選択と検査、文字列比較(照合)およびケース変換、複数形ルール、テキストセグメンテーション、数値・絶対/相対日時・期間・リストのフォーマット。ECMA-262 は、これら基本機能のための関数(Array.prototypetoLocaleStringString.prototypelocaleCompare, toLocaleLowerCase, toLocaleUpperCaseNumber.prototypetoLocaleStringDate.prototypetoLocaleString, toLocaleDateString, toLocaleTimeString)を提供しますが、実際の振る舞いはほぼ実装依存です。本仕様は、追加機能、言語や振る舞いの詳細の制御、そして必要な機能のより完全な仕様を提供します。

アプリケーションは、APIを以下の2つの方法で利用できます:

  1. 直接利用:サービスコンストラクタ を使ってオブジェクトを構築し、優先言語リストや設定オプションを指定します。構築されたオブジェクトは、主要関数(compareselectformat など)を繰り返し呼び出すことができ、resolvedOptions 関数でその正確な設定内容を取得できます。
  2. 間接利用:上記の ECMA-262 の関数群を利用します。照合・フォーマット関数は、本仕様で Collator、NumberFormat、DateTimeFormat の コンストラクタ と同じ引数を受け取り、compare や format メソッドと同じ結果を返すように再定義されています。ケース変換関数も優先言語リストを受け取るように再定義されています。

Intlオブジェクトは、本仕様で定義されたすべての機能をパッケージ化し、名前の衝突を避けます。

APIは様々なフォーマッターを含みますが、パース機能は提供しません。これは意図的であり、長く議論された結果、利点と欠点を総合的に判断して除外されました。詳細は issue tracker の議論を参照してください。

4.3 API の規約

すべての Intlコンストラクタ は、クラスで定義されたかのように動作し、関数として(NewTargetなしで)呼び出された場合は TypeError 例外を投げるべきです。過去の版との互換性のため、これは %Intl.Collator%%Intl.DateTimeFormat%%Intl.NumberFormat% には適用されません。これらは関数として呼び出された場合でも新しいオブジェクトを構築して返します。

ECMA 402 v1 では、Intl コンストラクタ は、既存オブジェクトをレシーバとして呼び出すことで、関連する内部スロットを追加し、それをクラスのインスタンスに変換する動作をサポートしていました。ECMA 402 v2 では、この機能は既存オブジェクトに内部スロットを追加しないよう削除されました。ECMA 402 v3 では、基となるIntlインスタンスを任意のオブジェクトにチェーンする「規範的オプション」として再追加され、コンストラクタが呼ばれた際に利用できます。詳細は Issue 57 を参照してください。

4.4 実装依存事項

国際化の性質上、本仕様ではいくつかの詳細について実装依存とせざるを得ません:

  • 十分なローカライズを備えた実装がサポートするロケールの集合: 言語学者は数千もの人間の言語を記述しており、IANA言語 サブタグレジストリには7000以上の主要言語 サブタグ(ロケール識別子のベースとなる)が登録されています。Common Locale Data Repositoryなどの大規模なロケールデータ集でも、全言語とその地域・方言変種のごく一部しかカバーしていません。リソース制約のあるデバイス向けの実装では、さらに対象を絞る必要があるかもしれません。
  • フォーマットパターンなどのローカライズの正確な形式: 多くの場合、ロケール依存の慣習には標準化がなく、複数の形式が並存したり、時代によって変化します。異なる国際化ライブラリが異なる形式を実装していても、どれも間違いではありません。このAPIを既存ライブラリの上に実装できるよう、これらの違いを許容する必要があります。
  • Unicodeの部分集合: 照合などの操作は、Unicode文字セット全体を含む文字列を扱うことがあります。しかし、Unicode標準やECMAScript標準は、実装がUnicode文字セットの部分集合のみをサポートすることを認めています。加えて、ロケールの慣習は通常、Unicode全体ではなく、そのロケールにとって重要な文字のみの振る舞いを規定します。Unicode照合アルゴリズムは、Unicode全体に対するデフォルトの照合順序とローカル慣習へのテーラリング機能を組み合わせていますが、部分集合やテーラリングによって振る舞いの違いが生じます。

ブラウザ実装では、特定オリジンに見える初期のロケール・通貨・暦・番号体系・その他の列挙可能な項目の集合は、同じユーザー agent string(エンジン・プラットフォームバージョン)を共有する全ユーザーで同一でなければなりません。さらに、これら集合の動的変更によってユーザーが互いに識別可能になることがあってはなりません。この制約は国際化に内在するフィンガープリンティングリスクを低減するために課されており、将来の改訂で緩和される可能性があります。この制約の結果、オンデマンドでロケールインストールが可能なブラウザ実装が、特定オリジンから新しいロケールのインストールが必要となるリクエストを初めて受けた場合、そのロケールが既にインストールされているかどうかを明かしてはなりません。

本仕様全体で、実装・ロケール依存の挙動は ILD、実装・ロケール・番号体系依存の挙動は ILND と呼びます。

4.4.1 実装間の互換性

ECMA 402は、各関数が使用するデータのスキーマを記述します。内部データは実装依存であり、将来的に変更され、実装ごとに異なることが予想されます。この違いはプログラマーから観測可能であり、特定の出力に依存するプログラムを構築することも可能です。しかし、本仕様は、良く設計されたプログラムが実装間で動作できるよう、合理的な制約を記述しようとしています。実装は、言語データの調和の努力を継続することが推奨されます。

5 表記規約

本規格では、ECMA-262 の表記規約の一部を使用します:

ECMA-262で説明されている通り、アルゴリズムはECMAScript構成要素の意味論を厳密に指定するために使用されますが、特定実装技術の使用を示唆するものではありません。内部スロットはオブジェクト値の意味論を定義するために使われますが、APIの一部ではありません。純粋に説明のために定義されています。APIの実装は、ここで記載された通り内部スロットを生成・操作するかのように動作しなければなりません。

Record仕様型への拡張として、記法「[[<name>]]」は、変数name(String値である必要あり)によって名前が与えられるフィールドを表します。例えば、変数s"a"という値の場合、[[<s>]]はフィールド[[a]]を示します。

本仕様は、規範的オプションで囲まれたブロックを使用し、ECMA 262のAnnex B(ブラウザー向け追加機能)の意味を示します。すなわち、規範的オプションのセクションは、ECMAScript hostがWebブラウザーの場合は必須です。それ以外の場合は、規範的だがオプションとなります。

5.1 よく知られた内部組込みオブジェクト

以下の表は、よく知られた内部組込みオブジェクトの表を拡張します。

表1: よく知られた内部組込みオブジェクト(拡張)
組込み名 グローバル名 ECMAScript言語との関連
%Intl% Intl Intlオブジェクト(8
%Intl.Collator% Intl.Collator Intl.Collator コンストラクタ10.1
%Intl.DateTimeFormat% Intl.DateTimeFormat Intl.DateTimeFormat コンストラクタ11.1
%Intl.DisplayNames% Intl.DisplayNames Intl.DisplayNames コンストラクタ12.1
%Intl.DurationFormat% Intl.DurationFormat Intl.DurationFormat コンストラクタ13.1
%Intl.ListFormat% Intl.ListFormat Intl.ListFormat コンストラクタ14.1
%Intl.Locale% Intl.Locale Intl.Locale コンストラクタ15.1
%Intl.NumberFormat% Intl.NumberFormat Intl.NumberFormat コンストラクタ16.1
%Intl.PluralRules% Intl.PluralRules Intl.PluralRules コンストラクタ17.1
%Intl.RelativeTimeFormat% Intl.RelativeTimeFormat Intl.RelativeTimeFormat コンストラクタ18.1
%Intl.Segmenter% Intl.Segmenter Intl.Segmenter コンストラクタ19.1
%IntlSegmentIteratorPrototype% セグメントイテレータオブジェクトのプロトタイプ(19.6.2
%IntlSegmentsPrototype% Segmentsオブジェクトのプロトタイプ(19.5.2

6 ロケール、通貨、タイムゾーン、計量単位、番号体系、照合順序、および暦の識別

本条項では、本仕様でロケール、通貨、タイムゾーン、計量単位、番号体系、照合順序、暦、ならびにパターン文字列を識別するために用いる String 値について述べます。

6.1 大文字小文字の区別とケース変換

ロケール、通貨、スクリプト、タイムゾーンを識別するために用いる String 値は、ASCII の大文字小文字を区別しない方法で解釈されます。すなわち、コードユニット 0x0041〜0x005A(Unicode 文字 LATIN CAPITAL LETTER A〜Z)を、対応するコードユニット 0x0061〜0x007A(Unicode 文字 LATIN SMALL LETTER a〜z)と等価に扱います(いずれも両端を含む)。他のケースフォールディング等価性は適用しません。

例えば、"ß" (U+00DF) は "SS" (U+0053, U+0053) と一致または対応付けしてはなりません。"ı" (U+0131) は "I" (U+0049) と一致または対応付けしてはなりません。

String 値 SASCII-uppercase とは、S 中の ASCII 小文字の各コードユニット(0x0061〜0x007A、両端を含む)を対応する ASCII 大文字のコードユニット(0x0041〜0x005A、両端を含む)に置き換え、その他のコードユニットは保持して得られる String 値を指します。

String 値 SASCII-lowercase とは、S 中の ASCII 大文字の各コードユニット(0x0041〜0x005A、両端を含む)を対応する ASCII 小文字のコードユニット(0x0061〜0x007A、両端を含む)に置き換え、その他のコードユニットは保持して得られる String 値を指します。

String 値 A は、A の ASCII-uppercase が B の ASCII-uppercase とコードユニット列として完全に同一であるとき、String 値 BASCII-case-insensitive match です。Unicode 符号点列 A は、BCodePointsToString(A) の ASCII-case-insensitive match のとき、B に対する ASCII-case-insensitive match です。

6.2 言語タグ

本仕様は、Unicode Technical Standard #35 Part 1 Core, Section 3.3 BCP 47 Conformance で定義される Unicode BCP 47 locale identifiers を用いてロケールを識別し、そのアルゴリズムは Section 3 Unicode Language and Locale Identifiers の文法で定義される Unicode locale nonterminals を参照します。 そのような各識別子は language tag とも呼べ、実際に BCP 47 における用語としての有効な言語タグです。 Unicode Technical Standard #35 Part 1 Core, Section 3.2.1 Canonical Unicode Locale Identifiers で規定される正規形のロケール識別子は、 「Unicode canonicalized locale identifier」と呼びます。

ロケール識別子は、"-"(U+002D HYPHEN-MINUS)で区切られた大小区別しない Unicode Basic Latin の英数字 subtags から構成され、1 文字の subtags は「singleton subtags」と呼ばれます。 Unicode Technical Standard #35 Part 1 Core, Section 3.6 Unicode BCP 47 U Extensionsubtag 列は広く用いられており、 「Unicode locale extension sequence」は、言語タグ内で unicode_locale_extensions の Unicode locale nonterminal によってマッチし得る最長の substring で、 "-x-…" の私用 subtag sequence に属さない部分を指します。これは "-u-" で始まり、直後に続く singleton subtag でないすべての subtags と、それらの直前の "-" 区切りを含みます。例えば、 "en-US-u-fw-mon-x-u-ex-foobar"Unicode locale extension sequence"-u-fw-mon" です。

structurally valid language tags は本仕様で定義される API において使用できますが、実装はそれらの検証に Unicode Common Locale Data Repository(CLDR)のデータを用いることを必須とはしません。十分なローカライズを伴って実装がサポートするロケール(したがって言語タグ)の集合は 実装定義 です。 Intl constructors は、要求された言語タグを、それぞれの実装がサポートするロケールへ対応付けます。

6.2.1 IsStructurallyValidLanguageTag ( locale )

抽象操作 IsStructurallyValidLanguageTag は引数 locale(String)を取り、Boolean を返します。locale が構文的に整形式の language tag かどうかを判定します。locale が意味的に有意か、また別名の subtags とその推奨置換 subtags を区別するか、正規の大文字小文字や subtag の順序を要求するかは考慮しません。呼び出し時は次の手順を行います。

  1. lowerLocale を、localeASCII-lowercase とする。
  2. lowerLocaleunicode_locale_idUnicode locale nonterminal にマッチしないなら、false を返す。
  3. lowerLocaleUnicode Technical Standard #35 Part 1 Core, Section 3.3 BCP 47 Conformance で記述される後方互換の構文を用いているなら、false を返す。
  4. baseName を、GetLocaleBaseName(lowerLocale) とする。
  5. variants を、GetLocaleVariants(baseName) とする。
  6. variantsundefined でないなら、
    1. variants に重複する subtags が含まれる場合、false を返す。
  7. extensions を、lowerLocalebaseName 以降の接尾部分とする。
  8. 注記: pu_extensionsUnicode locale nonterminal によってマッチされる "-x-…" の私用 subtag 列は無視しなければならないが、末尾の孤立した "x"(後続の内容なし)は、以下のいずれの検査にも影響しない。
  9. puIndex を、StringIndexOf(extensions, "-x-", 0) とする。
  10. puIndexnot-found でないなら、extensionsextensions の 0 から puIndex までの substring に置き換える。
  11. extensions が空文字列でないなら、
    1. extensions に重複する singleton subtags が含まれる場合、false を返す。
    2. transformExtension を、extensions のうち transformed_extensionsUnicode locale nonterminal にマッチする最長の substring とする。該当する substring がない場合、true を返す。
    3. Assert: transformExtension の 0 から 3 までの substring"-t-" である。
    4. tPrefix を、transformExtension の 3 以降の substring とする。
    5. tlang を、tPrefix のうち tlangUnicode locale nonterminal にマッチする最長の接頭辞とする。該当する接頭辞がない場合、true を返す。
    6. tlangVariants を、GetLocaleVariants(tlang) とする。
    7. tlangVariants に重複する subtags が含まれる場合、false を返す。
  12. true を返す。

6.2.2 CanonicalizeUnicodeLocaleId ( locale )

抽象操作 CanonicalizeUnicodeLocaleId は引数 localelanguage tag)を取り、Unicode canonicalized locale identifier を返します。locale の正規かつ大文字小文字を整えた形式を返します。呼び出し時は次の手順を行います。

  1. localeId を、Unicode Technical Standard #35 Part 1 Core, Annex C LocaleId Canonicalization に従って locale を正規形へ変換するアルゴリズムを実行して得られる String 値とする(アルゴリズムはまず構文の正規化から始まる点に注意)。
  2. localeId に、Unicode locale extension sequence である substring が含まれるなら、
    1. extension を、localeId 内の Unicode locale extension sequence に相当する substring から成る String 値とする。
    2. newExtension"-u" とする。
    3. components を、UnicodeExtensionComponents(extension) とする。
    4. components.[[Attributes]] の各要素 attr について、
      1. newExtension を、newExtension"-"attr連結 に更新する。
    5. components.[[Keywords]] の各 Record { [[Key]], [[Value]] } keyword について、
      1. newExtension を、newExtension"-"keyword.[[Key]]連結 に更新する。
      2. keyword.[[Value]] が空文字列でないなら、
        1. newExtension を、newExtension"-"keyword.[[Value]]連結 に更新する。
    6. Assert: newExtension"-u" ではない。
    7. localeId を、localeId のうち最初に現れる substring extensionnewExtension に置き換えたコピーに設定する。
  3. localeId を返す。
手順 2 は、返される language tag における Unicode locale extension sequence が次を含むことを保証します。
  • 入力内で重複した任意の属性について、その最初の出現のみ
  • 入力内の与えられたキーに対する keyword のうち、最初のもののみ

6.2.3 DefaultLocale ( )

実装定義 の抽象操作 DefaultLocale は引数を取らず、Unicode canonicalized locale identifier を返します。返される String 値は、6.2.1 の整形式かつ 6.2.2 の正規化がなされた、language tag であり、ホスト環境の現在のロケールを表します。Unicode locale extension sequence を含んではなりません。

返される値はフィンガープリンティング要因となり得ます。ブラウザー環境では、追加の識別情報を与えないよう、navigator.language と一致させるべきです。

6.3 通貨コード

本仕様は ISO 4217 で定義される 3 文字の通貨コードを用いて通貨を識別します。正規形は大文字です。

整形式な 3 文字の ISO 4217 通貨コードはすべて許可されます。ただし、ローカライズされた通貨記号が利用可能な通貨コードと language tag の組合せは実装依存です。ローカライズされた通貨記号が利用できない場合、フォーマットには ISO 4217 の通貨コードを用います。

6.3.1 IsWellFormedCurrencyCode ( currency )

抽象操作 IsWellFormedCurrencyCode は引数 currency(String)を取り、Boolean を返します。引数 currency が整形式の 3 文字の ISO 4217 通貨コードを表していることを検証します。呼び出し時は次の手順を行います。

  1. currency の長さが 3 でなければ、false を返す。
  2. normalized を、currencyASCII-uppercase とする。
  3. normalized に 0x0041〜0x005A(Unicode 文字 LATIN CAPITAL LETTER A〜Z)外のコードユニットが含まれるなら、false を返す。
  4. true を返す。

6.4 AvailableCanonicalCurrencies ( )

実装定義 の抽象操作 AvailableCanonicalCurrencies は引数を取らず、String の List を返します。返される List辞書式コードユニット順序 に従って整列され、Intl.DisplayNames および Intl.NumberFormat オブジェクトの機能が提供される通貨を識別する、一意で整形式かつ大文字正規化済みの 3 文字 ISO 4217 通貨コードを含みます。

6.5 IANA タイムゾーンデータベースの使用

本仕様を採用する実装は、タイムゾーン対応でなければなりません。すなわち、IANA タイムゾーンデータベース https://www.iana.org/time-zones/ を用いて、利用可能な名前付きタイムゾーン識別子 と、ECMAScript の計算や書式設定で使用されるデータを提供しなければなりません。 本節は、タイムゾーン対応実装が IANA タイムゾーンデータベースをどのように用いるべきかを定義します。 IANA タイムゾーンデータベースの Zone 名または Link 名でない限り、いかなる String も 利用可能な名前付きタイムゾーン識別子であってはなりません。 ECMAScript の組込みオブジェクトが返す 利用可能な名前付きタイムゾーン識別子は、IANA タイムゾーンデータベースにおける大文字小文字表記を使用しなければなりません。

IANA タイムゾーンデータベースの各 Zone は 主要タイムゾーン識別子でなければならず、IANA タイムゾーンデータベースの各 Link 名は、対応する Zone 名に解決される 非主要タイムゾーン識別子でなければなりません。以下の例外は AvailableNamedTimeZoneIdentifiers にて実装されます。

  • 歴史的理由により、"UTC"主要タイムゾーン識別子でなければなりません。 "Etc/UTC""Etc/GMT""GMT" およびそれらへ解決されるすべての Link 名は、"UTC" に解決される非主要タイムゾーン識別子でなければなりません。
  • zone.tab ファイルの “TZ” 列に存在する任意の Link 名は、主要タイムゾーン識別子でなければなりません。 例えば、"Europe/Prague""Europe/Bratislava" の両方は 主要タイムゾーン識別子でなければなりません。 この要件は、各 ISO 3166-1 Alpha-2 国コードについて、少なくとも 1 つの 主要タイムゾーン識別子を保証し、一国のタイムゾーン規則の将来の変更が、領土境界の変更も伴わない限り、他国のタイムゾーンを用いる ECMAScript プログラムに影響しないことを保証します。
  • zone.tab の “TZ” 列に記載されておらず、かつ単一の ISO 3166-1 Alpha-2 国コードの領域内に完全に含まれる地理的領域を表す任意の Link 名は、同一の国コードの領域内に完全に含まれる地理的領域を表す主要識別子に解決されなければなりません。 例えば、"Atlantic/Jan_Mayen""Arctic/Longyearbyen" に解決されなければなりません。

IANA タイムゾーンデータベースは、どの 利用可能な名前付きタイムゾーン識別子 を主要とするかに影響するビルドオプションを提供します。 既定のビルドオプションでは、国の異なるタイムゾーンが統合されます。例えば、"Atlantic/Reykjavik" は Zone "Africa/Abidjan" への Link として構築されます。 地理的・政治的に異なる場所は、将来版の IANA タイムゾーンデータベースで異なるタイムゾーン規則を導入する可能性があります。 上記の例外は、将来互換性の問題を軽減するためのものです。

Unicode Common Locale Data Repository(CLDR)は、どの 利用可能な名前付きタイムゾーン識別子 が主要か非主要かを決定する際に、上記の例外の大部分を実装しています。 実装間の一貫性のため CLDR データの使用は推奨されますが、必須ではありません。 CLDR ベースでない実装でも、timezone.xml にある CLDR の識別子データを用いることができます。 また、PACKRATDATA=backzone PACKRATLIST=zone.tab のようなビルドオプションを使用し、上記要件への適合を確保するために必要な後処理を行うなど、IANA タイムゾーンデータベースを直接ビルドすることもできます。

IANA タイムゾーンデータベースは、通常、年に 5〜10 回更新されます。 これらの更新では、新しい Zone 名や Link 名が追加されたり、Zone が Link に変更されたり、任意の Zone に関連する UTC オフセットや遷移が変更されたりすることがあります。 実装は、可能な限り速やかに IANA タイムゾーンデータベースの更新を取り込むことが推奨されます。 そのような迅速な対応により、ECMAScript プログラムはタイムゾーンに敏感な計算を正確に実行でき、外部入力や ホスト環境 によって提供される新たに追加された 利用可能な名前付きタイムゾーン識別子 を使用できます。

IANA タイムゾーンデータベースのメンテナーは安定性に努めていますが、まれに(平均して年 1 回未満)既存の Zone が新しい Zone に置き換えられることがあります。 例えば、2022 年には「Europe/Kiev」が新しい「Europe/Kyiv」Zone へ解決される Link として非推奨になりました。 非推奨となった Link は renamed time zone identifier と呼ばれ、新たに追加された Zone は replacement time zone identifier と呼ばれます。

これらの希少な変更による混乱を減らすため、実装は当初、各 replacement time zone identifier を、既存の renamed time zone identifier に解決される 非主要タイムゾーン識別子として追加すべきです。 これにより ECMAScript プログラムは両方の識別子を認識できますが、まだそれを認識しない他システムへ replacement time zone identifier を送ってしまう可能性を減らせます。 rename waiting period の後、実装は新しい Zone を 主要タイムゾーン識別子に昇格し、同時に renamed time zone identifier を非主要へ降格すべきです。 他システムが更新されるのに十分な時間を提供するため、推奨される rename waiting period は 2 年です。 ただし、厳密や動的である必要はありません。 代わりに、実装は通常のタイムゾーンデータ更新のリリースプロセスの一部として、待機期間後に replacement time zone identifier を主要へ昇格させるべきです。

待機期間は、新しい Zone が既存の Zone を置き換える場合にのみ適用すべきです。 既存の Zone と Link が入れ替わるだけなら、改名は起きておらず、待機期間は不要です。

実装が agent の存続中にタイムゾーン情報を改訂する場合、利用可能な名前付きタイムゾーン識別子の一覧、任意の 利用可能な名前付きタイムゾーン識別子 に関連付けられた 主要タイムゾーン識別子、および任意の 利用可能な名前付きタイムゾーン識別子 に関連する UTC オフセットと遷移は、その agent で以前に観測された結果と整合していなければなりません。 この要件を満たすことの複雑さから、各 agent の存続期間中は、IANA タイムゾーンデータベースの完全に一貫したコピーを維持することが推奨されます。

本節は 21.4.1.19 を補完するものであり、これに優先するものではありません。

6.5.1 AvailableNamedTimeZoneIdentifiers ( )

実装定義 の抽象操作 AvailableNamedTimeZoneIdentifiers は引数を取らず、List of Time Zone Identifier Records を返します。 その結果は、当該実装におけるすべての 利用可能な名前付きタイムゾーン識別子 と、各 利用可能な名前付きタイムゾーン識別子 に対応する 主要タイムゾーン識別子 を記述します。 List は、各 Time Zone Identifier Record[[Identifier]] フィールドに従って順序付けられます。

この定義は、21.4.1.23 に示される定義に優先します。

  1. identifiers を、IANA タイムゾーンデータベース内の各 Zone 名または Link 名の String 値を含む List とする。
  2. Assert: identifiers のいかなる要素も、他の要素の ASCII-case-insensitive match ではない。
  3. identifiers を、辞書式コードユニット順序 に従ってソートする。
  4. result を新しい空の List とする。
  5. identifiers の各要素 identifier について、
    1. primaryidentifier とする。
    2. identifier が IANA タイムゾーンデータベースにおける Link 名であり、かつ IANA タイムゾーンデータベースの zone.tab の “TZ” 列に存在しないなら、
      1. zone を、IANA タイムゾーンデータベースにおける Link 名解決規則に従って、identifier が解決される Zone 名とする。
      2. zone"Etc/" で始まるなら、
        1. primaryzone に設定する。
      3. それ以外の場合、
        1. identifierCountryCode を、identifier に対応する地理的領域を含む領土の ISO 3166-1 Alpha-2 国コードとする。
        2. zoneCountryCode を、zone に対応する地理的領域を含む領土の ISO 3166-1 Alpha-2 国コードとする。
        3. もし identifierCountryCodezoneCountryCode と等しいなら、
          1. primaryzone に設定する。
        4. それ以外の場合、
          1. countryCodeLineCount を、IANA タイムゾーンデータベースの zone.tab において “country-code” 列が identifierCountryCode である行の数とする。
          2. countryCodeLineCount が 1 の場合、
            1. countryCodeLine を、IANA タイムゾーンデータベースの zone.tab において “country-code” 列が identifierCountryCode である行とする。
            2. primary を、countryCodeLine の “TZ” 列の内容に設定する。
          3. それ以外の場合、
            1. backzoneundefined とする。
            2. backzoneLinkLines を、IANA タイムゾーンデータベースの backzone ファイルにおいて、"Link " または "#PACKRATLIST zone.tab Link " のいずれかで始まる行の List とする。
            3. backzoneLinkLines の各要素 line について、
              1. i を、StringIndexOf(line, "Link ", 0) とする。
              2. line を、linei + 5 以降の substring に設定する。
              3. backzoneAndLink を、StringSplitToList(line, " ") とする。
              4. Assert: backzoneAndLink は少なくとも 2 要素を持ち、backzoneAndLink[0] と backzoneAndLink[1] はともに 利用可能な名前付きタイムゾーン識別子 である。
              5. backzoneAndLink[1] が identifier と等しいなら、
                1. Assert: backzoneundefined である。
                2. backzonebackzoneAndLink[0] に設定する。
            4. Assert: backzoneundefined ではない。
            5. primarybackzone に設定する。
    3. primary"Etc/UTC""Etc/GMT""GMT" のいずれかであるなら、primary"UTC" に設定する。
    4. primaryreplacement time zone identifier であり、その rename waiting period が終了していないなら、
      1. renamedIdentifier を、primary が置き換えた renamed time zone identifier とする。
      2. primaryrenamedIdentifier に設定する。
    5. record を、Time Zone Identifier Record { [[Identifier]]: identifier, [[PrimaryIdentifier]]: primary } とする。
    6. recordresult に追加する。
  6. Assert: result は、r.[[Identifier]]"UTC" であり、かつ r.[[PrimaryIdentifier]]"UTC" であるような Time Zone Identifier Record r を含む。
  7. result を返す。
注1

上記の、Link を 主要タイムゾーン識別子 に解決するアルゴリズムは、International Components for Unicode(ICU)における icu::TimeZone::getIanaID() の動作および Unicode Common Locale Data Repository(CLDR)における time zone identifier データの保守過程に対応することを意図しています。

このアルゴリズムは、IANA タイムゾーンデータベースの zone.tabbackzone のデータを用いて、ISO 3166-1 Alpha-2 国コードの境界を越えることなく、Link を 主要タイムゾーン識別子 に解決します。 Link の国コードに対して zone.tab に 1 行しかなければ、その行が 主要タイムゾーン識別子 を決定します。 しかし、その国コードに zone.tab に複数行がある場合は、正しい 主要タイムゾーン識別子 を特定するために backzone の履歴対応付けを用いる必要があります。

例えば、既定ビルドの IANA タイムゾーンデータベースが "Pacific/Truk"(国コード "FM")を "Pacific/Port_Moresby"(国コード "PG")への Link として識別する場合、zone.tab の “country-code” 列で "FM" に対応する行を確認する必要があります。 そのような行が 1 つだけなら、その行の “TZ” 列が "Pacific/Truk" に対応する 主要タイムゾーン識別子 を決定します。 しかし zone.tab に "FM" の行が複数ある場合は、backzone を参照し、"Link Pacific/Chuuk Pacific/Truk" のような行があるなら、"Pacific/Chuuk" を 主要タイムゾーン識別子として用います。

zone.tab は対応付けデータの優先情報源です。というのも、backzone の対応付けは、まれに ISO 3166-1 Alpha-2 国コードの境界を越えることがあるからです。 例えば、"Atlantic/Jan_Mayen"(国コード "SJ")は backzone において "Europe/Oslo"(国コード "NO")に対応付けられています。 IANA タイムゾーンデータベースの 2024a 版時点では、この事例は唯一です。

注2
IANA タイムゾーンデータベース内の Time zone identifiers は時間とともに変化し得ます。 最低限、実装は GetAvailableNamedTimeZoneIdentifier によって許容される変更に結果の変更を限定することが推奨されます(surrounding agent の存続期間中)。 これらの推奨に対応する複雑さから、AvailableNamedTimeZoneIdentifiers の結果(したがって GetAvailableNamedTimeZoneIdentifier の結果も)は、surrounding agent の存続期間中は不変であることが推奨されます。

6.5.2 GetAvailableNamedTimeZoneIdentifier ( timeZoneIdentifier )

抽象操作 GetAvailableNamedTimeZoneIdentifier は引数 timeZoneIdentifier(String)を取り、Time Zone Identifier Recordempty を返します。 timeZoneIdentifier利用可能な名前付きタイムゾーン識別子 であれば、List を返す AvailableNamedTimeZoneIdentifiers 中のいずれかの Record を返します。 それ以外の場合は empty を返します。 呼び出し時は次の手順を行います。

  1. AvailableNamedTimeZoneIdentifiers() の各要素 record について、
    1. record.[[Identifier]]timeZoneIdentifierASCII-case-insensitive match であるなら、その record を返す。
  2. empty を返す。
任意の timeZoneIdentifier、またはその ASCII-case-insensitive match に対して、得られる Time Zone Identifier Record は、surrounding agent の存続期間中、同一のフィールド値を含むことが要求されます。 さらに、タイムゾーン識別子 が、surrounding agent の存続期間中に主要から非主要へ動的に変化しないことが要求されます。すなわち、timeZoneIdentifier が過去の GetAvailableNamedTimeZoneIdentifier の結果の [[PrimaryIdentifier]] フィールドの ASCII-case-insensitive match であるなら、GetAvailableNamedTimeZoneIdentifier(timeZoneIdentifier) は、[[Identifier]][[PrimaryIdentifier]] である Time Zone Identifier Record を返さなければなりません。 これらの要件に対応する複雑さから、AvailableNamedTimeZoneIdentifiers(および GetAvailableNamedTimeZoneIdentifier) の結果は、surrounding agent の存続期間中は不変であることが推奨されます。

6.5.3 AvailablePrimaryTimeZoneIdentifiers ( )

抽象操作 AvailablePrimaryTimeZoneIdentifiers は引数を取らず、String の List を返します。返される List は、IANA タイムゾーンデータベースにおけるサポート対象の Zone 名と Link 名の整列済みの List です。呼び出し時は次の手順を行います。

  1. records を、AvailableNamedTimeZoneIdentifiers() とする。
  2. result を新しい空の List とする。
  3. records の各要素 timeZoneIdentifierRecord について、
    1. timeZoneIdentifierRecord.[[Identifier]]timeZoneIdentifierRecord.[[PrimaryIdentifier]] と等しいなら、
      1. timeZoneIdentifierRecord.[[Identifier]]result に追加する。
  4. result を返す。

6.5.4 StringSplitToList ( S, separator )

抽象操作 StringSplitToList は引数 S(String)と separator(String)を取り、String の List を返します。 返される List には、S のうち separator を含まず、直前および/または直後が separator の出現である、互いに素なすべての部分文字列が含まれます。 そのような各 substring は、隣接する separator の間、S の先頭直前の separator の後、または S の末尾直後の separator の前では空文字列になり得ますが、その他では空にはなりません。 呼び出し時は次の手順を行います。

  1. Assert: S は空文字列ではない。
  2. Assert: separator は空文字列ではない。
  3. separatorLengthseparator の長さとする。
  4. substrings を新しい空の List とする。
  5. i を 0 とする。
  6. j を、StringIndexOf(S, separator, 0) とする。
  7. jnot-found でない間、繰り返す。
    1. T を、Si から j までの substring とする。
    2. Tsubstrings に追加する。
    3. ij + separatorLength に設定する。
    4. j を、StringIndexOf(S, separator, i) に設定する。
  8. T を、Si 以降の substring とする。
  9. Tsubstrings に追加する。
  10. substrings を返す。

6.6 計量単位識別子

本仕様は、Unicode 技術標準 #35 パート2 一般、6.2 単位識別子 で定義される コア単位識別子(または同義の コア単位ID)を用いて計量単位を識別します。正規形は、Unicode 基本ラテン小文字(U+0061 ラテン小文字 a から U+007A ラテン小文字 z)と、ゼロ個以上の中間ハイフン(U+002D ハイフンマイナス)のみからなる文字列です。

コア単位識別子のうち、限られた集合のみが認可されています。 認可されていないコア単位識別子を使用しようとすると RangeError となります。

6.6.1 IsWellFormedUnitIdentifier ( unitIdentifier )

抽象操作 IsWellFormedUnitIdentifier は、引数 unitIdentifier(String)を取り、Boolean を返します。引数 unitIdentifier が、認可された単一単位、または認可された単一単位2つの除算で構成される複合単位として整形式の コア単位識別子 であることを検証します。呼び出し時の手順は以下の通りです:

  1. IsSanctionedSingleUnitIdentifier(unitIdentifier) が true なら、
    1. true を返す。
  2. iStringIndexOf(unitIdentifier, "-per-", 0) とする。
  3. inot-found または StringIndexOf(unitIdentifier, "-per-", i + 1) が not-found でない場合、
    1. false を返す。
  4. Assert: 5文字の substring "-per-"unitIdentifier にちょうど1回、インデックス i に現れる。
  5. numeratorsubstring(unitIdentifier, 0, i) とする。
  6. denominatorsubstring(unitIdentifier, i + 5) とする。
  7. IsSanctionedSingleUnitIdentifier(numerator) および IsSanctionedSingleUnitIdentifier(denominator) の両方が true なら、
    1. true を返す。
  8. false を返す。

6.6.2 IsSanctionedSingleUnitIdentifier ( unitIdentifier )

抽象操作 IsSanctionedSingleUnitIdentifier は、引数 unitIdentifier(String)を取り、Boolean を返します。引数 unitIdentifier が、現仕様で認可されている単一単位識別子(Common Locale Data Repository release 38 unit validity data のサブセット。今後拡大の可能性あり)のいずれかであることを検証します。Unicode 技術標準 #35 パート2 一般、6.2 単位識別子 にて説明される通り、単一単位識別子とは他の単位識別子の乗算や除算で構成されていない コア単位識別子 です。呼び出し時の手順は以下の通りです:

  1. unitIdentifier が、下記 表2 に記載されていれば、true を返す。
  2. それ以外は false を返す。
表2: ECMAScript で使用が認可された単一単位
単一単位識別子
acre
bit
byte
celsius
centimeter
day
degree
fahrenheit
fluid-ounce
foot
gallon
gigabit
gigabyte
gram
hectare
hour
inch
kilobit
kilobyte
kilogram
kilometer
liter
megabit
megabyte
meter
microsecond
mile
mile-scandinavian
milliliter
millimeter
millisecond
minute
month
nanosecond
ounce
percent
petabyte
pound
second
stone
terabit
terabyte
week
yard
year

6.6.3 AvailableCanonicalUnits ( )

抽象操作 AvailableCanonicalUnits は引数を取らず、String の List を返します。返される List辞書式コードユニット順序 で整列され、下記 表2 の各行(ヘッダー行除く)に記載された単純単位識別子の一意な値から構成されます。

6.7 番号体系識別子

本仕様は、Unicode 技術標準 #35 パート3 数値、1. 番号体系 で参照される名前に対応する 番号体系識別子 を用いて番号体系を識別します。正規形は、Unicode 基本ラテン小文字(U+0061 ラテン小文字 a から U+007A ラテン小文字 z)のみからなる文字列です。

6.7.1 AvailableCanonicalNumberingSystems ( )

実装定義 の抽象操作 AvailableCanonicalNumberingSystems は引数を取らず、String の List を返します。返される List辞書式コードユニット順序 で整列され、Intl.DateTimeFormat, Intl.NumberFormat, Intl.RelativeTimeFormat オブジェクトの機能が提供される番号体系を識別する一意な正規化済み番号体系識別子を含みます。List には、下記 表28 の各行(ヘッダー行除く)の Numbering System 値を必ず含めなければなりません。

6.8 照合タイプ

本仕様は、Unicode 技術標準 #35 パート5 照合、3.1 照合タイプ で定義される 照合タイプ を用いて照合を識別します。正規形は、Unicode 基本ラテン小文字(U+0061 ラテン小文字 a から U+007A ラテン小文字 z)と、ゼロ個以上の中間ハイフン(U+002D ハイフンマイナス)のみからなる文字列です。

6.8.1 AvailableCanonicalCollations ( )

実装定義 の抽象操作 AvailableCanonicalCollations は引数を取らず、String の List を返します。返される List辞書式コードユニット順序 で整列され、実装が Intl.Collator オブジェクトの機能を提供する照合を識別する一意な正規化済み 照合タイプ を含みます。

6.9 暦の種類

本仕様は、Unicode 技術標準 #35 パート4 日付、2. 暦要素 で定義される 暦の種類 を用いて暦を識別します。正規形は、Unicode 基本ラテン小文字(U+0061 ラテン小文字 a から U+007A ラテン小文字 z)と、ゼロ個以上の中間ハイフン(U+002D ハイフンマイナス)のみからなる文字列です。

6.9.1 AvailableCalendars ( )

実装定義 の抽象操作 AvailableCalendars は引数を取らず、String の List を返します。返される List辞書式コードユニット順序 で整列され、実装が Intl.DateTimeFormat オブジェクトの機能を提供する一意な正規形 暦の種類6.9)を含みます。また、エイリアスも含みます(例えば "islamicc""islamic-civil" の両方またはいずれも含めないなど)。List には "iso8601" を必ず含めなければなりません。

6.10 パターン文字列の種類

パターン文字列 は String 値であり、"{key}" 形式の部分文字列をゼロ個以上含みます。key には ASCII ワード文字のみからなる空でない任意の並びが利用できます。抽象パターン文字列の構文は実装詳細であり、ECMA-402 の利用者には公開されません。

7 標準の組込み ECMAScript オブジェクトに対する要件

本書で特に指定されていない限り、本規格で記載されているオブジェクト、関数、および コンストラクタ は、ECMAScript 標準組込みオブジェクトに規定された一般的な要件および制約の対象となります。

8 Intl オブジェクト

Intl オブジェクト

8.1 Intl オブジェクトの値プロパティ

8.1.1 Intl [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は、String 値 "Intl" です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

8.2 Intl オブジェクトのコンストラクタのプロパティ

Intl.Locale を除き、以下の各 コンストラクタ はロケール依存サービスを提供するオブジェクトを生成する サービスコンストラクタ です。

8.2.1 Intl.Collator ( . . . )

10 を参照。

8.2.2 Intl.DateTimeFormat ( . . . )

11 を参照。

8.2.3 Intl.DisplayNames ( . . . )

12 を参照。

8.2.4 Intl.DurationFormat ( . . . )

13 を参照。

8.2.5 Intl.ListFormat ( . . . )

14 を参照。

8.2.6 Intl.Locale ( . . . )

15 を参照。

8.2.7 Intl.NumberFormat ( . . . )

16 を参照。

8.2.8 Intl.PluralRules ( . . . )

17 を参照。

8.2.9 Intl.RelativeTimeFormat ( . . . )

18 を参照。

8.2.10 Intl.Segmenter ( . . . )

19 を参照。

8.3 Intl オブジェクトの関数プロパティ

8.3.1 Intl.getCanonicalLocales ( locales )

getCanonicalLocales メソッドが locales 引数で呼び出された場合、以下の手順を行います:

  1. ll を ? CanonicalizeLocaleList(locales) とする。
  2. CreateArrayFromList(ll) を返す。

8.3.2 Intl.supportedValuesOf ( key )

supportedValuesOf メソッドが key 引数で呼び出された場合、以下の手順を行います:

  1. key を ? ToString(key) とする。
  2. key"calendar" なら、
    1. list を新しい空の List とする。
    2. AvailableCalendars() の各要素 identifier について、
      1. canonicalCanonicalizeUValue("ca", identifier) とする。
      2. identifiercanonical なら、
        1. identifierlist に追加する。
  3. それ以外で key"collation" なら、
    1. listAvailableCanonicalCollations() とする。
  4. それ以外で key"currency" なら、
    1. listAvailableCanonicalCurrencies() とする。
  5. それ以外で key"numberingSystem" なら、
    1. listAvailableCanonicalNumberingSystems() とする。
  6. それ以外で key"timeZone" なら、
    1. listAvailablePrimaryTimeZoneIdentifiers() とする。
  7. それ以外で key"unit" なら、
    1. listAvailableCanonicalUnits() とする。
  8. それ以外の場合、
    1. RangeError 例外を投げる。
  9. CreateArrayFromList(list) を返す。

9 ロケールとパラメータのネゴシエーション

サービスコンストラクタは、引数 locales および options によって表される要求を、実装の実際の能力とネゴシエートするための共通のパターンを使用します。その共通の振る舞いは、能力を記述する内部スロット、これらの内部スロットを用いる抽象操作、および以下で定義される特殊化されたデータ型の観点からここで説明します。

利用可能ロケール一覧は、言語タグからなる、任意順序で重複のないListであり、各要素は構文的に整形式で、正規化済みであり、Unicode ロケール拡張シーケンスを含みません。これは、特定のコンテキストにおいて実装が機能を提供するすべてのロケールを表します。

言語優先リストは、優先度の高い順にロケールの嗜好の並びを表す、構文的に整形式かつ正規化済み言語タグListです。これは、BCP 47RFC 4647 セクション 2.3 で定義される同名の用語に対応しますが、"*" 要素を禁止し、内容は正規化済みのもののみを含みます。

Resolution Option Descriptorは、Recordであり、フィールド [[Key]](文字列。通常は [[RelevantExtensionKeys]]Listの要素)と [[Property]](文字列)を持ち、さらに任意で [[Type]]boolean または string)および [[Values]]empty またはList(要素はECMAScript 言語値))のいずれかまたは両方を持ちます。これは、オブジェクト構築時にロケール解決に関係するオプションの読み取り方法を記述します。

9.1 サービスコンストラクタの内部スロット

サービスコンストラクタは、次の内部スロットを持ちます。

  • [[AvailableLocales]] は、利用可能ロケール一覧です。これは DefaultLocale によって返される値を含まなければなりません。さらに、複数のサブタグを持つ各要素については、同じ言語サブタグを持ち、かつ後続の同じサブタグの厳密な部分集合(すなわち 1 つ以上省略)を伴う、より広い言語タグも含めなければなりません。これは ResolveLocale のフォールバック候補として機能します。特に、言語のサブタグ、スクリプトのサブタグ、地域のサブタグを持つ各要素には、同じ言語サブタグと地域のサブタグのみからなりスクリプトのサブタグを欠く別の要素を伴わせなければなりません。例えば、
    • [[AvailableLocales]]"de-DE" を含む場合、"de" も含まなければなりません(これは "de-AT""de-CH" のような要求ロケールを満たすために選択され得ます)。
    • [[AvailableLocales]]"az-Latn-AZ" を含む場合、"az-AZ" も含まなければなりません(これは "az-Cyrl" が利用不可のとき "az-Cyrl-AZ" といった要求ロケールを満たすために選択され得ます)。
  • [[RelevantExtensionKeys]] は、構築されるオブジェクトの機能に関連する、Unicode 技術標準 #35 パート1 コア、セクション 3.6.1 キーとタイプの定義 で定義されるUnicode ロケール拡張シーケンスのキーからなるListです。
  • [[ResolutionOptionDescriptors]] は、オブジェクト構築時にオプションを読み取るために使用されるResolution Option DescriptorListです。
  • [[SortLocaleData]][[SearchLocaleData]](Intl.Collator 用)、および [[LocaleData]](他のすべてのサービスコンストラクタ用)はRecordです。各サービスコンストラクタ固有のフィールドに加えて、そのRecordは、[[AvailableLocales]] に含まれる各ロケール用のフィールドを持ちます。その各ロケール名フィールドの値はRecordであり、[[RelevantExtensionKeys]] の各要素がフィールド名を識別し、その値は実装が対応するUnicode ロケール拡張シーケンスのキーに対して当該ロケールでサポートする型値を表す、空でない文字列のListです。各Listの最初の要素は、そのロケールにおける当該キーの既定値を提供します。
例として、ある DateTimeFormat の実装は、内部スロット [[AvailableLocales]]言語タグ "fa-IR" を含め、(11.2.3 に従い)内部スロット [[RelevantExtensionKeys]] にキー "ca""hc""nu" を含めなければなりません。そのロケールの既定の暦は通常 "persian" ですが、実装は "gregory""islamic""islamic-civil" もサポートし得ます。したがって、DateTimeFormat の [[LocaleData]] 内部スロットにあるRecordには、[[fa-IR]] フィールドが含まれ、その値は { [[ca]]: « "persian", "gregory", "islamic", "islamic-civil" », [[hc]]: « … », [[nu]]: « … » } のようになります。他のロケール名フィールドも同様の形状の値を持ちますが、各List内の要素は異なる場合があります。

9.2 抽象操作

9.2.1 CanonicalizeLocaleList ( locales )

抽象操作 CanonicalizeLocaleList は引数 localesECMAScript 言語値)を取り、言語優先リスト正常完了で含むか、throw completionのいずれかを返します。呼び出し時には次の手順を行います。

  1. localesundefined のとき、
    1. 新しい空のListを返す。
  2. seen を新しい空のListとする。
  3. localesString であるか、localesObject でかつ locales[[InitializedLocale]] 内部スロットを持つ場合、
    1. O を ! CreateArrayFromListlocales ») とする。
  4. それ以外の場合、
    1. O を ? ToObject(locales) とする。
  5. len を ? LengthOfArrayLike(O) とする。
  6. k を 0 とする。
  7. k < len の間、繰り返す、
    1. Pk を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(O, Pk) とする。
    3. kPresenttrue ならば、
      1. kValue を ? Get(O, Pk) とする。
      2. kValueString でないかつ kValueObject でない場合、TypeError 例外を投げる。
      3. kValueObject であるかつ kValue[[InitializedLocale]] 内部スロットを持つ場合、
        1. tagkValue.[[Locale]] とする。
      4. それ以外の場合、
        1. tag を ? ToString(kValue) とする。
      5. IsStructurallyValidLanguageTag(tag) が false の場合、RangeError 例外を投げる。
      6. canonicalizedTagCanonicalizeUnicodeLocaleId(tag) とする。
      7. seencanonicalizedTag を含まない場合、seencanonicalizedTag を追加する。
    4. kk + 1 に設定する。
  8. seen を返す。
注 1
規範的でない要約: この抽象操作は、引数 locales を配列として解釈し、その要素をListへコピーし、要素が言語タグとして構文的に整形式であることを検証し、正規化し、重複を省きます。
注 2
kValue が String または Object であることを要求するため、数値 NaN言語タグ "nan"(閩南語を表す)として解釈されることはありません。

9.2.2 CanonicalizeUValue ( ukey, uvalue )

抽象操作 CanonicalizeUValue は引数 ukeyUnicode 技術標準 #35 パート1 コア セクション 3.6.1 キーとタイプの定義で定義されるUnicode ロケール拡張シーケンスのキー)および uvalue(String)を取り、String を返します。返される String は、uvalueukey の値としての正規かつ大文字小文字正規化された形にしたものです。呼び出し時には次の手順を行います。

  1. lowerValue を、uvalueASCII-lowercaseとする。
  2. canonicalized を、Unicode 技術標準 #35 パート1 コア、付録 C LocaleId Canonicalization セクション 5 Canonicalizing Syntax, Processing LocaleIds に従い、キー ukey の値として lowerValue を正規化した結果の String 値とする。
  3. 注: 実装は Common Locale Data Repository が提供する common/bcp47 内の 'u' 拡張データ(https://cldr.unicode.org/)を使用することが推奨されます。
  4. canonicalized を返す。

9.2.3 LookupMatchingLocaleByPrefix ( availableLocales, requestedLocales )

抽象操作 LookupMatchingLocaleByPrefix は引数 availableLocales利用可能ロケール一覧)および requestedLocales言語優先リスト)を取り、フィールド [[locale]]Unicode 正規化ロケール識別子)および [[extension]]Unicode ロケール拡張シーケンスまたはempty)を持つRecord、または undefined を返します。これは BCP 47RFC 4647 セクション 3.4 で定義される Lookup アルゴリズムを用いて、Unicode ロケール拡張シーケンスを無視しつつ requestedLocales を満たす availableLocales の最適な要素を決定します。非既定の一致が見つかった場合、availableLocales から一致した言語タグを含む [[locale]] フィールドと、requestedLocales の対応する要素のUnicode ロケール拡張シーケンス(または要求された言語タグにそのシーケンスがない場合は empty)を含む [[extension]] フィールドを持つRecordを返します。呼び出し時には次の手順を行います。

  1. requestedLocales の各要素 locale について、
    1. extensionempty とする。
    2. localeUnicode ロケール拡張シーケンスを含む場合、
      1. extensionlocaleUnicode ロケール拡張シーケンスに設定する。
      2. locale を、あらゆるUnicode ロケール拡張シーケンスが取り除かれた String 値に設定する。
    3. prefixlocale とする。
    4. prefix が空文字列でない間、繰り返す、
      1. availableLocalesprefix を含む場合、Record { [[locale]]: prefix, [[extension]]: extension } を返す。
      2. prefix"-"(コードユニット 0x002D HYPHEN-MINUS)を含む場合、posprefix 内で最後に現れる "-" の位置とする。含まない場合、pos を 0 とする。
      3. pos ≥ 2 かつ prefixpos - 2 から pos - 1 までのsubstring"-" である間、繰り返す、
        1. pospos - 2 に設定する。
      4. prefix を、prefix の 0 から pos までのsubstringに設定する。
  2. undefined を返す。
要求されたロケールが Unicode 技術標準 #35 パート1 コア BCP 47 T 拡張サブタグ列を含む場合、このアルゴリズムでの切り詰めにより、一時的に不正な言語タグが生成される可能性があります。しかし、availableLocales は有効な言語タグのみを含むため、それらが返されることはありません。

9.2.4 LookupMatchingLocaleByBestFit ( availableLocales, requestedLocales )

実装定義の抽象操作 LookupMatchingLocaleByBestFit は、引数 availableLocales利用可能ロケール一覧)および requestedLocales言語優先リスト)を取り、フィールド [[locale]]Unicode 正規化ロケール識別子)および [[extension]]Unicode ロケール拡張シーケンスまたはempty)を持つRecord、または undefined を返します。これは、Unicode ロケール拡張シーケンスを無視しつつ、requestedLocales を満たす availableLocales の最適な要素を決定します。アルゴリズムは実装依存ですが、典型的な requestedLocales の利用者が、LookupMatchingLocaleByPrefix アルゴリズムと同等以上と考える結果を生成すべきです。非既定の一致が見つかった場合、availableLocales から一致した言語タグを含む [[locale]] フィールドと、requestedLocales の対応する要素のUnicode ロケール拡張シーケンス(または要求された言語タグにそのシーケンスがない場合は empty)を含む [[extension]] フィールドを持つRecordを返します。

9.2.5 UnicodeExtensionComponents ( extension )

抽象操作 UnicodeExtensionComponents は引数 extensionUnicode ロケール拡張シーケンス)を取り、フィールド [[Attributes]][[Keywords]] を持つRecordを返します。これは extension を、ユニークな属性のListと、ユニークなキーを持つkeywordsListに分解します。属性やkeywordキーの 2 回目以降の出現は無視されます。呼び出し時には次の手順を行います。

  1. Assert: extensionASCII-lowercaseextension と同一である。
  2. Assert: extension の 0 から 3 までのsubstring"-u-" である。
  3. attributes を新しい空のListとする。
  4. keywords を新しい空のListとする。
  5. keywordundefined とする。
  6. sizeextension の長さとする。
  7. k を 3 とする。
  8. k < size の間、繰り返す、
    1. eStringIndexOf(extension, "-", k) とする。
    2. enot-found なら lensize - k とし、そうでなければ lene - k とする。
    3. subtag を、extensionk から k + len までのsubstringとする。
    4. 注: keyword は、最初のサブタグが長さ 2 のキーであり、その後に続く(もしあれば)サブタグは長さが包含区間 [3, 8] にある一連のサブタグで、両者の間の "-" 区切りと併せて値を構成します。属性は、すべてのkeywordsに先行する、長さが包含区間 [3, 8] にある 1 つのサブタグです。
    5. Assert: len ≥ 2。
    6. keywordundefinedlen ≠ 2 の場合、
      1. subtagattributes の要素でなければ、attributessubtag を追加する。
    7. それ以外で len = 2 の場合、
      1. keywordRecord { [[Key]]: subtag, [[Value]]: "" } に設定する。
      2. keywords[[Key]]keyword.[[Key]] である要素が存在しなければ、keywordskeyword を追加する。
    8. それ以外で keyword.[[Value]] が空文字列である場合、
      1. keyword.[[Value]]subtag に設定する。
    9. それ以外の場合、
      1. keyword.[[Value]] を、keyword.[[Value]]"-"subtag連結に設定する。
    10. kk + len + 1 に設定する。
  9. 次を返す: Record { [[Attributes]]: attributes, [[Keywords]]: keywords }。

9.2.6 InsertUnicodeExtensionAndCanonicalize ( locale, attributes, keywords )

抽象操作 InsertUnicodeExtensionAndCanonicalize は引数 locale言語タグ)、attributes(文字列のList)、および keywordsRecordList)を取り、Unicode 正規化ロケール識別子を返します。これは、localeattributeskeywordsUnicode ロケール拡張シーケンスとして組み込み、その結果を正規化して返します。呼び出し時には次の手順を行います。

  1. Assert: localeUnicode ロケール拡張シーケンスを含まない。
  2. extension"-u" とする。
  3. attributes の各要素 attr について、
    1. extensionextension"-"attr連結に設定する。
  4. keywords の各Record { [[Key]], [[Value]] } keyword について、
    1. extensionextension"-"keyword.[[Key]]連結に設定する。
    2. keyword.[[Value]] が空文字列でない場合、extensionextension"-"keyword.[[Value]]連結に設定する。
  5. extension"-u" なら、CanonicalizeUnicodeLocaleId(locale) を返す。
  6. privateIndexStringIndexOf(locale, "-x-", 0) とする。
  7. privateIndexnot-found の場合、
    1. newLocalelocaleextension連結とする。
  8. それ以外の場合、
    1. preExtensionlocale の 0 から privateIndex までのsubstringとする。
    2. postExtensionlocaleprivateIndex 以降のsubstringとする。
    3. newLocalepreExtensionextensionpostExtension連結とする。
  9. Assert: IsStructurallyValidLanguageTag(newLocale) は true である。
  10. CanonicalizeUnicodeLocaleId(newLocale) を返す。

9.2.7 ResolveLocale ( availableLocales, requestedLocales, options, relevantExtensionKeys, localeData )

抽象操作 ResolveLocale は引数 availableLocales利用可能ロケール一覧)、requestedLocales言語優先リスト)、optionsRecord)、relevantExtensionKeys(文字列のList)、および localeDataRecord)を取り、Recordを返します。これは、BCP 47RFC 4647 セクション 3 で定義された「lookup」を実行し、options.[[localeMatcher]] で指定された通りに LookupMatchingLocaleByBestFit アルゴリズムまたは LookupMatchingLocaleByPrefix アルゴリズムを用いて requestedLocales を満たす availableLocales の最適な要素を決定し、Unicode ロケール拡張シーケンスを無視し、マッチの表現を返します。その表現には、localeData からの対応するデータと、relevantExtensionKeys の各要素について解決された値(マッチしたロケールのデータを既定とし、要求されたUnicode ロケール拡張シーケンスがあればそれを優先し、さらに options に値があればそれを優先)を含みます。requestedLocales のマッチした要素がUnicode ロケール拡張シーケンスを含む場合、[[Locale]] フィールドの言語タグにそれがコピーされます。ただし、key の値が relevantExtensionKeys に含まれない、または type の値が options の別値に置き換えられる keywordUnicode ロケール非終端記号は省略します。呼び出し時には次の手順を行います。

  1. matcheroptions.[[localeMatcher]] とする。
  2. matcher"lookup" のとき、
    1. rLookupMatchingLocaleByPrefix(availableLocales, requestedLocales) とする。
  3. それ以外の場合、
    1. rLookupMatchingLocaleByBestFit(availableLocales, requestedLocales) とする。
  4. rundefined なら、rRecord { [[locale]]: DefaultLocale(), [[extension]]: empty } に設定する。
  5. foundLocaler.[[locale]] とする。
  6. foundLocaleDatalocaleData.[[<foundLocale>]] とする。
  7. Assert: foundLocaleDataRecordである。
  8. result を新しいRecord とする。
  9. result.[[LocaleData]]foundLocaleData に設定する。
  10. r.[[extension]]empty でない場合、
    1. componentsUnicodeExtensionComponents(r.[[extension]]) とする。
    2. keywordscomponents.[[Keywords]] とする。
  11. それ以外の場合、
    1. keywords を新しい空のList とする。
  12. supportedKeywords を新しい空のList とする。
  13. relevantExtensionKeys の各要素 key について、
    1. keyLocaleDatafoundLocaleData.[[<key>]] とする。
    2. Assert: keyLocaleDataListである。
    3. valuekeyLocaleData[0] とする。
    4. Assert: valueString であるか、または null である。
    5. supportedKeywordempty とする。
    6. keywords[[Key]]key である要素を含むなら、
      1. entry を、keywords のうち [[Key]]key である要素とする。
      2. requestedValueentry.[[Value]] とする。
      3. requestedValue が空文字列でない場合、
        1. keyLocaleDatarequestedValue を含むなら、
          1. valuerequestedValue に設定する。
          2. supportedKeywordRecord { [[Key]]: key, [[Value]]: value } に設定する。
      4. それ以外で keyLocaleData"true" を含む場合、
        1. value"true" に設定する。
        2. supportedKeywordRecord { [[Key]]: key, [[Value]]: "" } に設定する。
    7. Assert: options は [[<key>]] フィールドを持つ。
    8. optionsValueoptions.[[<key>]] とする。
    9. Assert: optionsValueString であるか、または undefined もしくは null である。
    10. optionsValueString である場合、
      1. ukeykeyASCII-lowercase とする。
      2. optionsValueCanonicalizeUValue(ukey, optionsValue) に設定する。
      3. optionsValue が空文字列である場合、
        1. optionsValue"true" に設定する。
    11. SameValue(optionsValue, value) が false かつ keyLocaleDataoptionsValue を含む場合、
      1. valueoptionsValue に設定する。
      2. supportedKeywordempty に設定する。
    12. supportedKeywordempty でない場合、supportedKeywordssupportedKeyword を追加する。
    13. result.[[<key>]] を value に設定する。
  14. supportedKeywords が空でない場合、
    1. supportedAttributes を新しい空のList とする。
    2. foundLocaleInsertUnicodeExtensionAndCanonicalize(foundLocale, supportedAttributes, supportedKeywords) に設定する。
  15. result.[[Locale]]foundLocale に設定する。
  16. result を返す。

9.2.8 ResolveOptions ( constructor, localeData, locales, options [ , specialBehaviours [ , modifyResolutionOptions ] ] )

抽象操作 ResolveOptions は引数 constructorサービスコンストラクタ)、localeDataRecord)、localesECMAScript 言語値)、optionsECMAScript 言語値)、および任意引数 specialBehavioursenumList)、modifyResolutionOptions(1 つのパラメータを持つ抽象クロージャ)を取り、正常完了で含む Record(フィールド [[Options]](Object)、[[ResolvedLocale]]Record)、[[ResolutionOptions]]Record))か、throw completionを返します。これは constructor の入力を読み取り、ロケールへ解決します。呼び出し時には次の手順を行います。

  1. requestedLocales を ? CanonicalizeLocaleList(locales) とする。
  2. specialBehaviours が存在し require-options を含み、かつ optionsundefined の場合、TypeError 例外を投げる。
  3. specialBehaviours が存在し coerce-options を含む場合、options を ? CoerceOptionsToObject(options) に設定する。そうでなければ、options を ? GetOptionsObject(options) に設定する。
  4. matcher を ? GetOption(options, "localeMatcher", string, « "lookup", "best fit" », "best fit") とする。
  5. optRecord { [[localeMatcher]]: matcher } とする。
  6. constructor.[[ResolutionOptionDescriptors]] の各Resolution Option Descriptor desc について、
    1. desc[[Type]] フィールドを持つ場合、typedesc.[[Type]] とし、そうでなければ typestring とする。
    2. desc[[Values]] フィールドを持つ場合、valuesdesc.[[Values]] とし、そうでなければ valuesempty とする。
    3. value を ? GetOption(options, desc.[[Property]], type, values, undefined) とする。
    4. valueundefined でない場合、
      1. value を ! ToString(value) に設定する。
      2. valuetypeUnicode ロケール非終端記号にマッチしない場合、RangeError 例外を投げる。
    5. keydesc.[[Key]] とする。
    6. opt.[[<key>]] を value に設定する。
  7. modifyResolutionOptions が存在する場合、! modifyResolutionOptions(opt) を実行する。
  8. resolutionResolveLocale(constructor.[[AvailableLocales]], requestedLocales, opt, constructor.[[RelevantExtensionKeys]], localeData) とする。
  9. Record { [[Options]]: options, [[ResolvedLocale]]: resolution, [[ResolutionOptions]]: opt } を返す。

9.2.9 FilterLocales ( availableLocales, requestedLocales, options )

抽象操作 FilterLocales は引数 availableLocales利用可能ロケール一覧)、requestedLocales言語優先リスト)、および optionsECMAScript 言語値)を取り、正常完了で含む Unicode 正規化ロケール識別子List、または throw completionを返します。これは、BCP 47RFC 4647 セクション 3 で定義される「filtering」を実行し、options で指定された通りに LookupMatchingLocaleByBestFit アルゴリズムまたは LookupMatchingLocaleByPrefix アルゴリズムを用いて、availableLocales が一致ロケールを含む requestedLocales の要素を相対順序を保って返します。呼び出し時には以下の手順を行います。

  1. options を ? CoerceOptionsToObject(options) に設定する。
  2. matcher を ? GetOption(options, "localeMatcher", string, « "lookup", "best fit" », "best fit") とする。
  3. subset を新しい空のListとする。
  4. requestedLocales の各要素 locale について、
    1. matcher"lookup" の場合、
      1. matchLookupMatchingLocaleByPrefix(availableLocales, « locale ») とする。
    2. それ以外の場合、
      1. matchLookupMatchingLocaleByBestFit(availableLocales, « locale ») とする。
    3. matchundefined でない場合、subsetlocale を追加する。
  5. CreateArrayFromList(subset) を返す。

9.2.10 GetOptionsObject ( options )

抽象操作 GetOptionsObject は引数 optionsECMAScript 言語値)を取り、Object を正常完了で含むか、throw completionを返します。これは、GetOptionでの使用に適した Object を返し、options 自身または既定の空の Object のいずれかです。optionsundefined でも Object でもない場合は TypeError を投げます。呼び出し時には次の手順を行います。

  1. optionsundefined なら、
    1. OrdinaryObjectCreate(null) を返す。
  2. optionsObject であるなら、
    1. options を返す。
  3. TypeError 例外を投げる。

9.2.11 CoerceOptionsToObject ( options )

抽象操作 CoerceOptionsToObject は引数 optionsECMAScript 言語値)を取り、Object を正常完了で含むか、throw completionを返します。これは optionsGetOptionでの使用に適した Object へ強制変換し、既定は空の Object です。非 null のプリミティブ値を Object へ強制するため、新機能では GetOptionsObjectの使用が推奨されます。呼び出し時には次の手順を行います。

  1. optionsundefined なら、
    1. OrdinaryObjectCreate(null) を返す。
  2. ToObject(options) を返す。

9.2.12 GetOption ( options, property, type, values, default )

抽象操作 GetOption は引数 options(Object)、propertyproperty key)、typeboolean または string)、valuesempty またはList(要素はECMAScript 言語値))、および defaultrequired またはECMAScript 言語値)を取り、ECMAScript 言語値正常完了で含むか、throw completionを返します。これは、options の指定されたプロパティの値を取り出し、必要な type に変換し、valuesempty でない場合にはその中に許可されているかを検査し、値が undefined の場合には default を代入します。呼び出し時には次の手順を行います。

  1. value を ? Get(options, property) とする。
  2. valueundefined の場合、
    1. defaultrequired なら、RangeError 例外を投げる。
    2. default を返す。
  3. typeboolean の場合、
    1. valueToBoolean(value) に設定する。
  4. それ以外の場合、
    1. Assert: typestring である。
    2. value を ? ToString(value) に設定する。
  5. valuesempty でなく、かつ valuesvalue を含まない場合、RangeError 例外を投げる。
  6. value を返す。

9.2.13 GetBooleanOrStringNumberFormatOption ( options, property, stringValues, fallback )

抽象操作 GetBooleanOrStringNumberFormatOption は引数 options(Object)、propertyproperty key)、stringValues(文字列のList)、および fallbackECMAScript 言語値)を取り、Boolean、String、または fallback のいずれかを正常完了で含むか、throw completionを返します。これは、与えられた options オブジェクトから property という名前のプロパティの値を取り出します。その値が undefined なら fallback を返し、その値が true なら true を返し、その値が false に強制されれば false を返し、それ以外の場合はそれを String に強制し、stringValues で許可されていればその結果を返します。呼び出し時には次の手順を行います。

  1. value を ? Get(options, property) とする。
  2. valueundefined なら、fallback を返す。
  3. valuetrue なら、true を返す。
  4. ToBoolean(value) が false なら、false を返す。
  5. value を ? ToString(value) に設定する。
  6. stringValuesvalue を含まない場合、RangeError 例外を投げる。
  7. value を返す。

9.2.14 DefaultNumberOption ( value, minimum, maximum, fallback )

抽象操作 DefaultNumberOption は引数 valueECMAScript 言語値)、minimum整数)、maximum整数)、および fallback整数または undefined)を取り、正常完了で含む 整数または undefined、もしくはthrow completionを返します。これは value整数に変換し、許可された範囲内にあるかを検査し、必要に応じて fallback 値を補います。呼び出し時には次の手順を行います。

  1. valueundefined なら、fallback を返す。
  2. value を ? ToNumber(value) に設定する。
  3. value有限でない、または (value) < minimum、もしくは (value) > maximum の場合、RangeError 例外を投げる。
  4. floor((value)) を返す。

9.2.15 GetNumberOption ( options, property, minimum, maximum, fallback )

抽象操作 GetNumberOption は引数 options(Object)、property(String)、minimum整数)、maximum整数)、および fallback整数または undefined)を取り、正常完了で含む 整数または undefined、もしくはthrow completionを返します。これは、与えられた options オブジェクトから property という名前のプロパティの値を取り出し、それを整数に変換し、許可範囲にあるかを検査し、必要に応じて fallback を補います。呼び出し時には次の手順を行います。

  1. value を ? Get(options, property) とする。
  2. DefaultNumberOption(value, minimum, maximum, fallback) を返す。

9.2.16 PartitionPattern ( pattern )

抽象操作 PartitionPattern は引数 patternパターン文字列)を取り、フィールド [[Type]](String)および [[Value]](String または undefined)を持つRecordListを返します。[[Type]]"literal" の場合に限り [[Value]] は String 値となり、それ以外の場合は undefined となります。呼び出し時には次の手順を行います。

  1. result を新しい空のListとする。
  2. placeholderEnd を -1 とする。
  3. placeholderStartStringIndexOf(pattern, "{", 0) とする。
  4. placeholderStartnot-found でない間、繰り返す、
    1. literal を、patternplaceholderEnd + 1 から placeholderStart までのsubstring とする。
    2. literal が空文字列でない場合、
      1. Record { [[Type]]: "literal", [[Value]]: literal } を result に追加する。
    3. placeholderEndStringIndexOf(pattern, "}", placeholderStart) に設定する。
    4. Assert: placeholderEndnot-found ではなく、かつ placeholderStart < placeholderEnd である。
    5. placeholderName を、patternplaceholderStart + 1 から placeholderEnd までのsubstring とする。
    6. Record { [[Type]]: placeholderName, [[Value]]: undefined } を result に追加する。
    7. placeholderStartStringIndexOf(pattern, "{", placeholderEnd) に設定する。
  5. tail を、patternplaceholderEnd + 1 以降のsubstring とする。
  6. tail が空文字列でない場合、
    1. Record { [[Type]]: "literal", [[Value]]: tail } を result に追加する。
  7. result を返す。

10 Collator オブジェクト

10.1 Intl.Collator コンストラクタ

Intl.Collator のコンストラクタ

Intl オブジェクトのすべてのサービスコンストラクタプロパティに共通する挙動は、9.1 に規定される。

10.1.1 Intl.Collator ( [ locales [ , options ] ] )

Intl.Collator 関数が省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. NewTarget が undefined なら、newTargetアクティブ関数オブジェクト とし、そうでなければ newTarget を NewTarget とする。
  2. internalSlotsList を « [[InitializedCollator]], [[Locale]], [[Usage]], [[Collation]], [[Numeric]], [[CaseFirst]], [[Sensitivity]], [[IgnorePunctuation]], [[BoundCompare]] » とする。
  3. collator を ? OrdinaryCreateFromConstructor(newTarget, "%Intl.Collator.prototype%", internalSlotsList) とする。
  4. 注: ResolveOptions のためのロケールデータの情報源は options"usage" プロパティに依存するが、以下の 2 つのステップは、その参照に先立って観測可能でなければならず(かつ ResolveOptions の内部で観測可能に繰り返されてはならない)。
  5. requestedLocales を ? CanonicalizeLocaleList(locales) とする。
  6. options を ? CoerceOptionsToObject(options) に設定する。
  7. usage を ? GetOption(options, "usage", string, « "sort", "search" », "sort") とする。
  8. collator.[[Usage]]usage に設定する。
  9. usage"sort" なら、
    1. localeData%Intl.Collator%.[[SortLocaleData]] とする。
  10. それ以外の場合、
    1. localeData%Intl.Collator%.[[SearchLocaleData]] とする。
  11. optionsResolution を ? ResolveOptions(%Intl.Collator%, localeData, CreateArrayFromList(requestedLocales), options) とする。
  12. roptionsResolution.[[ResolvedLocale]] とする。
  13. collator.[[Locale]]r.[[Locale]] に設定する。
  14. もし r.[[co]]null なら、collation"default" とし、そうでなければ collationr.[[co]] とする。
  15. collator.[[Collation]]collation に設定する。
  16. collator.[[Numeric]]SameValue(r.[[kn]], "true") に設定する。
  17. collator.[[CaseFirst]]r.[[kf]] に設定する。
  18. resolvedLocaleDatar.[[LocaleData]] とする。
  19. usage"sort" なら defaultSensitivity"variant" とし、そうでなければ defaultSensitivityresolvedLocaleData.[[sensitivity]] とする。
  20. collator.[[Sensitivity]] を ? GetOption(options, "sensitivity", string, « "base", "accent", "case", "variant" », defaultSensitivity) に設定する。
  21. defaultIgnorePunctuationresolvedLocaleData.[[ignorePunctuation]] とする。
  22. collator.[[IgnorePunctuation]] を ? GetOption(options, "ignorePunctuation", boolean, empty, defaultIgnorePunctuation) に設定する。
  23. collator を返す。
"usage" オプションで "search" が指定された場合に関連付けられる照合順序は、特定の順序であることが保証されないため、一致する文字列の検索のみに使用すべきです。この挙動は Unicode Technical Standard #35 Part 1 Core, Unicode Collation Identifier および Unicode Technical Standard #10 Unicode Collation Algorithm, Searching and Matching に記述されています。

10.2 Intl.Collator コンストラクタのプロパティ

Intl.Collator のコンストラクタ

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ。

10.2.1 Intl.Collator.prototype

Intl.Collator.prototype の値は %Intl.Collator.prototype% である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

10.2.2 Intl.Collator.supportedLocalesOf ( locales [ , options ] )

supportedLocalesOf メソッドが引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. availableLocales%Intl.Collator%.[[AvailableLocales]] とする。
  2. requestedLocales を ? CanonicalizeLocaleList(locales) とする。
  3. FilterLocales(availableLocales, requestedLocales, options) を返す。

10.2.3 内部スロット

[[AvailableLocales]] 内部スロットの値は、9.1 に記述された制約の範囲内で実装定義である。[[RelevantExtensionKeys]] 内部スロットの値は List であり、要素 "co" を必ず含み、要素 "kf" および "kn" のいずれかまたは両方を含んでもよく、その他の要素を含んではならない。

Unicode Technical Standard #35 Part 1 Core, Section 3.6.1 Key and Type Definitions では、照合に関連する 10 個のロケール拡張キーが説明されている:照合器の用途と特殊化のための "co"、代替処理のための "ka"、第二レベル重みの逆順のための "kb"、ケースレベルのための "kc"、ケース優先のための "kf"、ひらがなの第四レベルのための "kh"、正規化のための "kk"、数値のための "kn"、並べ替え順序のための "kr"、照合強度のための "ks"、および可変トップのための "vt"。しかし Collator では、用途はオプションオブジェクトの "usage" プロパティで、代替処理はオプションオブジェクトの "ignorePunctuation" プロパティで、ケースレベルおよび強度はオプションオブジェクトの "sensitivity" プロパティで指定される。"co" キーは言語タグ内で照合器の特殊化に対してのみサポートされ、"kb""kh""kk""kr""vt" のキーはこのバージョンの国際化 API では許可されない。残りのキーのサポートは実装依存である。

[[ResolutionOptionDescriptors]] 内部スロットの値は « { [[Key]]: "co", [[Property]]: "collation" }, { [[Key]]: "kn", [[Property]]: "numeric", [[Type]]: boolean }, { [[Key]]: "kf", [[Property]]: "caseFirst", [[Values]]: « "upper", "lower", "false" » } » である。

[[SortLocaleData]] および [[SearchLocaleData]] 内部スロットの値は、9.1 に記述された制約および以下の追加制約の範囲内で実装定義であり、すべてのロケール値 locale について次を満たす:

  • [[SortLocaleData]].[[<locale>]].[[co]][[SearchLocaleData]].[[<locale>]].[[co]] の最初の要素は null でなければならない。
  • "standard" および "search" の値は、いかなる [[SortLocaleData]].[[<locale>]].[[co]] および [[SearchLocaleData]].[[<locale>]].[[co]]List においても使用してはならない。
  • [[SearchLocaleData]].[[<locale>]] は、[[sensitivity]] フィールドを持ち、その String 値は "base""accent""case""variant" のいずれかでなければならない。
  • [[SearchLocaleData]].[[<locale>]] と [[SortLocaleData]].[[<locale>]] は、Boolean 値を持つ [[ignorePunctuation]] フィールドを持たなければならない。

10.3 Intl.Collator プロトタイプオブジェクトのプロパティ

Intl.Collator プロトタイプオブジェクト

  • %Intl.Collator.prototype% である。
  • 通常のオブジェクトである。
  • Intl.Collator のインスタンスではなく、[[InitializedCollator]] 内部スロットや、Intl.Collator インスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

10.3.1 Intl.Collator.prototype.constructor

Intl.Collator.prototype.constructor の初期値は %Intl.Collator% である。

10.3.2 Intl.Collator.prototype.resolvedOptions ( )

この関数は、オブジェクトの初期化中に計算されたロケールおよびオプションへのアクセスを提供する。

  1. collatorthis の値とする。
  2. RequireInternalSlot(collator, [[InitializedCollator]]) を実行する。
  3. optionsOrdinaryObjectCreate(%Object.prototype%) とする。
  4. 表 3 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. p を現在の行の Property 値とする。
    2. v を、現在の行の Internal Slot 値という名前を持つ collator の内部スロットの値とする。
    3. 現在の行に Extension Key 値があるなら、
      1. extensionKey を現在の行の Extension Key 値とする。
      2. もし %Intl.Collator%.[[RelevantExtensionKeys]]extensionKey を含まないなら、
        1. vundefined に設定する。
    4. vundefined でないなら、
      1. CreateDataPropertyOrThrow(options, p, v) を実行する。
  5. options を返す。
表 3: Collator インスタンスの解決済みオプション
Internal Slot Property Extension Key
[[Locale]] "locale"
[[Usage]] "usage"
[[Sensitivity]] "sensitivity"
[[IgnorePunctuation]] "ignorePunctuation"
[[Collation]] "collation"
[[Numeric]] "numeric" "kn"
[[CaseFirst]] "caseFirst" "kf"

10.3.3 get Intl.Collator.prototype.compare

この名前付きアクセサプロパティは、この Collator オブジェクトのソート順序に従って 2 つの文字列を比較する関数を返す。

Intl.Collator.prototype.compare はアクセサプロパティであり、その setter アクセサ関数は undefined である。getter アクセサ関数は次の手順を行う:

  1. collatorthis の値とする。
  2. RequireInternalSlot(collator, [[InitializedCollator]]) を実行する。
  3. collator.[[BoundCompare]]undefined なら、
    1. F を、10.3.3.1 で定義される新しい組込みの関数オブジェクトとする。
    2. F.[[Collator]]collator に設定する。
    3. collator.[[BoundCompare]]F に設定する。
  4. collator.[[BoundCompare]] を返す。
返される関数は collator に束縛されるため、Array.prototype.sort やその他の関数に直接渡すことができる。

10.3.3.1 Collator 比較関数

Collator 比較関数は、[[Collator]] 内部スロットを持つ無名の組込み関数である。

Collator 比較関数 F が引数 x および y で呼び出されたとき、次の手順を行う:

  1. collatorF.[[Collator]] とする。
  2. Assert: collatorObject である,かつ collator[[InitializedCollator]] 内部スロットを持つ。
  3. x が与えられていなければ、xundefined とする。
  4. y が与えられていなければ、yundefined とする。
  5. X を ? ToString(x) とする。
  6. Y を ? ToString(y) とする。
  7. CompareStrings(collator, X, Y) を返す。

Collator 比較関数の "length" プロパティは 2𝔽 である。

10.3.3.2 CompareStrings ( collator, x, y )

実装定義の抽象操作 CompareStrings は、引数 collator(Intl.Collator)、x(String)、y(String)を取り、Number を返す(ただし NaN ではない)。返される Number は、実装定義のロケール依存の文字列比較における xy の結果を表す。結果は、collator の有効なロケールおよび照合オプションに従った文字列値のソート順序に対応することを意図しており、xy より前の場合は負、後の場合は正、その他すべての場合(xy の相対順序がないことを表す)は 0 となる。文字列値は ECMA-2626.1.4 に記述される UTF-16 コードユニット列として解釈し、文字列内のサロゲートペア(0xD800〜0xDBFF のコードユニットに 0xDC00〜0xDFFF のコードユニットが続くもの)は対応するコードポイントとして解釈しなければならない。

以下に記述する挙動は、文字列の照合要素の並び(特に「基本文字」)のロケール依存の識別に依存し、異なる基本文字は常に不等と比較される(それらを含む文字列同士も不等と比較される)。同じ基本文字の大文字小文字、ダイアクリティカルマーク、または潜在的にその他の側面の違いによる比較結果は、collator.[[Sensitivity]] によって以下のようにさらに決まる:

表 4: Collator の Sensitivity の効果
[[Sensitivity]] 説明 "a""á" "a""A"
"base" 同じ基本文字の文字は、大文字小文字やダイアクリティカルマークの違いにかかわらず、不等とは比較されない。 等しい 等しい
"accent" 同じ基本文字の文字は、大文字小文字の違いにかかわらず、アクセントやその他のダイアクリティカルマークが異なる場合にのみ不等と比較される。 等しくない 等しい
"case" 同じ基本文字の文字は、アクセントやその他のダイアクリティカルマークの違いにかかわらず、大文字小文字が異なる場合にのみ不等と比較される。 等しい 等しくない
"variant" 同じ基本文字の文字は、大文字小文字、ダイアクリティカルマーク、または潜在的にその他の違いがあれば不等と比較される。 等しくない 等しくない
注 1
入力のコードポイントから基本文字への対応付けは、任意の合成(contraction)、展開(expansion)、衝突(collision)を含み得る。ダイアクリティカルマークを持つ特定の文字に特別な扱いを適用するものも含まれる。例えば、スウェーデン語では「ö」は「o」と異なる基本文字であり、「v」と「w」は同じ基本文字と見なされる。スロバキア語では「ch」は 1 つの基本文字であり、英語では「æ」は「a」で始まり「e」で終わる基本文字の並びである。

collator.[[IgnorePunctuation]]true の場合、句読点は無視される(例えば、句読点のみが異なる文字列は等しいと比較される)。

ロケール拡張キーで設定可能なオプションの解釈については、Unicode Technical Standard #35 Part 1 Core, Section 3.6.1 Key and Type Definitions を参照。

実際の返却値は、追加情報のエンコードを許すために実装定義である。しかし、与えられた collator に対するこの操作は、x および y の関数と見なしたとき、すべての文字列集合に対して全順序を定める整合的な比較関数であることが要求される。また、Unicode Standard に従う正準同値性を認識し尊重し、正準同値な識別可能な文字列を比較する場合には +0𝔽 を返すことが要求される。

注 2
CompareStrings 抽象操作は、Unicode Technical Standard #10: Unicode Collation Algorithm に従って実装し、collator の有効なロケールおよび照合オプションに対するテーラリングを用いることが推奨される。実装には Common Locale Data Repository(https://cldr.unicode.org/)が提供するテーラリングを使用することが推奨される。
注 3
同じ解決済みオプションを持つ Collator インスタンスに対する CompareStrings 抽象操作の挙動が、同一実装の異なるバージョン間で同一のままであるとアプリケーションが仮定すべきではない。

10.3.4 Intl.Collator.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は、String 値 "Intl.Collator" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

10.4 Intl.Collator インスタンスのプロパティ

Intl.Collator インスタンスは、通常のオブジェクトであり、%Intl.Collator.prototype% からプロパティを継承する。

Intl.Collator インスタンスは [[InitializedCollator]] 内部スロットを持つ。

Intl.Collator インスタンスはまた、The Intl.Collator Constructor によって計算されるいくつかの内部スロットも持つ:

  • [[Locale]] は、照合においてローカライズが使用されるロケールのString 値であり、その言語タグを表す。
  • [[Usage]] は、照合器の用途を識別する "sort" または "search" のいずれかの String 値である。
  • [[Sensitivity]] は、照合器の感度を識別する "base""accent""case""variant" のいずれかの String 値である。
  • [[IgnorePunctuation]] は、比較において句読点を無視すべきかどうかを指定するBoolean 値である。
  • [[Collation]] は、照合に使用される Unicode Collation Identifier を表すString 値である。ただし、値 "standard" および "search" は許可されず、値 "default" は許可される。

また、表 3 において内部スロット名に対応するキーが Intl.Collator の [[RelevantExtensionKeys]] 内部スロットに含まれている場合、Intl.Collator インスタンスは次の内部スロットも持つ:

  • [[Numeric]] は、数値ソートを使用するかどうかを指定するBoolean 値である。
  • [[CaseFirst]] は、"upper""lower"、または "false" のいずれかの String 値である。

最後に、Intl.Collator インスタンスは、compare アクセサ(10.3.3)によって返される関数をキャッシュする [[BoundCompare]] 内部スロットを持つ。

11 DateTimeFormat オブジェクト

11.1 Intl.DateTimeFormat コンストラクタ

Intl.DateTimeFormat のコンストラクタ

  • %Intl.DateTimeFormat% である。
  • Intl オブジェクト"DateTimeFormat" プロパティの初期値である。

Intl オブジェクト のすべてのサービスコンストラクタプロパティに共通する挙動は、9.1 に規定される。

11.1.1 Intl.DateTimeFormat ( [ locales [ , options ] ] )

Intl.DateTimeFormat 関数が省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. NewTarget が undefined なら、newTargetアクティブ関数オブジェクト とし、そうでなければ newTarget を NewTarget とする。
  2. dateTimeFormat を ? CreateDateTimeFormat(newTarget, locales, options, any, date) とする。
  3. 実装が コンストラクタ の規範的オプションモード(4.3 注 1)をサポートする場合、
    1. thisthis の値とする。
    2. ChainDateTimeFormat(dateTimeFormat, NewTarget, this) を返す。
  4. dateTimeFormat を返す。

11.1.1.1 ChainDateTimeFormat ( dateTimeFormat, newTarget, this )

抽象操作 ChainDateTimeFormat は、引数 dateTimeFormat(Intl.DateTimeFormat)、newTargetECMAScript 言語値)、および thisECMAScript 言語値)を取り、Object を正常完了で含むか、throw completionを返す。呼び出し時に次の手順を行う:

  1. newTargetundefined かつ ? OrdinaryHasInstance(%Intl.DateTimeFormat%, this) が true の場合、
    1. DefinePropertyOrThrow(this, %Intl%.[[FallbackSymbol]], PropertyDescriptor{ [[Value]]: dateTimeFormat, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
    2. this を返す。
  2. dateTimeFormat を返す。

11.1.2 CreateDateTimeFormat ( newTarget, locales, options, required, defaults )

抽象操作 CreateDateTimeFormat は、引数 newTargetコンストラクタ)、localesECMAScript 言語値)、optionsECMAScript 言語値)、requireddatetime、または any)、defaultsdatetime、または all)を取り、DateTimeFormat オブジェクトを正常完了で含むか、throw completionを返す。呼び出し時に次の手順を行う:

  1. dateTimeFormat を ? OrdinaryCreateFromConstructor(newTarget, "%Intl.DateTimeFormat.prototype%", « [[InitializedDateTimeFormat]], [[Locale]], [[Calendar]], [[NumberingSystem]], [[TimeZone]], [[HourCycle]], [[DateStyle]], [[TimeStyle]], [[DateTimeFormat]], [[BoundFormat]] ») とする。
  2. hour12undefined とする。
  3. modifyResolutionOptions を、パラメータ (options) を持ち hour12 をキャプチャする新しい抽象クロージャとし、呼び出されたとき次の手順を行う:
    1. hour12options.[[hour12]] に設定する。
    2. options から [[hour12]] フィールドを削除する。
    3. hour12undefined でない場合、options.[[hc]]null に設定する。
  4. optionsResolution を ? ResolveOptions(%Intl.DateTimeFormat%, %Intl.DateTimeFormat%.[[LocaleData]], locales, options, « coerce-options », modifyResolutionOptions) とする。
  5. optionsoptionsResolution.[[Options]] に設定する。
  6. roptionsResolution.[[ResolvedLocale]] に設定する。
  7. dateTimeFormat.[[Locale]]r.[[Locale]] に設定する。
  8. resolvedCalendarr.[[ca]] に設定する。
  9. dateTimeFormat.[[Calendar]]resolvedCalendar に設定する。
  10. dateTimeFormat.[[NumberingSystem]]r.[[nu]] に設定する。
  11. resolvedLocaleDatar.[[LocaleData]] に設定する。
  12. hour12true の場合、
    1. hcresolvedLocaleData.[[hourCycle12]] に設定する。
  13. それ以外で hour12false の場合、
    1. hcresolvedLocaleData.[[hourCycle24]] に設定する。
  14. それ以外の場合、
    1. Assert: hour12undefined である。
    2. hcr.[[hc]] に設定する。
    3. hcnull の場合、hcresolvedLocaleData.[[hourCycle]] に設定する。
  15. timeZone を ? Get(options, "timeZone") とする。
  16. timeZoneundefined の場合、
    1. timeZoneSystemTimeZoneIdentifier() に設定する。
  17. それ以外の場合、
    1. timeZone を ? ToString(timeZone) に設定する。
  18. IsTimeZoneOffsetString(timeZone) が true の場合、
    1. parseResultParseText(StringToCodePoints(timeZone), UTCOffset) に設定する。
    2. Assert: parseResult構文ノードである。
    3. parseResult が複数の MinuteSecond 構文ノード を含む場合、RangeError 例外を投げる。
    4. offsetNanosecondsParseTimeZoneOffsetString(timeZone) に設定する。
    5. offsetMinutesoffsetNanoseconds / (6 × 1010) に設定する。
    6. Assert: offsetMinutes整数である。
    7. timeZoneFormatOffsetTimeZoneIdentifier(offsetMinutes) に設定する。
  19. それ以外の場合、
    1. timeZoneIdentifierRecordGetAvailableNamedTimeZoneIdentifier(timeZone) に設定する。
    2. timeZoneIdentifierRecordempty の場合、RangeError 例外を投げる。
    3. timeZonetimeZoneIdentifierRecord.[[PrimaryIdentifier]] に設定する。
  20. dateTimeFormat.[[TimeZone]]timeZone に設定する。
  21. formatOptions を新しいRecordとする。
  22. formatOptions.[[hourCycle]]hc に設定する。
  23. hasExplicitFormatComponentsfalse に設定する。
  24. 表 16 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. prop を現在の行の Property 列の名前とする。
    2. prop"fractionalSecondDigits" なら、
      1. value を ? GetNumberOption(options, "fractionalSecondDigits", 1, 3, undefined) とする。
    3. それ以外の場合、
      1. values を現在の行の Values 列の文字列からなるListとする。
      2. value を ? GetOption(options, prop, string, values, undefined) とする。
    4. formatOptions.[[<prop>]] を value に設定する。
    5. valueundefined でない場合、
      1. hasExplicitFormatComponentstrue に設定する。
  25. formatMatcher を ? GetOption(options, "formatMatcher", string, « "basic", "best fit" », "best fit") に設定する。
  26. dateStyle を ? GetOption(options, "dateStyle", string, « "full", "long", "medium", "short" », undefined) に設定する。
  27. dateTimeFormat.[[DateStyle]]dateStyle に設定する。
  28. timeStyle を ? GetOption(options, "timeStyle", string, « "full", "long", "medium", "short" », undefined) に設定する。
  29. dateTimeFormat.[[TimeStyle]]timeStyle に設定する。
  30. dateStyleundefined でない、または timeStyleundefined でない場合、
    1. hasExplicitFormatComponentstrue の場合、
      1. TypeError 例外を投げる。
    2. requireddate かつ timeStyleundefined でない場合、
      1. TypeError 例外を投げる。
    3. requiredtime かつ dateStyleundefined でない場合、
      1. TypeError 例外を投げる。
    4. stylesresolvedLocaleData.[[styles]].[[<resolvedCalendar>]] に設定する。
    5. bestFormatDateTimeStyleFormat(dateStyle, timeStyle, styles) に設定する。
  31. それ以外の場合、
    1. needDefaultstrue に設定する。
    2. requireddate または any の場合、
      1. « "weekday", "year", "month", "day" » の各プロパティ名 prop について、
        1. valueformatOptions.[[<prop>]] に設定する。
        2. valueundefined でない場合、needDefaultsfalse に設定する。
    3. requiredtime または any の場合、
      1. « "dayPeriod", "hour", "minute", "second", "fractionalSecondDigits" » の各プロパティ名 prop について、
        1. valueformatOptions.[[<prop>]] に設定する。
        2. valueundefined でない場合、needDefaultsfalse に設定する。
    4. needDefaultstrue かつ defaultsdate または all の場合、
      1. « "year", "month", "day" » の各プロパティ名 prop について、
        1. formatOptions.[[<prop>]] を "numeric" に設定する。
    5. needDefaultstrue かつ defaultstime または all の場合、
      1. « "hour", "minute", "second" » の各プロパティ名 prop について、
        1. formatOptions.[[<prop>]] を "numeric" に設定する。
    6. formatsresolvedLocaleData.[[formats]].[[<resolvedCalendar>]] に設定する。
    7. formatMatcher"basic" の場合、
      1. bestFormatBasicFormatMatcher(formatOptions, formats) に設定する。
    8. それ以外の場合、
      1. bestFormatBestFitFormatMatcher(formatOptions, formats) に設定する。
  32. dateTimeFormat.[[DateTimeFormat]]bestFormat に設定する。
  33. bestFormat[[hour]] フィールドを持つ場合、
    1. dateTimeFormat.[[HourCycle]]hc に設定する。
  34. dateTimeFormat を返す。

11.1.3 FormatOffsetTimeZoneIdentifier ( offsetMinutes )

抽象操作 FormatOffsetTimeZoneIdentifier は、引数 offsetMinutes整数)を取り、String を返す。 UTC オフセット(分単位)を ±HH:MM の形式で表現した UTC オフセット文字列に変換する。 呼び出し時に次の手順を行う:

  1. offsetMinutes ≥ 0 の場合、sign をコードユニット 0x002B(PLUS SIGN)とし、そうでなければ sign をコードユニット 0x002D(HYPHEN-MINUS)とする。
  2. absoluteMinutesabs(offsetMinutes) に設定する。
  3. hoursfloor(absoluteMinutes / 60) に設定する。
  4. minutesabsoluteMinutes modulo 60 に設定する。
  5. signToZeroPaddedDecimalString(hours, 2)、コードユニット 0x003A(COLON)、および ToZeroPaddedDecimalString(minutes, 2) の連結を返す。

11.2 Intl.DateTimeFormat コンストラクタのプロパティ

Intl.DateTimeFormat のコンストラクタ

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ。

11.2.1 Intl.DateTimeFormat.prototype

Intl.DateTimeFormat.prototype の値は %Intl.DateTimeFormat.prototype% である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

11.2.2 Intl.DateTimeFormat.supportedLocalesOf ( locales [ , options ] )

supportedLocalesOf メソッドが引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. availableLocales%Intl.DateTimeFormat%.[[AvailableLocales]] とする。
  2. requestedLocales を ? CanonicalizeLocaleList(locales) とする。
  3. FilterLocales(availableLocales, requestedLocales, options) を返す。

11.2.3 内部スロット

[[AvailableLocales]] 内部スロットの値は、9.1 に記述された制約の範囲内で実装定義である。

[[RelevantExtensionKeys]] 内部スロットの値は « "ca", "hc", "nu" » である。

注 1
Unicode Technical Standard #35 Part 1 Core, Section 3.6.1 Key and Type Definitions では、日付と時刻の書式設定に関連する 4 つのロケール拡張キーが説明されている。暦のための "ca"、時刻の時間制のための "hc"、(書式化された数値の)数字体系のための "nu"、およびタイムゾーンのための "tz" である。ただし DateTimeFormat では、タイムゾーンはオプションオブジェクトの "timeZone" プロパティによって指定することが要求される。

[[ResolutionOptionDescriptors]] 内部スロットの値は « { [[Key]]: "ca", [[Property]]: "calendar" }, { [[Key]]: "nu", [[Property]]: "numberingSystem" }, { [[Key]]: "hour12", [[Property]]: "hour12", [[Type]]: boolean }, { [[Key]]: "hc", [[Property]]: "hourCycle", [[Values]]: « "h11", "h12", "h23", "h24" » } » である。

[[LocaleData]] 内部スロットの値は、すべてのロケール値 locale について、9.1 に記述された制約および以下の追加制約の範囲内で実装定義である:

  • [[LocaleData]].[[<locale>]].[[nu]]List でなければならず、その中に "native""traditio""finance" の値を含んではならない。
  • [[LocaleData]].[[<locale>]].[[hc]] は « null, "h11", "h12", "h23", "h24" » でなければならない。
  • [[LocaleData]].[[<locale>]].[[hourCycle]]"h11""h12""h23"、または "h24" のいずれかの String 値でなければならない。
  • [[LocaleData]].[[<locale>]].[[hourCycle12]]"h11" または "h12" のいずれかの String 値でなければならない。
  • [[LocaleData]].[[<locale>]].[[hourCycle24]]"h23" または "h24" のいずれかの String 値でなければならない。
  • [[LocaleData]].[[<locale>]] は [[formats]] フィールドを持たなければならない。この [[formats]] フィールドの値は、各暦の値 calendar に対する [[<calendar>]] フィールドを持つ Record でなければならない。各 [[<calendar>]] フィールドの値は、DateTime Format RecordsList でなければならない。そのような List 内の複数の Records は、対応する値が少なくとも 1 つのフィールドで異なる限り、同じフィールドの部分集合を使用してよい。各ロケールについて、次の部分集合が利用可能でなければならない:
    • weekday, year, month, day, hour, minute, second, fractionalSecondDigits
    • weekday, year, month, day, hour, minute, second
    • weekday, year, month, day
    • year, month, day
    • year, month
    • month, day
    • month
    • hour, minute, second, fractionalSecondDigits
    • hour, minute, second
    • hour, minute
    • dayPeriod, hour, minute, second, fractionalSecondDigits
    • dayPeriod, hour, minute, second
    • dayPeriod, hour, minute
    • dayPeriod, hour
  • [[LocaleData]].[[<locale>]] は [[styles]] フィールドを持たなければならない。この [[styles]] フィールドの値は、各暦の値 calendar に対する [[<calendar>]] フィールドを持つ Record でなければならない。各 [[<calendar>]] フィールドの値は DateTime Styles Record でなければならない。

11.2.3.1 DateTime フォーマットレコード

DateTime Format Record は、表 5 に定義されるフィールドを持つ。

表 5: DateTime Format Record
フィールド名 値の型 説明
[[weekday]] [[Weekday]]表 16 の Values 列) 任意フィールド。[[pattern]]substring "{weekday}" が含まれる場合に存在する。
[[era]] [[Era]]表 16 の Values 列) 任意フィールド。[[pattern]]substring "{era}" が含まれる場合に存在する。
[[year]] [[Year]]表 16 の Values 列) 任意フィールド。[[pattern]]"{year}""{yearName}""{relatedYear}" のいずれかの部分文字列が含まれる場合に存在する。
[[month]] [[Month]]表 16 の Values 列) 任意フィールド。[[pattern]]substring "{month}" が含まれる場合に存在する。
[[day]] [[Day]]表 16 の Values 列) 任意フィールド。[[pattern]]substring "{day}" が含まれる場合に存在する。
[[dayPeriod]] [[DayPeriod]]表 16 の Values 列) 任意フィールド。[[pattern]]substring "{dayPeriod}" が含まれる場合に存在する。
[[hour]] [[Hour]]表 16 の Values 列) 任意フィールド。[[pattern]]substring "{hour}" が含まれる場合に存在する。
[[minute]] [[Minute]]表 16 の Values 列) 任意フィールド。[[pattern]]substring "{minute}" が含まれる場合に存在する。
[[second]] [[Second]]表 16 の Values 列) 任意フィールド。[[pattern]]substring "{second}" が含まれる場合に存在する。
[[fractionalSecondDigits]] [[FractionalSecondDigits]]表 16 の Values 列) 任意フィールド。[[pattern]]substring "{fractionalSecondDigits}" が含まれる場合に存在する。
[[timeZoneName]] [[TimeZoneName]]表 16 の Values 列) 任意フィールド。[[pattern]]substring "{timeZoneName}" が含まれる場合に存在する。
[[pattern]] Pattern String Contains:そのレコードの各日付・時刻の書式構成フィールドに対して、substring の先頭が "{" で始まり、続いてフィールド名、続いて "}" が来る部分文字列を含む。レコードに [[year]] フィールドがある場合、文字列は "{yearName}" および "{relatedYear}" の部分文字列を含んでもよい。
[[pattern12]] Pattern String 任意フィールド。[[hour]] フィールドが存在する場合に存在する。[[pattern]] フィールドの部分文字列に加えて、"{ampm}" または "{dayPeriod}" の少なくとも一方の部分文字列を含む。
[[rangePatterns]] DateTime Range Pattern Record このフィールドのパターン文字列は、[[pattern]] と同様である。
[[rangePatterns12]] DateTime Range Pattern Record 任意フィールド。[[hour]] フィールドが存在する場合に存在する。このフィールドのパターン文字列は [[pattern12]] と同様である。

11.2.3.2 DateTime 範囲パターンレコード

DateTime Range Pattern Record は、表 6 に定義されるフィールドを持つ。

表 6: DateTime Range Pattern Record
フィールド名 値の型 説明
[[Default]] DateTime Range Pattern Format Record より特定の範囲パターンが利用できない場合に使用される既定の範囲パターンを含む。
[[Era]] DateTime Range Pattern Format Record 任意フィールド。開始日と終了日の間で era が異なる最大の暦要素である場合に使用する。
[[Year]] DateTime Range Pattern Format Record 任意フィールド。開始日と終了日の間で year が異なる最大の暦要素である場合に使用する。
[[Month]] DateTime Range Pattern Format Record 任意フィールド。開始日と終了日の間で month が異なる最大の暦要素である場合に使用する。
[[Day]] DateTime Range Pattern Format Record 任意フィールド。開始日と終了日の間で day が異なる最大の暦要素である場合に使用する。
[[AmPm]] DateTime Range Pattern Format Record 任意フィールド。開始日と終了日の間で ante または post meridiem が異なる最大の暦要素である場合に使用する。
[[DayPeriod]] DateTime Range Pattern Format Record 任意フィールド。開始日と終了日の間で day period が異なる最大の暦要素である場合に使用する。
[[Hour]] DateTime Range Pattern Format Record 任意フィールド。開始日と終了日の間で hour が異なる最大の暦要素である場合に使用する。
[[Minute]] DateTime Range Pattern Format Record 任意フィールド。開始日と終了日の間で minute が異なる最大の暦要素である場合に使用する。
[[Second]] DateTime Range Pattern Format Record 任意フィールド。開始日と終了日の間で second が異なる最大の暦要素である場合に使用する。
[[FractionalSecondDigits]] DateTime Range Pattern Format Record 任意フィールド。開始日と終了日の間で fractional seconds が異なる最大の暦要素である場合に使用する。

11.2.3.3 DateTime 範囲パターンフォーマットレコード

DateTime Range Pattern Format Record は、表 7 に定義されるフィールドを持つ。

表 7: DateTime Range Pattern Format Record
フィールド名 値の型 説明
[[weekday]] [[Weekday]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern Stringsubstring "{weekday}" が含まれる場合に存在する。
[[era]] [[Era]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern Stringsubstring "{era}" が含まれる場合に存在する。
[[year]] [[Year]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern String"{year}""{yearName}""{relatedYear}" の少なくとも一つの部分文字列が含まれる場合に存在する。
[[month]] [[Month]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern Stringsubstring "{month}" が含まれる場合に存在する。
[[day]] [[Day]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern Stringsubstring "{day}" が含まれる場合に存在する。
[[dayPeriod]] [[DayPeriod]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern Stringsubstring "{dayPeriod}" が含まれる場合に存在する。
[[hour]] [[Hour]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern Stringsubstring "{hour}" が含まれる場合に存在する。
[[minute]] [[Minute]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern Stringsubstring "{minute}" が含まれる場合に存在する。
[[second]] [[Second]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern Stringsubstring "{second}" が含まれる場合に存在する。
[[fractionalSecondDigits]] [[FractionalSecondDigits]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern Stringsubstring "{fractionalSecondDigits}" が含まれる場合に存在する。
[[timeZoneName]] [[TimeZoneName]]表 16 の Values 列) 任意フィールド。[[PatternParts]] の中の Pattern Stringsubstring "{timeZoneName}" が含まれる場合に存在する。
[[PatternParts]] ListDateTime Range Pattern Part Records の) 各レコードは範囲パターンの一部を表す。

11.2.3.4 DateTime 範囲パターンパートレコード

DateTime Range Pattern Part Record は、表 8 に定義されるフィールドを持つ。

表 8: DateTime Range Pattern Part Record
フィールド名 値の型 説明
[[Source]] "shared", "startRange", または "endRange" どちらの範囲の日付を [[Pattern]] フィールドの値を用いて書式化すべきかを示す。
[[Pattern]] Pattern String 通常の日付パターン文字列と同じ形式の文字列。

11.2.3.5 DateTime スタイルレコード

DateTime Styles Record は、表 9 に定義されるフィールドを持つ。

表 9: DateTime Styles Record
フィールド名 値の型
[[Date]] DateTime Style Record
[[Time]] DateTime Style Record
[[Connector]] DateTime Connector Record
[[DateTimeRangeFormat]] DateTime Date Range Record

11.2.3.6 DateTime スタイルレコード(詳細)

DateTime Style Record は、表 10 に定義されるフィールドを持つ。

表 10: DateTime Style Record
フィールド名 値の型 説明
[[full]] DateTime Format Record "full" スタイルのためのフォーマットレコード。
[[long]] DateTime Format Record "long" スタイルのためのフォーマットレコード。
[[medium]] DateTime Format Record "medium" スタイルのためのフォーマットレコード。
[[short]] DateTime Format Record "short" スタイルのためのフォーマットレコード。

11.2.3.7 DateTime コネクターレコード

DateTime Connector Record は、表 11 に定義されるフィールドを持つ。すべてのコネクターパターン文字列は、"{0}" および "{1}" という文字列を含まなければならない。

表 11: DateTime Connector Record
フィールド名 値の型 説明
[[full]] Pattern String 日付スタイルが "full" のときのコネクターパターン。
[[long]] Pattern String 日付スタイルが "long" のときのコネクターパターン。
[[medium]] Pattern String 日付スタイルが "medium" のときのコネクターパターン。
[[short]] Pattern String 日付スタイルが "short" のときのコネクターパターン。

11.2.3.8 DateTime 日付レンジレコード

DateTime Date Range Record は、表 12 に定義されるフィールドを持つ。

表 12: DateTime Date Range Record
フィールド名 値の型 説明
[[full]] DateTime Time Range Record 日付スタイルが "full" のときに使用する。
[[long]] DateTime Time Range Record 日付スタイルが "long" のときに使用する。
[[medium]] DateTime Time Range Record 日付スタイルが "medium" のときに使用する。
[[short]] DateTime Time Range Record 日付スタイルが "short" のときに使用する。

11.2.3.9 DateTime 時刻レンジレコード

DateTime Time Range Record は、表 13 に定義されるフィールドを持つ。

表 13: DateTime Time Range Record
フィールド名 値の型 説明
[[full]] DateTime Style Range Record 時刻スタイルが "full" のときに使用する。
[[long]] DateTime Style Range Record 時刻スタイルが "long" のときに使用する。
[[medium]] DateTime Style Range Record 時刻スタイルが "medium" のときに使用する。
[[short]] DateTime Style Range Record 時刻スタイルが "short" のときに使用する。

11.2.3.10 DateTime スタイルレンジレコード

DateTime Style Range Record は、表 14 に定義されるフィールドを持つ。

表 14: DateTime Style Range Record
フィールド名 値の型 説明
[[rangePatterns]] DateTime Range Pattern Record 日付スタイルと時刻スタイルを組み合わせるための範囲パターン。
[[rangePatterns12]] DateTime Range Pattern Record 任意フィールド。12 時間制フォーマットのために日付スタイルと時刻スタイルを組み合わせる範囲パターン。
注 2
例えば、ある実装は、英語ロケールデータの一部として次の Record を含むことがある:
  • [[hour]]: "numeric"
  • [[minute]]: "numeric"
  • [[pattern]]: "{hour}:{minute}"
  • [[pattern12]]: "{hour}:{minute} {ampm}"
  • [[rangePatterns]]:
    • [[Hour]]:
      • [[hour]]: "numeric"
      • [[minute]]: "numeric"
      • [[PatternParts]]:
        • {[[Source]]: "startRange", [[Pattern]]: "{hour}:{minute}"}
        • {[[Source]]: "shared", [[Pattern]]: " – "}
        • {[[Source]]: "endRange", [[Pattern]]: "{hour}:{minute}"}
    • [[Minute]]:
      • [[hour]]: "numeric"
      • [[minute]]: "numeric"
      • [[PatternParts]]:
        • {[[Source]]: "startRange", [[Pattern]]: "{hour}:{minute}"}
        • {[[Source]]: "shared", [[Pattern]]: " – "}
        • {[[Source]]: "endRange", [[Pattern]]: "{hour}:{minute}"}
    • [[Default]]:
      • [[year]]: "2-digit"
      • [[month]]: "numeric"
      • [[day]]: "numeric"
      • [[hour]]: "numeric"
      • [[minute]]: "numeric"
      • [[PatternParts]]:
        • {[[Source]]: "startRange", [[Pattern]]: "{day}/{month}/{year}, {hour}:{minute}"}
        • {[[Source]]: "shared", [[Pattern]]: " – "}
        • {[[Source]]: "endRange", [[Pattern]]: "{day}/{month}/{year}, {hour}:{minute}"}
  • [[rangePatterns12]]:
    • [[Hour]]:
      • [[hour]]: "numeric"
      • [[minute]]: "numeric"
      • [[PatternParts]]:
        • {[[Source]]: "startRange", [[Pattern]]: "{hour}:{minute}"}
        • {[[Source]]: "shared", [[Pattern]]: " – "}
        • {[[Source]]: "endRange", [[Pattern]]: "{hour}:{minute}"}
        • {[[Source]]: "shared", [[Pattern]]: " {ampm}"}
    • [[Minute]]:
      • [[hour]]: "numeric"
      • [[minute]]: "numeric"
      • [[PatternParts]]:
        • {[[Source]]: "startRange", [[Pattern]]: "{hour}:{minute}"}
        • {[[Source]]: "shared", [[Pattern]]: " – "}
        • {[[Source]]: "endRange", [[Pattern]]: "{hour}:{minute}"}
        • {[[Source]]: "shared", [[Pattern]]: " {ampm}"}
    • [[Default]]:
      • [[year]]: "2-digit"
      • [[month]]: "numeric"
      • [[day]]: "numeric"
      • [[hour]]: "numeric"
      • [[minute]]: "numeric"
      • [[PatternParts]]:
        • {[[Source]]: "startRange", [[Pattern]]: "{day}/{month}/{year}, {hour}:{minute} {ampm}"}
        • {[[Source]]: "shared", [[Pattern]]: " – "}
        • {[[Source]]: "endRange", [[Pattern]]: "{day}/{month}/{year}, {hour}:{minute} {ampm}"}
注 3
実装においては、Common Locale Data Repository(https://cldr.unicode.org/)が提供するロケールデータを使用することが推奨される。

11.3 Intl.DateTimeFormat プロトタイプオブジェクトのプロパティ

Intl.DateTimeFormat プロトタイプオブジェクト

  • %Intl.DateTimeFormat.prototype% である。
  • 通常のオブジェクトである。
  • Intl.DateTimeFormat のインスタンスではなく、[[InitializedDateTimeFormat]] 内部スロットや、Intl.DateTimeFormat インスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

11.3.1 Intl.DateTimeFormat.prototype.constructor

Intl.DateTimeFormat.prototype.constructor の初期値は %Intl.DateTimeFormat% である。

11.3.2 Intl.DateTimeFormat.prototype.resolvedOptions ( )

この関数は、オブジェクトの初期化時に計算されたロケールおよびオプションへのアクセスを提供する。

  1. dtfthis の値とする。
  2. 実装が コンストラクタ の規範的オプションモード(4.3 注 1)をサポートする場合、
    1. dtf を ? UnwrapDateTimeFormat(dtf) に設定する。
  3. RequireInternalSlot(dtf, [[InitializedDateTimeFormat]]) を実行する。
  4. optionsOrdinaryObjectCreate(%Object.prototype%) に設定する。
  5. 表 15 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. p を現在の行の Property 値とする。
    2. 現在の行に Internal Slot 値がある場合、
      1. vdtf の Internal Slot 名が現在の行の値である内部スロットの値とする。
    3. それ以外の場合、
      1. formatdtf.[[DateTimeFormat]] とする。
      2. format が [[<p>]] フィールドを持ち、dtf.[[DateStyle]]undefined かつ dtf.[[TimeStyle]]undefined なら、
        1. vformat.[[<p>]] に設定する。
      3. それ以外の場合、
        1. vundefined に設定する。
    4. vundefined でない場合、
      1. 現在の行に Conversion 値がある場合、
        1. conversion を現在の行の Conversion 値とする。
        2. conversionhour12 なら、
          1. v"h11" または "h12" なら vtrue に、そうでなければ vfalse に設定する。
        3. それ以外の場合、
          1. Assert: conversionnumber である。
          2. v𝔽(v) に設定する。
      2. CreateDataPropertyOrThrow(options, p, v) を実行する。
  6. options を返す。
表 15: DateTimeFormat インスタンスの解決済みオプション
Internal Slot Property Conversion
[[Locale]] "locale"
[[Calendar]] "calendar"
[[NumberingSystem]] "numberingSystem"
[[TimeZone]] "timeZone"
[[HourCycle]] "hourCycle"
[[HourCycle]] "hour12" hour12
"weekday"
"era"
"year"
"month"
"day"
"dayPeriod"
"hour"
"minute"
"second"
"fractionalSecondDigits" number
"timeZoneName"
[[DateStyle]] "dateStyle"
[[TimeStyle]] "timeStyle"

Web互換性の理由から、プロパティ "hourCycle" が設定されている場合は、"hourCycle""h11" または "h12" の時 "hour12"true に、"h23" または "h24" の時 "hour12"false に設定すべきである。

注 1
このAPIのバージョンでは、Intl.DateTimeFormat コンストラクタに options オブジェクトで "timeZone" プロパティが与えられなかった場合、プロパティ "timeZone"ホスト環境のタイムゾーンの識別子となる。第1版ではこの場合 "timeZone" プロパティは undefined であった。
注 2
第5版より前のバージョンとの互換性のため、"hourCycle" プロパティに加え "hour12" プロパティも設定される。

11.3.3 get Intl.DateTimeFormat.prototype.format

Intl.DateTimeFormat.prototype.format はアクセサプロパティであり、その setter アクセサ関数は undefined である。getter アクセサ関数は次の手順を行う:

  1. dtfthis の値とする。
  2. 実装が コンストラクタ の規範的オプションモード(4.3 注 1)をサポートする場合、
    1. dtf を ? UnwrapDateTimeFormat(dtf) に設定する。
  3. RequireInternalSlot(dtf, [[InitializedDateTimeFormat]]) を実行する。
  4. dtf.[[BoundFormat]]undefined の場合、
    1. F を DateTime Format Functions (11.5.4) で定義される新しい組込みの関数オブジェクトとする。
    2. F.[[DateTimeFormat]]dtf に設定する。
    3. dtf.[[BoundFormat]]F に設定する。
  5. dtf.[[BoundFormat]] を返す。
返される関数は dtf に束縛されるため、Array.prototype.map やその他の関数に直接渡すことができる。 これは新機能では継承されない慣習の名残であり、既存プログラムとの互換性維持のために保持されている。

11.3.4 Intl.DateTimeFormat.prototype.formatRange ( startDate, endDate )

formatRange メソッドが引数 startDateendDate で呼び出されたとき、次の手順を行う:

  1. dtfthis の値とする。
  2. RequireInternalSlot(dtf, [[InitializedDateTimeFormat]]) を実行する。
  3. startDateundefined または endDateundefined の場合、TypeError 例外を投げる。
  4. x を ? ToNumber(startDate) に設定する。
  5. y を ? ToNumber(endDate) に設定する。
  6. FormatDateTimeRange(dtf, x, y) を返す。

11.3.5 Intl.DateTimeFormat.prototype.formatRangeToParts ( startDate, endDate )

formatRangeToParts メソッドが引数 startDateendDate で呼び出されたとき、次の手順を行う:

  1. dtfthis の値とする。
  2. RequireInternalSlot(dtf, [[InitializedDateTimeFormat]]) を実行する。
  3. startDateundefined または endDateundefined の場合、TypeError 例外を投げる。
  4. x を ? ToNumber(startDate) に設定する。
  5. y を ? ToNumber(endDate) に設定する。
  6. FormatDateTimeRangeToParts(dtf, x, y) を返す。

11.3.6 Intl.DateTimeFormat.prototype.formatToParts ( date )

formatToParts メソッドが引数 date で呼び出されたとき、次の手順を行う:

  1. dtfthis の値とする。
  2. RequireInternalSlot(dtf, [[InitializedDateTimeFormat]]) を実行する。
  3. dateundefined の場合、
    1. x を ! Call(%Date.now%, undefined) に設定する。
  4. それ以外の場合、
    1. x を ? ToNumber(date) に設定する。
  5. FormatDateTimeToParts(dtf, x) を返す。

11.3.7 Intl.DateTimeFormat.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は、String 値 "Intl.DateTimeFormat" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

11.4 Intl.DateTimeFormat インスタンスのプロパティ

Intl.DateTimeFormat インスタンスは、通常のオブジェクトであり、%Intl.DateTimeFormat.prototype% からプロパティを継承する。

Intl.DateTimeFormat インスタンスは [[InitializedDateTimeFormat]] 内部スロットを持つ。

Intl.DateTimeFormat インスタンスはまた、Intl.DateTimeFormat コンストラクタによって計算されるいくつかの内部スロットも持つ:

  • [[Locale]] は、書式化においてローカライズが使用されるロケールのString 値であり、その言語タグを表す。
  • [[Calendar]] は、書式化に使用される Unicode Calendar Identifier を表すString 値である。
  • [[NumberingSystem]] は、書式化に使用される Unicode Number System Identifier を表すString 値である。
  • [[TimeZone]] は、書式化に使用されるString 値で、利用可能な名前付きタイムゾーン識別子またはオフセットタイムゾーン識別子のいずれかである。
  • [[HourCycle]] は、12時間制("h11""h12")または24時間制("h23""h24")のどちらを使用するかを示すString値である。"h11"および"h23"は時間0から始まり、それぞれ11および23まで進む。"h12"および"h24"は時間1から始まり、それぞれ12および24まで進む。[[HourCycle]][[DateTimeFormat]][[hour]] フィールドを持つ場合のみ使用される。
  • [[DateStyle]], [[TimeStyle]] はそれぞれ undefined または "full""long""medium""short" のいずれかの String 値である。
  • [[DateTimeFormat]]DateTime Format Record である。

最後に、Intl.DateTimeFormat インスタンスは、format アクセサ(11.3.3)によって返される関数をキャッシュする [[BoundFormat]] 内部スロットを持つ。

11.5 DateTimeFormat オブジェクトの抽象操作

いくつかの DateTimeFormat のアルゴリズムは、次の表の値を使用する。この表は、日付および時刻の書式の構成要素に対する内部スロット、プロパティ名、許容される値を提供する:

表 16: 日付および時刻の書式の構成要素
フィールド名 プロパティ
[[Weekday]] "weekday" "narrow", "short", "long"
[[Era]] "era" "narrow", "short", "long"
[[Year]] "year" "2-digit", "numeric"
[[Month]] "month" "2-digit", "numeric", "narrow", "short", "long"
[[Day]] "day" "2-digit", "numeric"
[[DayPeriod]] "dayPeriod" "narrow", "short", "long"
[[Hour]] "hour" "2-digit", "numeric"
[[Minute]] "minute" "2-digit", "numeric"
[[Second]] "second" "2-digit", "numeric"
[[FractionalSecondDigits]] "fractionalSecondDigits" 1, 2, 3
[[TimeZoneName]] "timeZoneName" "short", "long", "shortOffset", "longOffset", "shortGeneric", "longGeneric"

11.5.1 DateTimeStyleFormat ( dateStyle, timeStyle, styles )

抽象操作 DateTimeStyleFormat は引数 dateStyle ("full", "long", "medium", "short", または undefined)、timeStyle ("full", "long", "medium", "short", または undefined)、および stylesDateTime Styles Record)を取り、DateTime Format Record を返す。 styles は、あるロケール locale と暦 calendar について、%Intl.DateTimeFormat%.[[LocaleData]].[[<locale>]].[[styles]].[[<calendar>]] から得られる Record である。パラメータに基づき、日付時刻の書式化に適切な Record を返す。呼び出し時に次の手順を行う:

  1. Assert: dateStyleundefined でない、または timeStyleundefined でない。
  2. timeStyleundefined でないなら、
    1. Assert: timeStyle"full""long""medium""short" のいずれかである。
    2. timeFormatstyles.[[Time]].[[<timeStyle>]] とする。
  3. dateStyleundefined でないなら、
    1. Assert: dateStyle"full""long""medium""short" のいずれかである。
    2. dateFormatstyles.[[Date]].[[<dateStyle>]] とする。
  4. dateStyleundefined でなく、かつ timeStyleundefined でないなら、
    1. format を新しい DateTime Format Record とする。
    2. format に、dateFormat のすべてのフィールド(ただし [[pattern]] および [[rangePatterns]] を除く)を追加する。
    3. format に、timeFormat のすべてのフィールド(ただし [[pattern]][[rangePatterns]][[pattern12]]、および [[rangePatterns12]](存在する場合)を除く)を追加する。
    4. connectorstyles.[[Connector]].[[<dateStyle>]] とする。
    5. pattern を、connector の文字列中の substring "{0}"timeFormat.[[pattern]] で置換し、substring "{1}"dateFormat.[[pattern]] で置換した結果の文字列とする。
    6. format.[[pattern]]pattern に設定する。
    7. timeFormat[[pattern12]] フィールドを持つなら、
      1. pattern12 を、connector の文字列中の substring "{0}"timeFormat.[[pattern12]] で置換し、substring "{1}"dateFormat.[[pattern]] で置換した結果の文字列とする。
      2. format.[[pattern12]]pattern12 に設定する。
    8. dateTimeRangeFormatstyles.[[DateTimeRangeFormat]].[[<dateStyle>]].[[<timeStyle>]] とする。
    9. format.[[rangePatterns]]dateTimeRangeFormat.[[rangePatterns]] に設定する。
    10. dateTimeRangeFormat[[rangePatterns12]] フィールドを持つなら、
      1. format.[[rangePatterns12]]dateTimeRangeFormat.[[rangePatterns12]] に設定する。
    11. format を返す。
  5. timeStyleundefined でないなら、
    1. timeFormat を返す。
  6. Assert: dateStyleundefined ではない。
  7. dateFormat を返す。

11.5.2 BasicFormatMatcher ( options, formats )

抽象操作 BasicFormatMatcher は引数 optionsRecord)および formatsList。各要素は DateTime Format Records)を取り、DateTime Format Record を返す。呼び出し時に次の手順を行う:

  1. removalPenalty を 120 とする。
  2. additionPenalty を 20 とする。
  3. longLessPenalty を 8 とする。
  4. longMorePenalty を 6 とする。
  5. shortLessPenalty を 6 とする。
  6. shortMorePenalty を 3 とする。
  7. offsetPenalty を 1 とする。
  8. bestScore を -∞ とする。
  9. bestFormatundefined とする。
  10. formats の各要素 format について、次を行う:
    1. score を 0 とする。
    2. 表 16 の各行(ヘッダー行を除く)について、表の順序で次を行う:
      1. property を現在の行の Property 列に与えられた名前とする。
      2. options が [[<property>]] フィールドを持つなら、optionsPropoptions.[[<property>]] とし、そうでなければ optionsPropundefined とする。
      3. format が [[<property>]] フィールドを持つなら、formatPropformat.[[<property>]] とし、そうでなければ formatPropundefined とする。
      4. optionsPropundefinedformatPropundefined でないなら、
        1. scorescore - additionPenalty に設定する。
      5. それ以外で optionsPropundefined でなく formatPropundefined なら、
        1. scorescore - removalPenalty に設定する。
      6. それ以外で property"timeZoneName" の場合、
        1. optionsProp"short" または "shortGeneric" の場合、
          1. formatProp"shortOffset" なら、scorescore - offsetPenalty に設定する。
          2. それ以外で formatProp"longOffset" なら、scorescore - (offsetPenalty + shortMorePenalty) に設定する。
          3. それ以外で optionsProp"short" かつ formatProp"long" の場合、scorescore - shortMorePenalty に設定する。
          4. それ以外で optionsProp"shortGeneric" かつ formatProp"longGeneric" の場合、scorescore - shortMorePenalty に設定する。
          5. それ以外で optionsPropformatProp の場合、scorescore - removalPenalty に設定する。
        2. それ以外で optionsProp"shortOffset" かつ formatProp"longOffset" の場合、
          1. scorescore - shortMorePenalty に設定する。
        3. それ以外で optionsProp"long" または "longGeneric" の場合、
          1. formatProp"longOffset" なら、scorescore - offsetPenalty に設定する。
          2. それ以外で formatProp"shortOffset" なら、scorescore - (offsetPenalty + longLessPenalty) に設定する。
          3. それ以外で optionsProp"long" かつ formatProp"short" の場合、scorescore - longLessPenalty に設定する。
          4. それ以外で optionsProp"longGeneric" かつ formatProp"shortGeneric" の場合、scorescore - longLessPenalty に設定する。
          5. それ以外で optionsPropformatProp の場合、scorescore - removalPenalty に設定する。
        4. それ以外で optionsProp"longOffset" かつ formatProp"shortOffset" の場合、
          1. scorescore - longLessPenalty に設定する。
        5. それ以外で optionsPropformatProp の場合、
          1. scorescore - removalPenalty に設定する。
      7. それ以外で optionsPropformatProp の場合、
        1. property"fractionalSecondDigits" なら、
          1. values を « 1, 2, 3 » とする。
        2. それ以外なら、
          1. values を « "2-digit", "numeric", "narrow", "short", "long" » とする。
        3. optionsPropIndexvalues 内における optionsProp のインデックスとする。
        4. formatPropIndexvalues 内における formatProp のインデックスとする。
        5. deltamax(min(formatPropIndex - optionsPropIndex, 2), -2) とする。
        6. もし delta = 2 なら、scorescore - longMorePenalty に設定する。
        7. それ以外で delta = 1 なら、scorescore - shortMorePenalty に設定する。
        8. それ以外で delta = -1 なら、scorescore - shortLessPenalty に設定する。
        9. それ以外で delta = -2 なら、scorescore - longLessPenalty に設定する。
    3. もし score > bestScore なら、
      1. bestScorescore に設定する。
      2. bestFormatformat に設定する。
  11. bestFormat を返す。

11.5.3 BestFitFormatMatcher ( options, formats )

実装定義の抽象操作 BestFitFormatMatcher は引数 optionsRecord)および formatsList。各要素は DateTime Format Records)を取り、DateTime Format Record を返す。これは、選択されたロケールの一般的なユーザーが、BasicFormatMatcher が返すものと少なくとも同等と感じる構成要素表現の集合を返す。

11.5.4 DateTime Format Functions

DateTime フォーマット関数は、[[DateTimeFormat]] 内部スロットを持つ無名の組込み関数である。

DateTime フォーマット関数 F が省略可能な引数 date とともに呼び出されたとき、次の手順を行う:

  1. dtfF.[[DateTimeFormat]] とする。
  2. Assert: dtfObject であり、かつ dtf[[InitializedDateTimeFormat]] 内部スロットを持つ。
  3. date が与えられていないか undefined の場合、
    1. x を ! Call(%Date.now%, undefined) とする。
  4. それ以外の場合、
    1. x を ? ToNumber(date) とする。
  5. FormatDateTime(dtf, x) を返す。

DateTime フォーマット関数の "length" プロパティは 1𝔽 である。

11.5.5 FormatDateTimePattern ( dateTimeFormat, format, pattern, epochNanoseconds )

抽象操作 FormatDateTimePattern は、引数 dateTimeFormat(Intl.DateTimeFormat)、formatDateTime Format Record または DateTime Range Pattern Format Record)、patternPattern String)、epochNanoseconds(BigInt)を取り、Records(各レコードは [[Type]](String)および [[Value]](String)を持つ)のList を返す。これは、pattern、有効なロケール、および dateTimeFormatformat の書式オプションに従って、epoch 時刻 epochNanoseconds に対応するパーツを生成する。呼び出し時に次の手順を行う:

  1. localedateTimeFormat.[[Locale]] とする。
  2. nfOptionsOrdinaryObjectCreate(null) とする。
  3. CreateDataPropertyOrThrow(nfOptions, "numberingSystem", dateTimeFormat.[[NumberingSystem]]) を実行する。
  4. CreateDataPropertyOrThrow(nfOptions, "useGrouping", false) を実行する。
  5. nf を ! Construct(%Intl.NumberFormat%, « locale, nfOptions ») とする。
  6. nf2OptionsOrdinaryObjectCreate(null) とする。
  7. CreateDataPropertyOrThrow(nf2Options, "minimumIntegerDigits", 2𝔽) を実行する。
  8. CreateDataPropertyOrThrow(nf2Options, "numberingSystem", dateTimeFormat.[[NumberingSystem]]) を実行する。
  9. CreateDataPropertyOrThrow(nf2Options, "useGrouping", false) を実行する。
  10. nf2 を ! Construct(%Intl.NumberFormat%, « locale, nf2Options ») とする。
  11. もし format[[fractionalSecondDigits]] フィールドを持つなら、
    1. fractionalSecondDigitsformat.[[fractionalSecondDigits]] とする。
    2. nf3OptionsOrdinaryObjectCreate(null) とする。
    3. CreateDataPropertyOrThrow(nf3Options, "minimumIntegerDigits", 𝔽(fractionalSecondDigits)) を実行する。
    4. CreateDataPropertyOrThrow(nf3Options, "numberingSystem", dateTimeFormat.[[NumberingSystem]]) を実行する。
    5. CreateDataPropertyOrThrow(nf3Options, "useGrouping", false) を実行する。
    6. nf3 を ! Construct(%Intl.NumberFormat%, « locale, nf3Options ») とする。
  12. tmToLocalTime(epochNanoseconds, dateTimeFormat.[[Calendar]], dateTimeFormat.[[TimeZone]]) とする。
  13. patternPartsPartitionPattern(pattern) とする。
  14. result を新しい空の List とする。
  15. patternParts の各 Record { [[Type]], [[Value]] } patternPart について、次を行う:
    1. ppatternPart.[[Type]] とする。
    2. p"literal" なら、
      1. Record { [[Type]]: "literal", [[Value]]: patternPart.[[Value]] } を result に追加する。
    3. それ以外で p"fractionalSecondDigits" なら、
      1. Assert: format[[fractionalSecondDigits]] フィールドを持つ。
      2. vtm.[[Millisecond]] とする。
      3. vfloor(v × 10( fractionalSecondDigits - 3 )) に設定する。
      4. fvFormatNumeric(nf3, v) とする。
      5. Record { [[Type]]: "fractionalSecond", [[Value]]: fv } を result に追加する。
    4. それ以外で p"dayPeriod" なら、
      1. Assert: format[[dayPeriod]] フィールドを持つ。
      2. fformat.[[dayPeriod]] とする。
      3. fv を、tm の昼夜区分を f で与えられた形で表す String 値とする(String 値は実装および dateTimeFormat の有効なロケールに依存する)。
      4. Record { [[Type]]: p, [[Value]]: fv } を result に追加する。
    5. それ以外で p"timeZoneName" なら、
      1. Assert: format[[timeZoneName]] フィールドを持つ。
      2. fformat.[[timeZoneName]] とする。
      3. vdateTimeFormat.[[TimeZone]] とする。
      4. fv を、vf で与えられた形で表す String 値とする(String 値は実装および dateTimeFormat の有効なロケールに依存する)。f"short""long""shortOffset""longOffset" のいずれかの場合、String 値は tm[[InDST]] フィールドの値にも依存し得る。実装に f のローカライズされた表現がない場合、v 自体の String 値を使用する。
      5. Record { [[Type]]: p, [[Value]]: fv } を result に追加する。
    6. それ以外で p表 16 の Property 列のいずれかに一致する場合、
      1. Assert: format は [[<p>]] フィールドを持つ。
      2. fformat.[[<p>]] とする。
      3. v を、一致する行の Internal Slot 列の名前を持つ tm のフィールドの値とする。
      4. p"year"v ≤ 0 の場合、v を 1 - v に設定する。
      5. p"month" の場合、vv + 1 に設定する。
      6. p"hour" かつ dateTimeFormat.[[HourCycle]]"h11" または "h12" の場合、
        1. vv modulo 12 に設定する。
        2. もし v が 0 かつ dateTimeFormat.[[HourCycle]]"h12" なら、v を 12 に設定する。
      7. p"hour" かつ dateTimeFormat.[[HourCycle]]"h24" の場合、
        1. もし v が 0 なら、v を 24 に設定する。
      8. f"numeric" の場合、
        1. fvFormatNumeric(nf, v) とする。
      9. それ以外で f"2-digit" の場合、
        1. fvFormatNumeric(nf2, v) とする。
        2. codePointsStringToCodePoints(fv) とする。
        3. countcodePoints の要素数とする。
        4. もし count > 2 なら、
          1. tenscodePoints[count - 2] とする。
          2. onescodePoints[count - 1] とする。
          3. fvCodePointsToStringtens, ones ») に設定する。
      10. それ以外で f"narrow""short"、または "long" の場合、
        1. fv を、vf で与えられた形で表す String 値とする(String 値は実装および dateTimeFormat の有効なロケールと暦に依存する)。p"month" の場合、String 値は format.[[day]] の有無にも依存し得る。実装に f のローカライズされた表現がない場合、v 自体の String 値を使用する。
      11. Record { [[Type]]: p, [[Value]]: fv } を result に追加する。
    7. それ以外で p"ampm" の場合、
      1. vtm.[[Hour]] とする。
      2. もし v が 11 より大きいなら、
        1. fvILD の String 値("post meridiem" を表す)とする。
      3. それ以外なら、
        1. fvILD の String 値("ante meridiem" を表す)とする。
      4. Record { [[Type]]: "dayPeriod", [[Value]]: fv } を result に追加する。
    8. それ以外で p"relatedYear" の場合、
      1. vtm.[[RelatedYear]] とする。
      2. fvFormatNumeric(nf, v) とする。
      3. Record { [[Type]]: "relatedYear", [[Value]]: fv } を result に追加する。
    9. それ以外で p"yearName" の場合、
      1. vtm.[[YearName]] とする。
      2. fvILD の String 値(v を表す)とする。
      3. Record { [[Type]]: "yearName", [[Value]]: fv } を result に追加する。
    10. それ以外の場合、
      1. unknown を、epochNanoseconds および p に基づく実装・ロケール・数字体系依存の String とする。
      2. Record { [[Type]]: "unknown", [[Value]]: unknown } を result に追加する。
  16. result を返す。
実装では、Common Locale Data Repository(https://cldr.unicode.org/)が提供するロケールおよび暦依存の文字列を使用し、DateTimeFormat の "short" 文字列には CLDR の "abbreviated" 文字列を、DateTimeFormat の "long" 文字列には CLDR の "wide" 文字列を使用することが推奨される。

11.5.6 PartitionDateTimePattern ( dateTimeFormat, x )

抽象操作 PartitionDateTimePattern は、引数 dateTimeFormat(Intl.DateTimeFormat)および x(Number)を取り、正常完了(normal completion)で Records(各レコードは [[Type]](String)および [[Value]](String)を持つ)のListを返すか、throw completion を返す。xtime valueECMA-262, 21.4.1.1 参照)として解釈され、有効なロケールと dateTimeFormat の書式オプションに従って対応するパーツを生成する。呼び出し時に次の手順を行う:

  1. xTimeClip(x) とする。
  2. xNaN なら、RangeError 例外を投げる。
  3. epochNanoseconds((x) × 106) とする。
  4. formatdateTimeFormat.[[DateTimeFormat]] とする。
  5. dateTimeFormat.[[HourCycle]]"h11" または "h12" の場合、
    1. patternformat.[[pattern12]] とする。
  6. それ以外なら、
    1. patternformat.[[pattern]] とする。
  7. resultFormatDateTimePattern(dateTimeFormat, format, pattern, epochNanoseconds) とする。
  8. result を返す。

11.5.7 FormatDateTime ( dateTimeFormat, x )

抽象操作 FormatDateTime は、引数 dateTimeFormat(Intl.DateTimeFormat)および x(Number)を取り、正常完了(normal completion)で String を返すか、throw completion を返す。呼び出し時に次の手順を行う:

  1. parts を ? PartitionDateTimePattern(dateTimeFormat, x) とする。
  2. result を空文字列とする。
  3. Record { [[Type]], [[Value]] } partparts について、
    1. resultresultpart.[[Value]]連結に設定する。
  4. result を返す。

11.5.8 FormatDateTimeToParts ( dateTimeFormat, x )

抽象操作 FormatDateTimeToParts は、引数 dateTimeFormat(Intl.DateTimeFormat)および x(Number)を取り、正常完了(normal completion)で Array を返すか、throw completion を返す。呼び出し時に次の手順を行う:

  1. parts を ? PartitionDateTimePattern(dateTimeFormat, x) とする。
  2. result を ! ArrayCreate(0) とする。
  3. n を 0 とする。
  4. Record { [[Type]], [[Value]] } partparts について、
    1. OOrdinaryObjectCreate(%Object.prototype%) とする。
    2. CreateDataPropertyOrThrow(O, "type", part.[[Type]]) を実行する。
    3. CreateDataPropertyOrThrow(O, "value", part.[[Value]]) を実行する。
    4. CreateDataPropertyOrThrow(result, ! ToString(𝔽(n)), O) を実行する。
    5. n を 1 増やす。
  5. result を返す。

11.5.9 PartitionDateTimeRangePattern ( dateTimeFormat, x, y )

抽象操作 PartitionDateTimeRangePattern は、引数 dateTimeFormat(Intl.DateTimeFormat)、x(Number)、y(Number)を取り、正常完了(normal completion)で Records(各レコードは [[Type]](String)、[[Value]](String)、[[Source]](String)を持つ)のListを返すか、throw completion を返す。x および ytime valuesECMA-262, 21.4.1.1 参照)として解釈され、有効なロケールと dateTimeFormat の書式オプションに従って対応するパーツを生成する。呼び出し時に次の手順を行う:

  1. xTimeClip(x) に設定する。
  2. xNaN なら、RangeError 例外を投げる。
  3. yTimeClip(y) に設定する。
  4. yNaN なら、RangeError 例外を投げる。
  5. xEpochNanoseconds((x) × 106) とする。
  6. yEpochNanoseconds((y) × 106) とする。
  7. tm1ToLocalTime(xEpochNanoseconds, dateTimeFormat.[[Calendar]], dateTimeFormat.[[TimeZone]]) とする。
  8. tm2ToLocalTime(yEpochNanoseconds, dateTimeFormat.[[Calendar]], dateTimeFormat.[[TimeZone]]) とする。
  9. formatdateTimeFormat.[[DateTimeFormat]] とする。
  10. dateTimeFormat.[[HourCycle]]"h11" または "h12" の場合、
    1. patternformat.[[pattern12]] とする。
    2. rangePatternsformat.[[rangePatterns12]] とする。
  11. それ以外なら、
    1. patternformat.[[pattern]] とする。
    2. rangePatternsformat.[[rangePatterns]] とする。
  12. selectedRangePatternundefined とする。
  13. relevantFieldsEqualtrue とする。
  14. checkMoreFieldstrue とする。
  15. 表 6 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. fieldName を、その行の Field Name 列に与えられた名前とする。
    2. rangePatternsfieldName という名前のフィールドを持つなら rangePattern をそのフィールド値とし、そうでなければ rangePatternundefined とする。
    3. selectedRangePatternundefined でなく、かつ rangePatternundefined なら、
      1. 注: このフィールドまたはそれ以下の差分の範囲パターンが存在しないため、これ以上のチェックは行われない。
      2. checkMoreFieldsfalse に設定する。
    4. fieldName[[Default]] に等しくなく、relevantFieldsEqualtrue で、checkMoreFieldstrue の場合、
      1. selectedRangePatternrangePattern に設定する。
      2. fieldName[[AmPm]] の場合、
        1. tm1.[[Hour]] が 12 未満なら v1"am"、そうでなければ v1"pm" とする。
        2. tm2.[[Hour]] が 12 未満なら v2"am"、そうでなければ v2"pm" とする。
      3. それ以外で fieldName[[DayPeriod]] の場合、
        1. v1tm1 の昼夜区分を表す String 値とする(String 値は実装および dateTimeFormat の有効なロケールに依存)。
        2. v2tm2 の昼夜区分を表す String 値とする(String 値は実装および dateTimeFormat の有効なロケールに依存)。
      4. それ以外で fieldName[[FractionalSecondDigits]] の場合、
        1. もし format[[fractionalSecondDigits]] フィールドを持つなら、
          1. fractionalSecondDigitsformat.[[fractionalSecondDigits]] とする。
        2. それ以外なら、
          1. fractionalSecondDigits を 3 とする。
        3. expfractionalSecondDigits - 3 とする。
        4. v1floor(tm1.[[Millisecond]] × 10exp) とする。
        5. v2floor(tm2.[[Millisecond]] × 10exp) とする。
      5. それ以外の場合、
        1. v1tm1fieldName という名前のフィールド値とする。
        2. v2tm2fieldName という名前のフィールド値とする。
      6. もし v1v2 なら、
        1. relevantFieldsEqualfalse に設定する。
  16. relevantFieldsEqualtrue なら、
    1. collapsedResult を新しい空の List とする。
    2. resultPartsFormatDateTimePattern(dateTimeFormat, format, pattern, xEpochNanoseconds) とする。
    3. Record { [[Type]], [[Value]] } rresultParts について、
      1. Record { [[Type]]: r.[[Type]], [[Value]]: r.[[Value]], [[Source]]: "shared" } を collapsedResult に追加する。
    4. collapsedResult を返す。
  17. rangeResult を新しい空の List とする。
  18. selectedRangePatternundefined なら、
    1. selectedRangePatternrangePatterns.[[Default]] に設定する。
  19. Record { [[Pattern]], [[Source]] } rangePatternPartselectedRangePattern.[[PatternParts]] について、
    1. patternrangePatternPart.[[Pattern]] とする。
    2. sourcerangePatternPart.[[Source]] とする。
    3. source"startRange" または "shared" の場合、
      1. zxEpochNanoseconds とする。
    4. それ以外なら、
      1. zyEpochNanoseconds とする。
    5. resultPartsFormatDateTimePattern(dateTimeFormat, selectedRangePattern, pattern, z) とする。
    6. Record { [[Type]], [[Value]] } rresultParts について、
      1. Record { [[Type]]: r.[[Type]], [[Value]]: r.[[Value]], [[Source]]: source } を rangeResult に追加する。
  20. rangeResult を返す。

11.5.10 FormatDateTimeRange ( dateTimeFormat, x, y )

抽象操作 FormatDateTimeRange は、引数 dateTimeFormat(Intl.DateTimeFormat)、x(Number)、y(Number)を取り、正常完了(normal completion)で String を返すか、throw completion を返す。呼び出し時に次の手順を行う:

  1. parts を ? PartitionDateTimeRangePattern(dateTimeFormat, x, y) とする。
  2. result を空文字列とする。
  3. Record { [[Type]], [[Value]], [[Source]] } partparts について、
    1. resultresultpart.[[Value]]連結に設定する。
  4. result を返す。

11.5.11 FormatDateTimeRangeToParts ( dateTimeFormat, x, y )

抽象操作 FormatDateTimeRangeToParts は、引数 dateTimeFormat(Intl.DateTimeFormat)、x(Number)、y(Number)を取り、正常完了(normal completion)で Array を返すか、throw completion を返す。呼び出し時に次の手順を行う:

  1. parts を ? PartitionDateTimeRangePattern(dateTimeFormat, x, y) とする。
  2. result を ! ArrayCreate(0) とする。
  3. n を 0 とする。
  4. Record { [[Type]], [[Value]], [[Source]] } partparts について、
    1. OOrdinaryObjectCreate(%Object.prototype%) とする。
    2. CreateDataPropertyOrThrow(O, "type", part.[[Type]]) を実行する。
    3. CreateDataPropertyOrThrow(O, "value", part.[[Value]]) を実行する。
    4. CreateDataPropertyOrThrow(O, "source", part.[[Source]]) を実行する。
    5. CreateDataPropertyOrThrow(result, ! ToString(𝔽(n)), O) を実行する。
    6. n を 1 増やす。
  5. result を返す。

11.5.12 ToLocalTime ( epochNs, calendar, timeZoneIdentifier )

実装定義の抽象操作 ToLocalTime は、引数 epochNs(BigInt)、calendar(String)、timeZoneIdentifier(String)を取り、ToLocalTime Record を返す。呼び出し時に次の手順を行う:

  1. IsTimeZoneOffsetString(timeZoneIdentifier) が true の場合、
    1. offsetNsParseTimeZoneOffsetString(timeZoneIdentifier) とする。
  2. それ以外なら、
    1. Assert: GetAvailableNamedTimeZoneIdentifier(timeZoneIdentifier) は empty ではない。
    2. offsetNsGetNamedTimeZoneOffsetNanoseconds(timeZoneIdentifier, epochNs) とする。
  3. tz(epochNs) + offsetNs とする。
  4. calendar"gregory" の場合、
    1. tz から計算されたフィールドを持つ ToLocalTime Record表 17 に従って返す。
  5. それ以外なら、
    1. 与えられた calendar に対して tz から計算されたフィールドを持つ ToLocalTime Record を返す。計算には、指定された calendar に関する可能な限り最良の情報を使用する。

11.5.13 ToLocalTime レコード

ToLocalTime Record は、表 17 に定義されるフィールドを持つ。

表 17: RecordToLocalTime により返される)
フィールド名 値の型 グレゴリオ暦における値の計算
[[Weekday]] integer (WeekDay(𝔽(floor(tz / 106))))
[[Era]] String yearYearFromTime(𝔽(floor(tz / 106))) とする。もし year < 1𝔽 なら "BC" を、そうでなければ "AD" を返す。
[[Year]] integer (YearFromTime(𝔽(floor(tz / 106))))
[[RelatedYear]] integer または undefined undefined
[[YearName]] String または undefined undefined
[[Month]] integer (MonthFromTime(𝔽(floor(tz / 106))))
[[Day]] integer (DateFromTime(𝔽(floor(tz / 106))))
[[Hour]] integer (HourFromTime(𝔽(floor(tz / 106))))
[[Minute]] integer (MinFromTime(𝔽(floor(tz / 106))))
[[Second]] integer (SecFromTime(𝔽(floor(tz / 106))))
[[Millisecond]] integer (msFromTime(𝔽(floor(tz / 106))))
[[InDST]] Boolean calendar および timeZoneIdentifier に関する可能な限り最良の情報(IANA タイムゾーン・データベースの現在および過去の UTC からのオフセットや夏時間(DST)のルールを含む)を用いて、true または false を計算する。

11.5.14 UnwrapDateTimeFormat ( dtf )

抽象操作 UnwrapDateTimeFormat は、引数 dtfECMAScript 言語値)を取り、正常完了(normal completion)で ECMAScript 言語値 を返すか、throw completion を返す。 これは、入力オブジェクトの DateTimeFormat インスタンスを返す。インスタンスは、値自体であるか、%Intl.DateTimeFormat% により、コンストラクタの規範的オプションモード(4.3 Note 1)に従って、その値に関連付けられた値である。呼び出し時に次の手順を行う:

  1. dtfObject でないなら、TypeError 例外を投げる。
  2. dtf[[InitializedDateTimeFormat]] 内部スロットを持たず、かつ ? OrdinaryHasInstance(%Intl.DateTimeFormat%, dtf) が true なら、
    1. Get(dtf, %Intl%.[[FallbackSymbol]]) を返す。
  3. dtf を返す。

12 DisplayNames オブジェクト

12.1 Intl.DisplayNames コンストラクタ

Intl.DisplayNames のコンストラクタ

  • %Intl.DisplayNames% である。
  • Intl オブジェクト"DisplayNames" プロパティの初期値である。

Intl オブジェクト のすべてのサービスコンストラクタプロパティに共通する挙動は、9.1 に規定される。

12.1.1 Intl.DisplayNames ( locales, options )

Intl.DisplayNames 関数が引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. NewTarget が undefined なら、TypeError 例外を投げる。
  2. displayNames を ? OrdinaryCreateFromConstructor(NewTarget, "%Intl.DisplayNames.prototype%", « [[InitializedDisplayNames]], [[Locale]], [[Style]], [[Type]], [[Fallback]], [[LanguageDisplay]], [[Fields]] ») とする。
  3. optionsResolution を ? ResolveOptions(%Intl.DisplayNames%, %Intl.DisplayNames%.[[LocaleData]], locales, options, « require-options ») とする。
  4. optionsoptionsResolution.[[Options]] に設定する。
  5. roptionsResolution.[[ResolvedLocale]] に設定する。
  6. style を ? GetOption(options, "style", string, « "narrow", "short", "long" », "long") に設定する。
  7. displayNames.[[Style]]style に設定する。
  8. type を ? GetOption(options, "type", string, « "language", "region", "script", "currency", "calendar", "dateTimeField" », undefined) に設定する。
  9. typeundefined なら、TypeError 例外を投げる。
  10. displayNames.[[Type]]type に設定する。
  11. fallback を ? GetOption(options, "fallback", string, « "code", "none" », "code") に設定する。
  12. displayNames.[[Fallback]]fallback に設定する。
  13. displayNames.[[Locale]]r.[[Locale]] に設定する。
  14. resolvedLocaleDatar.[[LocaleData]] に設定する。
  15. typesresolvedLocaleData.[[types]] に設定する。
  16. Assert: typesRecord である(12.2.3 を参照)。
  17. languageDisplay を ? GetOption(options, "languageDisplay", string, « "dialect", "standard" », "dialect") に設定する。
  18. typeFieldstypes.[[<type>]] に設定する。
  19. Assert: typeFieldsRecord である(12.2.3 を参照)。
  20. type"language" の場合、
    1. displayNames.[[LanguageDisplay]]languageDisplay に設定する。
    2. typeFieldstypeFields.[[<languageDisplay>]] に設定する。
    3. Assert: typeFieldsRecord である(12.2.3 を参照)。
  21. styleFieldstypeFields.[[<style>]] に設定する。
  22. Assert: styleFieldsRecord である(12.2.3 を参照)。
  23. displayNames.[[Fields]]styleFields に設定する。
  24. displayNames を返す。

12.2 Intl.DisplayNames コンストラクタのプロパティ

Intl.DisplayNames のコンストラクタ

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ。

12.2.1 Intl.DisplayNames.prototype

Intl.DisplayNames.prototype の値は %Intl.DisplayNames.prototype% である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

12.2.2 Intl.DisplayNames.supportedLocalesOf ( locales [ , options ] )

supportedLocalesOf メソッドが引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. availableLocales%Intl.DisplayNames%.[[AvailableLocales]] とする。
  2. requestedLocales を ? CanonicalizeLocaleList(locales) とする。
  3. FilterLocales(availableLocales, requestedLocales, options) を返す。

12.2.3 内部スロット

[[AvailableLocales]] 内部スロットの値は、9.1 に記述された制約の範囲内で実装定義である。

[[RelevantExtensionKeys]] 内部スロットの値は « » である。

[[ResolutionOptionDescriptors]] 内部スロットの値は « » である。

[[LocaleData]] 内部スロットの値は、9.1 に記述された制約および以下の追加制約の範囲内で実装定義である:

  • [[LocaleData]].[[<locale>]] は、すべてのロケール値 locale について [[types]] フィールドを持たなければならない。このフィールドの値はRecord であり、すべての表示名タイプの名前を持つフィールドを含まなければならない: "language""region""script""currency""calendar"、および "dateTimeField"
  • フィールド "language" の値はRecord でなければならず、有効な言語表示のいずれかの名前を持つフィールドを含まなければならない: "dialect" および "standard"
  • 表示名タイプ "language" における言語表示フィールドは、Records を含むべきであり、有効な表示名スタイルのいずれかの名前を持つフィールドを含まなければならない: "narrow""short""long"
  • フィールド "region""script""currency""calendar"、および "dateTimeField" の値はRecords でなければならず、すべての表示名スタイルの名前を持つフィールドを含まなければならない: "narrow""short""long"
  • 表示名タイプ "language" の表示名スタイルフィールドは、Records を含むべきであり、そのキーは unicode_language_id が照合可能な言語コードに対応する必要がある(Unicode ロケール非終端記号)。これらのフィールドの値は文字列値でなければならない。
  • 表示名タイプ "region" の表示名スタイルフィールドは、地域コードに対応するキーを持つRecords を含むべきである。これらのフィールドの値は文字列値でなければならない。
  • 表示名タイプ "script" の表示名スタイルフィールドは、スクリプトコードに対応するキーを持つRecords を含むべきである。これらのフィールドの値は文字列値でなければならない。
  • 表示名タイプ "currency" の表示名スタイルフィールドは、通貨コードに対応するキーを持つRecords を含むべきである。これらのフィールドの値は文字列値でなければならない。
  • 表示名タイプ "calendar" の表示名スタイルフィールドは、type が照合可能なカレンダー識別子に対応するキーを持つRecords を含むべきである(Unicode ロケール非終端記号)。これらのフィールドの値は文字列値でなければならない。
  • 表示名タイプ "dateTimeField" の表示名スタイルフィールドは、表 19 に列挙されたコードに対応するキーを持つRecords を含むべきである。これらのフィールドの値は文字列値でなければならない。
実装においては、Common Locale Data Repository(https://cldr.unicode.org/)が提供するロケールデータを使用することが推奨される。

12.3 Intl.DisplayNames プロトタイプオブジェクトのプロパティ

Intl.DisplayNames プロトタイプオブジェクト

  • %Intl.DisplayNames.prototype% である。
  • 通常のオブジェクトである。
  • Intl.DisplayNames のインスタンスではなく、[[InitializedDisplayNames]] 内部スロットや、Intl.DisplayNames インスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

12.3.1 Intl.DisplayNames.prototype.constructor

Intl.DisplayNames.prototype.constructor の初期値は %Intl.DisplayNames% である。

12.3.2 Intl.DisplayNames.prototype.resolvedOptions ( )

この関数は、オブジェクトの初期化時に計算されたロケールおよびオプションへのアクセスを提供する。

  1. displayNamesthis の値とする。
  2. RequireInternalSlot(displayNames, [[InitializedDisplayNames]]) を実行する。
  3. optionsOrdinaryObjectCreate(%Object.prototype%) に設定する。
  4. 表 18 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. p を現在の行の Property の値とする。
    2. v を、現在の行の Internal Slot の値という名前を持つ displayNames の内部スロットの値とする。
    3. Assert: vundefined ではない。
    4. CreateDataPropertyOrThrow(options, p, v) を実行する。
  5. options を返す。
表 18: DisplayNames インスタンスの解決済みオプション
Internal Slot Property
[[Locale]] "locale"
[[Style]] "style"
[[Type]] "type"
[[Fallback]] "fallback"
[[LanguageDisplay]] "languageDisplay"

12.3.3 Intl.DisplayNames.prototype.of ( code )

Intl.DisplayNames.prototype.of が引数 code で呼び出されたとき、次の手順を行う:

  1. displayNamesthis の値とする。
  2. RequireInternalSlot(displayNames, [[InitializedDisplayNames]]) を実行する。
  3. code を ? ToString(code) に設定する。
  4. code を ? CanonicalCodeForDisplayNames(displayNames.[[Type]], code) に設定する。
  5. fieldsdisplayNames.[[Fields]] とする。
  6. fields が [[<code>]] フィールドを持つなら、 fields.[[<code>]] を返す。
  7. displayNames.[[Fallback]]"code" なら、code を返す。
  8. undefined を返す。

12.3.4 Intl.DisplayNames.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は、String 値 "Intl.DisplayNames" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

12.4 Intl.DisplayNames インスタンスのプロパティ

Intl.DisplayNames インスタンスは、通常のオブジェクトであり、%Intl.DisplayNames.prototype% からプロパティを継承する。

Intl.DisplayNames インスタンスは [[InitializedDisplayNames]] 内部スロットを持つ。

Intl.DisplayNames インスタンスはまた、Intl.DisplayNames コンストラクタによって計算されるいくつかの内部スロットも持つ:

  • [[Locale]] は、書式化においてローカライズが使用されるロケールのString 値であり、その言語タグを表す。
  • [[Style]] は、使用される表示名スタイルを識別する "narrow""short""long" のいずれかの String 値である。
  • [[Type]] は、要求された表示名の種類を識別する "language""region""script""currency""calendar"、または "dateTimeField" のいずれかの String 値である。
  • [[Fallback]] は、要求された表示名がシステムに存在しない場合のフォールバックの戻り値を識別する "code" または "none" のいずれかの String 値である。
  • [[LanguageDisplay]] は、言語表示の種類を識別する "dialect" または "standard" のいずれかの String 値である。これは [[Type]]"language" のときのみ使用される。
  • [[Fields]]Record12.2.3 参照)であり、[[Style]][[Type]]、および [[LanguageDisplay]] に従ってコードに対応するキーを持つフィールドを含まなければならない。

12.5 DisplayNames オブジェクトの抽象操作

12.5.1 CanonicalCodeForDisplayNames ( type, code )

抽象操作 CanonicalCodeForDisplayNames は、引数 type(String)および code(String)を取り、正常完了で含む String か、throw completion のいずれかを返す。これは、type に従って code が整形式のコードであることを検証し、code の大文字小文字正規化された形式を返す。呼び出し時に次の手順を行う:

  1. type"language" の場合、
    1. codeunicode_language_id によって照合できない場合(Unicode ロケール非終端記号)、RangeError 例外を投げる。
    2. IsStructurallyValidLanguageTag(code) が false なら、RangeError 例外を投げる。
    3. CanonicalizeUnicodeLocaleId(code) を返す。
  2. type"region" の場合、
    1. codeunicode_region_subtag によって照合できない場合(Unicode ロケール非終端記号)、RangeError 例外を投げる。
    2. codeASCII-uppercase を返す。
  3. type"script" の場合、
    1. codeunicode_script_subtag によって照合できない場合(Unicode ロケール非終端記号)、RangeError 例外を投げる。
    2. Assert: code の長さは 4 であり、code の各コードユニットは ASCII 文字(0x0041〜0x005A および 0x0061〜0x007A を含む)である。
    3. first を、code の 0 から 1 までのsubstringASCII-uppercase とする。
    4. rest を、code の 1 からのsubstringASCII-lowercase とする。
    5. firstreststring-concatenation を返す。
  4. type"calendar" の場合、
    1. codetype によって照合できない場合(Unicode ロケール非終端記号)、RangeError 例外を投げる。
    2. codeUnicode Technical Standard #35 Part 1 Core, Section 3.3 BCP 47 Conformance に記述された後方互換の構文をいずれか使用している場合、RangeError 例外を投げる。
    3. codeASCII-lowercase を返す。
  5. type"dateTimeField" の場合、
    1. IsValidDateTimeFieldCode(code) の結果が false なら、RangeError 例外を投げる。
    2. code を返す。
  6. Assert: type"currency" である。
  7. IsWellFormedCurrencyCode(code) が false なら、RangeError 例外を投げる。
  8. codeASCII-uppercase を返す。

12.5.2 IsValidDateTimeFieldCode ( field )

抽象操作 IsValidDateTimeFieldCode は、引数 field(String)を取り、Boolean を返す。field 引数が有効な日時フィールドコードを表していることを検証する。呼び出し時に次の手順を行う:

  1. field表 19 の Code 列に列挙されているなら、true を返す。
  2. false を返す。
表 19: DisplayNames の日時フィールドのコード
コード 説明
"era" 紀元を示すフィールド。例:グレゴリオ暦またはユリウス暦における AD/BC。
"year" (紀元内の)年を示すフィールド。
"quarter" 四半期を示すフィールド。例:Q2、第2四半期 など。
"month" 月を示すフィールド。例:Sep、September など。
"weekOfYear" 年内の週番号を示すフィールド。
"weekday" 曜日を示すフィールド。例:Tue、Tuesday など。
"day" 月内の日を示すフィールド。
"dayPeriod" 昼夜区分を示すフィールド。am/pm など、または noon、evening など。
"hour" 時を示すフィールド。
"minute" 分を示すフィールド。
"second" 秒を示すフィールド。
"timeZoneName" タイムゾーン名を示すフィールド。例:PDT、Pacific Daylight Time など。

13 DurationFormat オブジェクト

13.1 Intl.DurationFormat コンストラクタ

Intl.DurationFormat のコンストラクタ

  • %Intl.DurationFormat% である。
  • Intl オブジェクト"DurationFormat" プロパティの初期値である。

Intl オブジェクト のすべてのサービスコンストラクタプロパティに共通する挙動は、9.1 に規定される。

13.1.1 Intl.DurationFormat ( [ locales [ , options ] ] )

Intl.DurationFormat 関数が省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. NewTarget が undefined なら、TypeError 例外を投げる。
  2. durationFormat を ? OrdinaryCreateFromConstructor(NewTarget, "%Intl.DurationFormatPrototype%", « [[InitializedDurationFormat]], [[Locale]], [[NumberingSystem]], [[Style]], [[YearsOptions]], [[MonthsOptions]], [[WeeksOptions]], [[DaysOptions]], [[HoursOptions]], [[MinutesOptions]], [[SecondsOptions]], [[MillisecondsOptions]], [[MicrosecondsOptions]], [[NanosecondsOptions]], [[HourMinuteSeparator]], [[MinuteSecondSeparator]], [[FractionalDigits]] ») に設定する。
  3. optionsResolution を ? ResolveOptions(%Intl.DurationFormat%, %Intl.DurationFormat%.[[LocaleData]], locales, options) に設定する。
  4. optionsoptionsResolution.[[Options]] に設定する。
  5. roptionsResolution.[[ResolvedLocale]] に設定する。
  6. durationFormat.[[Locale]]r.[[Locale]] に設定する。
  7. resolvedLocaleDatar.[[LocaleData]] に設定する。
  8. digitalFormatresolvedLocaleData.[[DigitalFormat]] に設定する。
  9. durationFormat.[[HourMinuteSeparator]]digitalFormat.[[HourMinuteSeparator]] に設定する。
  10. durationFormat.[[MinuteSecondSeparator]]digitalFormat.[[MinuteSecondSeparator]] に設定する。
  11. durationFormat.[[NumberingSystem]]r.[[nu]] に設定する。
  12. style を ? GetOption(options, "style", string, « "long", "short", "narrow", "digital" », "short") に設定する。
  13. durationFormat.[[Style]]style に設定する。
  14. prevStyle を空文字列に設定する。
  15. 表 20 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. slot を現在の行の Internal Slot の値とする。
    2. unit を現在の行の Unit の値とする。
    3. styles を現在の行の Styles の値とする。
    4. digitalBase を現在の行の Digital Default の値とする。
    5. unitOptions を ? GetDurationUnitOptions(unit, options, style, styles, digitalBase, prevStyle, digitalFormat.[[TwoDigitHours]]) に設定する。
    6. durationFormatslot という名前の内部スロットの値を unitOptions に設定する。
    7. unit"hours""minutes""seconds""milliseconds"、または "microseconds" のいずれかなら、
      1. prevStyleunitOptions.[[Style]] に設定する。
  16. durationFormat.[[FractionalDigits]] を ? GetNumberOption(options, "fractionalDigits", 0, 9, undefined) に設定する。
  17. durationFormat を返す。
表 20: DurationFormat インスタンスの内部スロットとプロパティ名
内部スロット 単位 スタイル デジタル既定値
[[YearsOptions]] "years" « "long", "short", "narrow" » "short"
[[MonthsOptions]] "months" « "long", "short", "narrow" » "short"
[[WeeksOptions]] "weeks" « "long", "short", "narrow" » "short"
[[DaysOptions]] "days" « "long", "short", "narrow" » "short"
[[HoursOptions]] "hours" « "long", "short", "narrow", "numeric", "2-digit" » "numeric"
[[MinutesOptions]] "minutes" « "long", "short", "narrow", "numeric", "2-digit" » "numeric"
[[SecondsOptions]] "seconds" « "long", "short", "narrow", "numeric", "2-digit" » "numeric"
[[MillisecondsOptions]] "milliseconds" « "long", "short", "narrow", "numeric" » "numeric"
[[MicrosecondsOptions]] "microseconds" « "long", "short", "narrow", "numeric" » "numeric"
[[NanosecondsOptions]] "nanoseconds" « "long", "short", "narrow", "numeric" » "numeric"

13.2 Intl.DurationFormat コンストラクタのプロパティ

Intl.DurationFormat のコンストラクタ

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ。

13.2.1 Intl.DurationFormat.prototype

Intl.DurationFormat.prototype の値は %Intl.DurationFormat.prototype% である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

13.2.2 Intl.DurationFormat.supportedLocalesOf ( locales [ , options ] )

supportedLocalesOf メソッドが引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. availableLocales%Intl.DurationFormat%.[[AvailableLocales]] とする。
  2. requestedLocales を ? CanonicalizeLocaleList(locales) とする。
  3. FilterLocales(availableLocales, requestedLocales, options) を返す。

13.2.3 内部スロット

[[AvailableLocales]] 内部スロットの値は、9.1 に記述された制約の範囲内で実装定義である。

[[RelevantExtensionKeys]] 内部スロットの値は « "nu" » である。

[[ResolutionOptionDescriptors]] 内部スロットの値は « { [[Key]]: "nu", [[Property]]: "numberingSystem" } » である。

[[LocaleData]] 内部スロットの値は、9.1 に記述された制約および以下の追加制約の範囲内で、すべてのロケール値 locale に対し実装定義である:

  • [[LocaleData]].[[<locale>]] は、Record であり、[[nu]] フィールドと [[DigitalFormat]] フィールドを持たなければならない。
  • [[LocaleData]].[[<locale>]].[[nu]] は、List16.2.3 参照)でなければならず、値 "native""traditio""finance" を含んではならない。
  • [[LocaleData]].[[<locale>]].[[DigitalFormat]] は、Record であり、そのキーは locale で利用可能な各数字体系に対応する。各キーに対応する値は、以下のフィールドを含むRecord でなければならない:
    • [[HourMinuteSeparator]]:そのロケールと数字体系の組み合わせに対し、スタイル "numeric" または "2-digit" 使用時に、時間と分の間に使う適切な区切り文字列。
    • [[MinuteSecondSeparator]]:そのロケールと数字体系の組み合わせに対し、スタイル "numeric" または "2-digit" 使用時に、分と秒の間に使う適切な区切り文字列。
    • [[TwoDigitHours]]:スタイル "numeric" 使用時に、常に2桁で時間を表示するかどうかを示す真偽値。
実装においては、Common Locale Data Repository(http://cldr.unicode.org/)が提供するロケールデータを使用することが推奨される。

13.3 Intl.DurationFormat プロトタイプオブジェクトのプロパティ

Intl.DurationFormat プロトタイプオブジェクト

  • %Intl.DurationFormat.prototype% である。
  • 通常のオブジェクトである。
  • Intl.DurationFormat のインスタンスではなく、[[InitializedDurationFormat]] 内部スロットや、Intl.DurationFormat インスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

13.3.1 Intl.DurationFormat.prototype.constructor

Intl.DurationFormat.prototype.constructor の初期値は、組込みオブジェクト %Intl.DurationFormat% である。

13.3.2 Intl.DurationFormat.prototype.resolvedOptions ( )

この関数は、オブジェクトの初期化時に計算されたロケールおよびオプションへのアクセスを提供する。

  1. dfthis の値とする。
  2. RequireInternalSlot(df, [[InitializedDurationFormat]]) を実行する。
  3. optionsOrdinaryObjectCreate(%Object.prototype%) に設定する。
  4. 表 21 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. p を現在の行の Property の値とする。
    2. v を、現在の行の Internal Slot の値という名前を持つ df の内部スロットの値とする。
    3. vundefined でない場合、
      1. 現在の行に Conversion 値があれば conversion をその値とし、なければ conversionempty とする。
      2. conversionnumber の場合、
        1. v𝔽(v) に設定する。
      3. それ以外で conversionempty でない場合、
        1. Assert: conversionstyle+display であり、vDuration Unit Options Record である。
        2. 注:v.[[Style]]p という名前のプロパティ(複数形のTemporal単位)で表現され、v.[[Display]]p の末尾に "Display" を付加した名前のプロパティで表現される。
        3. stylev.[[Style]] に設定する。
        4. style"fractional" の場合、
          1. Assert: IsFractionalSecondUnitName(p) は true である。
          2. style"numeric" に設定する。
        5. CreateDataPropertyOrThrow(options, p, style) を実行する。
        6. pp"Display"連結に設定する。
        7. vv.[[Display]] に設定する。
      4. CreateDataPropertyOrThrow(options, p, v) を実行する。
  5. options を返す。
表 21: DurationFormat インスタンスの解決済みオプション
内部スロット プロパティ 変換
[[Locale]] "locale"
[[NumberingSystem]] "numberingSystem"
[[Style]] "style"
[[YearsOptions]] "years" style+display
[[MonthsOptions]] "months" style+display
[[WeeksOptions]] "weeks" style+display
[[DaysOptions]] "days" style+display
[[HoursOptions]] "hours" style+display
[[MinutesOptions]] "minutes" style+display
[[SecondsOptions]] "seconds" style+display
[[MillisecondsOptions]] "milliseconds" style+display
[[MicrosecondsOptions]] "microseconds" style+display
[[NanosecondsOptions]] "nanoseconds" style+display
[[FractionalDigits]] "fractionalDigits" number

13.3.3 Intl.DurationFormat.prototype.format ( duration )

format メソッドが引数 duration で呼び出されたとき、次の手順を行う:

  1. dfthis の値とする。
  2. RequireInternalSlot(df, [[InitializedDurationFormat]]) を実行する。
  3. record を ? ToDurationRecord(duration) に設定する。
  4. partsPartitionDurationFormatPattern(df, record) に設定する。
  5. result を空文字列に設定する。
  6. Record { [[Type]], [[Value]], [[Unit]] } 各 partparts について、
    1. resultresultpart.[[Value]]連結に設定する。
  7. result を返す。

13.3.4 Intl.DurationFormat.prototype.formatToParts ( duration )

formatToParts メソッドが引数 duration で呼び出されたとき、次の手順を行う:

  1. dfthis の値とする。
  2. RequireInternalSlot(df, [[InitializedDurationFormat]]) を実行する。
  3. record を ? ToDurationRecord(duration) に設定する。
  4. partsPartitionDurationFormatPattern(df, record) に設定する。
  5. result を ! ArrayCreate(0) に設定する。
  6. n を 0 に設定する。
  7. Record { [[Type]], [[Value]], [[Unit]] } 各 partparts について、
    1. objOrdinaryObjectCreate(%Object.prototype%) に設定する。
    2. CreateDataPropertyOrThrow(obj, "type", part.[[Type]]) を実行する。
    3. CreateDataPropertyOrThrow(obj, "value", part.[[Value]]) を実行する。
    4. part.[[Unit]]empty でない場合、! CreateDataPropertyOrThrow(obj, "unit", part.[[Unit]]) を実行する。
    5. CreateDataPropertyOrThrow(result, ! ToString(n), obj) を実行する。
    6. nn + 1 に設定する。
  8. result を返す。

13.3.5 Intl.DurationFormat.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は、String 値 "Intl.DurationFormat" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

13.4 Intl.DurationFormat インスタンスのプロパティ

Intl.DurationFormat インスタンスは、%Intl.DurationFormat.prototype% からプロパティを継承する。

Intl.DurationFormat インスタンスは [[InitializedDurationFormat]] 内部スロットを持つ。

Intl.DurationFormat インスタンスはまた、Intl.DurationFormat コンストラクタによって計算されるいくつかの内部スロットも持つ:

  • [[Locale]] は、書式化に用いられるローカライズのロケールのString 値(その言語タグ)である。
  • [[NumberingSystem]] は、書式化に用いられる Unicode Number System Identifier を表すString 値である。
  • [[Style]] は、使用される継続時間の書式スタイルを識別する "long""short""narrow"、または "digital" のいずれかの String 値である。
  • [[YearsOptions]] は、Duration Unit Options Record であり、Duration Record[[Years]] フィールドに対する書式スタイルおよび表示条件を識別する。
  • [[MonthsOptions]] は、Duration Unit Options Record であり、Duration Record[[Months]] フィールドに対する書式スタイルおよび表示条件を識別する。
  • [[WeeksOptions]] は、Duration Unit Options Record であり、Duration Record[[Weeks]] フィールドに対する書式スタイルおよび表示条件を識別する。
  • [[DaysOptions]] は、Duration Unit Options Record であり、Duration Record[[Days]] フィールドに対する書式スタイルおよび表示条件を識別する。
  • [[HoursOptions]] は、Duration Unit Options Record であり、Duration Record[[Hours]] フィールドに対する書式スタイルおよび表示条件を識別する。
  • [[MinutesOptions]] は、Duration Unit Options Record であり、Duration Record[[Minutes]] フィールドに対する書式スタイルおよび表示条件を識別する。
  • [[SecondsOptions]] は、Duration Unit Options Record であり、Duration Record[[Seconds]] フィールドに対する書式スタイルおよび表示条件を識別する。
  • [[MillisecondsOptions]] は、Duration Unit Options Record であり、Duration Record[[Milliseconds]] フィールドに対する書式スタイルおよび表示条件を識別する。
  • [[MicrosecondsOptions]] は、Duration Unit Options Record であり、Duration Record[[Microseconds]] フィールドに対する書式スタイルおよび表示条件を識別する。
  • [[NanosecondsOptions]] は、Duration Unit Options Record であり、Duration Record[[Nanoseconds]] フィールドに対する書式スタイルおよび表示条件を識別する。
  • [[HourMinuteSeparator]] は、両方のフィールドが表示され、かつ両方が数値スタイルで書式化される場合に、時間と分の間に使用する区切りを識別するString 値である。
  • [[MinuteSecondSeparator]] は、両方のフィールドが表示され、かつ両方が数値スタイルで書式化される場合に、分と秒の間に使用する区切りを識別するString 値である。
  • [[FractionalDigits]] は、数値スタイルで使用する小数桁数を識別する 非負の整数、または undefined のいずれかである。

13.5 DurationFormat オブジェクトの抽象操作

13.5.1 Duration Record

Duration Record は、Duration を表現するために用いられる Record 値である。

Duration Record は 表 22 に示すフィールドを持つ。

表 22: Duration Record のフィールド
フィールド 意味
[[Years]] 継続時間における年の数。
[[Months]] 継続時間における月の数。
[[Weeks]] 継続時間における週の数。
[[Days]] 継続時間における日の数。
[[Hours]] 継続時間における時の数。
[[Minutes]] 継続時間における分の数。
[[Seconds]] 継続時間における秒の数。
[[Milliseconds]] 継続時間におけるミリ秒の数。
[[Microseconds]] 継続時間におけるマイクロ秒の数。
[[Nanoseconds]] 継続時間におけるナノ秒の数。

13.5.2 ToIntegerIfIntegral ( argument )

抽象操作 ToIntegerIfIntegral は引数 argumentECMAScript 言語値)を取り、正常完了(normal completion)で integer を含むか、throw completion を返す。これは argument を、その Number 値を表す integer に変換するか、その値が整数でない場合は RangeError を投げる。呼び出し時に次の手順を行う:

  1. number を ? ToNumber(argument) とする。
  2. numberintegral Number でないなら、RangeError 例外を投げる。
  3. (number) を返す。

13.5.3 ToDurationRecord ( input )

抽象操作 ToDurationRecord は引数 inputECMAScript 言語値)を取り、正常完了(normal completion)で Duration Record を含むか、throw completion を返す。これは、Duration を表す与えられたオブジェクトを Duration Record に変換する。呼び出し時に次の手順を行う:

  1. inputObject でないなら、
    1. inputString であるなら、RangeError 例外を投げる。
    2. TypeError 例外を投げる。
  2. result を、各フィールドが 0 に設定された新しい Duration Record とする。
  3. days を ? Get(input, "days") とする。
  4. daysundefined でないなら、result.[[Days]] を ? ToIntegerIfIntegral(days) に設定する。
  5. hours を ? Get(input, "hours") とする。
  6. hoursundefined でないなら、result.[[Hours]] を ? ToIntegerIfIntegral(hours) に設定する。
  7. microseconds を ? Get(input, "microseconds") とする。
  8. microsecondsundefined でないなら、 result.[[Microseconds]] を ? ToIntegerIfIntegral(microseconds) に設定する。
  9. milliseconds を ? Get(input, "milliseconds") とする。
  10. millisecondsundefined でないなら、 result.[[Milliseconds]] を ? ToIntegerIfIntegral(milliseconds) に設定する。
  11. minutes を ? Get(input, "minutes") とする。
  12. minutesundefined でないなら、result.[[Minutes]] を ? ToIntegerIfIntegral(minutes) に設定する。
  13. months を ? Get(input, "months") とする。
  14. monthsundefined でないなら、result.[[Months]] を ? ToIntegerIfIntegral(months) に設定する。
  15. nanoseconds を ? Get(input, "nanoseconds") とする。
  16. nanosecondsundefined でないなら、 result.[[Nanoseconds]] を ? ToIntegerIfIntegral(nanoseconds) に設定する。
  17. seconds を ? Get(input, "seconds") とする。
  18. secondsundefined でないなら、result.[[Seconds]] を ? ToIntegerIfIntegral(seconds) に設定する。
  19. weeks を ? Get(input, "weeks") とする。
  20. weeksundefined でないなら、result.[[Weeks]] を ? ToIntegerIfIntegral(weeks) に設定する。
  21. years を ? Get(input, "years") とする。
  22. yearsundefined でないなら、result.[[Years]] を ? ToIntegerIfIntegral(years) に設定する。
  23. yearsmonthsweeksdayshoursminutessecondsmillisecondsmicroseconds、および nanoseconds がすべて undefined なら、TypeError 例外を投げる。
  24. もし IsValidDuration( result.[[Years]], result.[[Months]], result.[[Weeks]], result.[[Days]], result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]]) が false なら、
    1. RangeError 例外を投げる。
  25. result を返す。

13.5.4 DurationSign ( duration )

抽象操作 DurationSign は引数 durationDuration Record)を取り、-1、0、または 1 を返す。duration 引数のうち最も上位の非ゼロフィールドが正なら 1、負なら -1 を返す。duration のすべてのフィールドが 0 の場合は 0 を返す。呼び出し時に次の手順を行う:

  1. « duration.[[Years]]duration.[[Months]]duration.[[Weeks]]duration.[[Days]]duration.[[Hours]]duration.[[Minutes]]duration.[[Seconds]]duration.[[Milliseconds]]duration.[[Microseconds]]duration.[[Nanoseconds]] » の各値 v について、次を行う:
    1. v < 0 なら、-1 を返す。
    2. v > 0 なら、1 を返す。
  2. 0 を返す。

13.5.5 IsValidDuration ( years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds )

抽象操作 IsValidDuration は引数 yearsinteger)、monthsinteger)、weeksinteger)、daysinteger)、hoursinteger)、minutesinteger)、secondsinteger)、millisecondsinteger)、microsecondsinteger)、および nanosecondsinteger)を取り、Boolean を返す。引数が Duration Record を構築するための有効な入力を成す場合は true、それ以外は false を返す。呼び出し時に次の手順を行う:

  1. sign を 0 とする。
  2. « yearsmonthsweeksdayshoursminutessecondsmillisecondsmicrosecondsnanoseconds » の各値 v について、次を行う:
    1. 𝔽(v) が 有限でないなら、false を返す。
    2. v < 0 の場合、
      1. sign > 0 なら、false を返す。
      2. sign を -1 に設定する。
    3. それ以外で v > 0 の場合、
      1. sign < 0 なら、false を返す。
      2. sign を 1 に設定する。
  3. abs(years) ≥ 232 なら、false を返す。
  4. abs(months) ≥ 232 なら、false を返す。
  5. abs(weeks) ≥ 232 なら、false を返す。
  6. normalizedSecondsdays × 86,400 + hours × 3600 + minutes × 60 + seconds + (𝔽(milliseconds)) × 10-3 + (𝔽(microseconds)) × 10-6 + (𝔽(nanoseconds)) × 10-9 とする。
  7. 注:上記の手順は浮動小数点演算を直接用いて実装することはできない。millisecondsmicroseconds、または nanoseconds が安全でない整数の場合、10-3、10-6、10-9 をそれぞれ乗算するのは不正確になり得る。この乗算は、商のビット数が十分な std::remquo() の実装を用いて C++ で実装できる。文字列操作でも、10 の冪による乗算であるため、正確な結果が得られる。
  8. abs(normalizedSeconds) ≥ 253 なら、false を返す。
  9. true を返す。

13.5.6 GetDurationUnitOptions ( unit, options, baseStyle, stylesList, digitalBase, prevStyle, twoDigitHours )

抽象操作 GetDurationUnitOptions は引数 unit(String)、options(Object)、baseStyle(String)、stylesListList(String のリスト))、digitalBase(String)、prevStyle(String)、および twoDigitHours(Boolean)を取り、正常完了(normal completion)で Duration Unit Options Record を含むか、throw completion を返す。これは、与えられた unit に関する関連オプションを Object から抽出し、Record として返す。呼び出し時に次の手順を行う:

  1. style を ? GetOption(options, unit, string, stylesList, undefined) とする。
  2. displayDefault"always" とする。
  3. styleundefined の場合、
    1. baseStyle"digital" の場合、
      1. styledigitalBase に設定する。
      2. unit"hours""minutes""seconds" のいずれでもない場合、displayDefault"auto" に設定する。
    2. それ以外で prevStyle"fractional""numeric"、または "2-digit" のいずれかなら、
      1. style"numeric" に設定する。
      2. unit"minutes" または "seconds" でないなら、displayDefault"auto" に設定する。
    3. それ以外なら、
      1. stylebaseStyle に設定する。
      2. displayDefault"auto" に設定する。
  4. style"numeric" で、IsFractionalSecondUnitName(unit) が true の場合、
    1. style"fractional" に設定する。
    2. displayDefault"auto" に設定する。
  5. displayField を、unit"Display"連結 とする。
  6. display を ? GetOption(options, displayField, string, « "auto", "always" », displayDefault) とする。
  7. ValidateDurationUnitStyle(unit, style, display, prevStyle) を実行する。
  8. unit"hours" かつ twoDigitHourstrue なら、style"2-digit" に設定する。
  9. unit"minutes" または "seconds" で、かつ prevStyle"numeric" または "2-digit" の場合、style"2-digit" に設定する。
  10. Duration Unit Options Record { [[Style]]: style, [[Display]]: display } を返す。

13.5.6.1 Duration Unit Options Record

Duration Unit Options Record は、表 23 で定義されるフィールドを持つ。

表 23: Duration Unit Options Record
フィールド名 値の型
[[Style]] 表 20 の Styles 列にある String のいずれか
[[Display]] "auto" または "always"

13.5.6.2 ValidateDurationUnitStyle ( unit, style, display, prevStyle )

抽象操作 ValidateDurationUnitStyle は引数 unit(String)、style(String)、display(String)、prevStyle(String)を取り、正常完了(normal completion)で unused を返すか、throw completion を返す。呼び出し時に次の手順を行う:

  1. display"always" で、かつ style"fractional" なら、RangeError 例外を投げる。
  2. prevStyle"fractional" で、かつ style"fractional" でないなら、RangeError 例外を投げる。
  3. prevStyle"numeric" または "2-digit" で、かつ style"fractional""numeric""2-digit" のいずれでもないなら、RangeError 例外を投げる。
  4. unused を返す。
unit は上記のアルゴリズムでは参照されないが、例外メッセージの構築に際して実装がそれを用いることが推奨される。

13.5.7 ComputeFractionalDigits ( durationFormat, duration )

抽象操作 ComputeFractionalDigits は引数 durationFormat(DurationFormat オブジェクト)および durationDuration Record)を取り、数学的値 を返す。これは、durationFormat のうちスタイルが "fractional" であるすべての単位の値を、"fractional" を用いない durationFormat の最小単位の分数として合計する。呼び出し時に次の手順を行う:

  1. result を 0 とする。
  2. exponent を 3 とする。
  3. 表 24 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. unitOptions を、現在の行の Internal Slot の値という名前を持つ durationFormat の内部スロットの値とする。
    2. unitOptions.[[Style]]"fractional" の場合、
      1. unit を現在の行の Unit の値とする。
      2. Assert: IsFractionalSecondUnitName(unit) は true である。
      3. value を、現在の行の Value Field の値という名前を持つ duration のフィールドの値とする。
      4. resultresult + (value / 10exponent) に設定する。
      5. exponentexponent + 3 に設定する。
  4. result を返す。

13.5.8 NextUnitFractional ( durationFormat, unit )

抽象操作 NextUnitFractional は引数 durationFormat(DurationFormat オブジェクト)および unit(String)を取り、Boolean を返す。次に小さい単位が "fractional" スタイルを用いる場合、true を返す。呼び出し時に次の手順を行う:

  1. unit"seconds" で、かつ durationFormat.[[MillisecondsOptions]].[[Style]]"fractional" なら、true を返す。
  2. unit"milliseconds" で、かつ durationFormat.[[MicrosecondsOptions]].[[Style]]"fractional" なら、 true を返す。
  3. unit"microseconds" で、かつ durationFormat.[[NanosecondsOptions]].[[Style]]"fractional" なら、 true を返す。
  4. false を返す。

13.5.9 FormatNumericHours ( durationFormat, hoursValue, signDisplayed )

抽象操作 FormatNumericHours は引数 durationFormat(DurationFormat オブジェクト)、hoursValueinteger)、および signDisplayed(Boolean)を取り、RecordsList を返す。hoursValue は時の数を示す integer である。有効なロケールおよび durationFormat の書式オプションに従って、hoursValue のパーツを生成する。呼び出し時に次の手順を行う:

  1. result を新しい空の List とする。
  2. hoursStyledurationFormat.[[HoursOptions]].[[Style]] とする。
  3. Assert: hoursStyle"numeric" または "2-digit" である。
  4. nfOptsOrdinaryObjectCreate(null) とする。
  5. numberingSystemdurationFormat.[[NumberingSystem]] とする。
  6. CreateDataPropertyOrThrow(nfOpts, "numberingSystem", numberingSystem) を実行する。
  7. hoursStyle"2-digit" の場合、
    1. CreateDataPropertyOrThrow(nfOpts, "minimumIntegerDigits", 2𝔽) を実行する。
  8. signDisplayedfalse の場合、
    1. CreateDataPropertyOrThrow(nfOpts, "signDisplay", "never") を実行する。
  9. CreateDataPropertyOrThrow(nfOpts, "useGrouping", false) を実行する。
  10. nf を ! Construct(%Intl.NumberFormat%, « durationFormat.[[Locale]], nfOpts ») とする。
  11. hoursPartsPartitionNumberPattern(nf, hoursValue) とする。
  12. hoursParts の各 Record { [[Type]], [[Value]] } part について、
    1. result に、Record { [[Type]]: part.[[Type]], [[Value]]: part.[[Value]], [[Unit]]: "hour" } を追加する。
  13. result を返す。

13.5.10 FormatNumericMinutes ( durationFormat, minutesValue, hoursDisplayed, signDisplayed )

抽象操作 FormatNumericMinutes は引数 durationFormat(DurationFormat オブジェクト)、minutesValueinteger)、hoursDisplayed(Boolean)、および signDisplayed(Boolean)を取り、RecordsList を返す。minutesValue は分の数を示す integer である。有効なロケールおよび durationFormat の書式オプションに従って、minutesValue のパーツを生成する。呼び出し時に次の手順を行う:

  1. result を新しい空の List とする。
  2. hoursDisplayedtrue の場合、
    1. separatordurationFormat.[[HourMinuteSeparator]] とする。
    2. result に、Record { [[Type]]: "literal", [[Value]]: separator, [[Unit]]: empty } を追加する。
  3. minutesStyledurationFormat.[[MinutesOptions]].[[Style]] とする。
  4. Assert: minutesStyle"numeric" または "2-digit" である。
  5. nfOptsOrdinaryObjectCreate(null) とする。
  6. numberingSystemdurationFormat.[[NumberingSystem]] とする。
  7. CreateDataPropertyOrThrow(nfOpts, "numberingSystem", numberingSystem) を実行する。
  8. minutesStyle"2-digit" の場合、
    1. CreateDataPropertyOrThrow(nfOpts, "minimumIntegerDigits", 2𝔽) を実行する。
  9. signDisplayedfalse の場合、
    1. CreateDataPropertyOrThrow(nfOpts, "signDisplay", "never") を実行する。
  10. CreateDataPropertyOrThrow(nfOpts, "useGrouping", false) を実行する。
  11. nf を ! Construct(%Intl.NumberFormat%, « durationFormat.[[Locale]], nfOpts ») とする。
  12. minutesPartsPartitionNumberPattern(nf, minutesValue) とする。
  13. minutesParts の各 Record { [[Type]], [[Value]] } part について、
    1. result に、Record { [[Type]]: part.[[Type]], [[Value]]: part.[[Value]], [[Unit]]: "minute" } を追加する。
  14. result を返す。

13.5.11 FormatNumericSeconds ( durationFormat, secondsValue, minutesDisplayed, signDisplayed )

抽象操作 FormatNumericSeconds は引数 durationFormat(DurationFormat オブジェクト)、secondsValue数学的値)、minutesDisplayed(Boolean)、および signDisplayed(Boolean)を取り、RecordsList を返す。secondsValue は秒の数を示す 数学的値 である。有効なロケールおよび durationFormat の書式オプションに従って、secondsValue のパーツを生成する。呼び出し時に次の手順を行う:

  1. result を新しい空の List とする。
  2. minutesDisplayedtrue の場合、
    1. separatordurationFormat.[[MinuteSecondSeparator]] とする。
    2. result に、Record { [[Type]]: "literal", [[Value]]: separator, [[Unit]]: empty } を追加する。
  3. secondsStyledurationFormat.[[SecondsOptions]].[[Style]] とする。
  4. Assert: secondsStyle"numeric" または "2-digit" である。
  5. nfOptsOrdinaryObjectCreate(null) とする。
  6. numberingSystemdurationFormat.[[NumberingSystem]] とする。
  7. CreateDataPropertyOrThrow(nfOpts, "numberingSystem", numberingSystem) を実行する。
  8. secondsStyle"2-digit" の場合、
    1. CreateDataPropertyOrThrow(nfOpts, "minimumIntegerDigits", 2𝔽) を実行する。
  9. signDisplayedfalse の場合、
    1. CreateDataPropertyOrThrow(nfOpts, "signDisplay", "never") を実行する。
  10. CreateDataPropertyOrThrow(nfOpts, "useGrouping", false) を実行する。
  11. fractionDigitsdurationFormat.[[FractionalDigits]] とする。
  12. fractionDigitsundefined の場合、
    1. CreateDataPropertyOrThrow(nfOpts, "maximumFractionDigits", 9𝔽) を実行する。
    2. CreateDataPropertyOrThrow(nfOpts, "minimumFractionDigits", +0𝔽) を実行する。
  13. それ以外なら、
    1. CreateDataPropertyOrThrow(nfOpts, "maximumFractionDigits", fractionDigits) を実行する。
    2. CreateDataPropertyOrThrow(nfOpts, "minimumFractionDigits", fractionDigits) を実行する。
  14. CreateDataPropertyOrThrow(nfOpts, "roundingMode", "trunc") を実行する。
  15. nf を ! Construct(%Intl.NumberFormat%, « durationFormat.[[Locale]], nfOpts ») とする。
  16. secondsPartsPartitionNumberPattern(nf, secondsValue) とする。
  17. secondsParts の各 Record { [[Type]], [[Value]] } part について、
    1. result に、Record { [[Type]]: part.[[Type]], [[Value]]: part.[[Value]], [[Unit]]: "second" } を追加する。
  18. result を返す。

13.5.12 FormatNumericUnits ( durationFormat, duration, firstNumericUnit, signDisplayed )

抽象操作 FormatNumericUnits は引数 durationFormat(DurationFormat オブジェクト)、durationDuration Record)、firstNumericUnit(String)、および signDisplayed(Boolean)を取り、RecordsList を返す。有効なロケールおよび durationFormat の書式オプションに従って、duration のうち "numeric" または "2-digit" スタイルを用いる要素を表すパーツを生成する。呼び出し時に次の手順を行う:

  1. Assert: firstNumericUnit"hours""minutes"、または "seconds" である。
  2. numericPartsList を新しい空の List とする。
  3. hoursValueduration.[[Hours]] とする。
  4. hoursDisplaydurationFormat.[[HoursOptions]].[[Display]] とする。
  5. minutesValueduration.[[Minutes]] とする。
  6. minutesDisplaydurationFormat.[[MinutesOptions]].[[Display]] とする。
  7. secondsValueduration.[[Seconds]] とする。
  8. duration.[[Milliseconds]] が 0 でない、または duration.[[Microseconds]] が 0 でない、または duration.[[Nanoseconds]] が 0 でない場合、
    1. secondsValuesecondsValue + ComputeFractionalDigits(durationFormat, duration) に設定する。
  9. secondsDisplaydurationFormat.[[SecondsOptions]].[[Display]] とする。
  10. hoursFormattedfalse とする。
  11. firstNumericUnit"hours" の場合、
    1. hoursValue が 0 でない、または hoursDisplay"always" なら、
      1. hoursFormattedtrue に設定する。
  12. secondsValue が 0 でない、または secondsDisplay"always" なら、
    1. secondsFormattedtrue に設定する。
  13. それ以外なら、
    1. secondsFormattedfalse に設定する。
  14. minutesFormattedfalse とする。
  15. firstNumericUnit"hours" または "minutes" の場合、
    1. hoursFormattedtrue かつ secondsFormattedtrue なら、
      1. minutesFormattedtrue に設定する。
    2. それ以外で minutesValue が 0 でない、または minutesDisplay"always" なら、
      1. minutesFormattedtrue に設定する。
  16. hoursFormattedtrue の場合、
    1. signDisplayedtrue の場合、
      1. hoursValue が 0 で、かつ DurationSign(duration) が -1 なら、
        1. hoursValuenegative-zero に設定する。
    2. hoursPartsFormatNumericHours(durationFormat, hoursValue, signDisplayed) とする。
    3. numericPartsListnumericPartsListhoursPartsリスト連結 に設定する。
    4. signDisplayedfalse に設定する。
  17. minutesFormattedtrue の場合、
    1. signDisplayedtrue の場合、
      1. minutesValue が 0 で、かつ DurationSign(duration) が -1 なら、
        1. minutesValuenegative-zero に設定する。
    2. minutesPartsFormatNumericMinutes(durationFormat, minutesValue, hoursFormatted, signDisplayed) とする。
    3. numericPartsListnumericPartsListminutesPartsリスト連結 に設定する。
    4. signDisplayedfalse に設定する。
  18. secondsFormattedtrue の場合、
    1. secondsPartsFormatNumericSeconds(durationFormat, secondsValue, minutesFormatted, signDisplayed) とする。
    2. numericPartsListnumericPartsListsecondsPartsリスト連結 に設定する。
  19. numericPartsList を返す。

13.5.13 IsFractionalSecondUnitName ( unit )

抽象操作 IsFractionalSecondUnitName は引数 unit(String)を取り、Boolean を返す。呼び出し時に次の手順を行う:

  1. unit"milliseconds""microseconds"、または "nanoseconds" のいずれかなら、true を返す。
  2. false を返す。

13.5.14 ListFormatParts ( durationFormat, partitionedPartsList )

抽象操作 ListFormatParts は引数 durationFormat(DurationFormat オブジェクト)および partitionedPartsListListsRecords のリスト)のList)を取り、List を返す。有効なロケールおよび durationFormat の書式オプションに従って、partitionedPartsList 内の Lists に含まれるパーツに対応する List を生成する。呼び出し時に次の手順を行う:

  1. lfOptsOrdinaryObjectCreate(null) とする。
  2. CreateDataPropertyOrThrow(lfOpts, "type", "unit") を実行する。
  3. listStyledurationFormat.[[Style]] とする。
  4. listStyle"digital" の場合、
    1. listStyle"short" に設定する。
  5. CreateDataPropertyOrThrow(lfOpts, "style", listStyle) を実行する。
  6. lf を ! Construct(%Intl.ListFormat%, « durationFormat.[[Locale]], lfOpts ») とする。
  7. strings を新しい空の List とする。
  8. partitionedPartsList の各要素 parts について、
    1. string を空文字列とする。
    2. parts 内の各 Record { [[Type]], [[Value]], [[Unit]] } part について、
      1. stringstringpart.[[Value]]連結に設定する。
    3. stringsstring を追加する。
  9. formattedPartsListCreatePartsFromList(lf, strings) とする。
  10. partitionedPartsIndex を 0 とする。
  11. partitionedLengthpartitionedPartsList の要素数とする。
  12. flattenedPartsList を新しい空の List とする。
  13. formattedPartsList の各 Record { [[Type]], [[Value]] } listPart について、
    1. listPart.[[Type]]"element" の場合、
      1. Assert: partitionedPartsIndex < partitionedLength である。
      2. partspartitionedPartsList[partitionedPartsIndex] とする。
      3. parts 内の各 Record { [[Type]], [[Value]], [[Unit]] } part について、
        1. flattenedPartsListpart を追加する。
      4. partitionedPartsIndexpartitionedPartsIndex + 1 に設定する。
    2. それ以外なら、
      1. Assert: listPart.[[Type]]"literal" である。
      2. flattenedPartsList に、Record { [[Type]]: "literal", [[Value]]: listPart.[[Value]], [[Unit]]: empty } を追加する。
  14. flattenedPartsList を返す。

13.5.15 PartitionDurationFormatPattern ( durationFormat, duration )

抽象操作 PartitionDurationFormatPattern は引数 durationFormat(DurationFormat)および durationDuration Record)を取り、List を返す。有効なロケールおよび durationFormat の書式オプションに従って、duration に対応するパーツを生成する。呼び出し時に次の手順を行う:

  1. result を新しい空の List とする。
  2. signDisplayedtrue とする。
  3. numericUnitFoundfalse とする。
  4. numericUnitFoundfalse の間、表 24 のヘッダー行を除く各行について、表の順序で繰り返す:
    1. value を、現在の行の Value Field の値という名前を持つ duration のフィールドの値とする。
    2. unitOptions を、現在の行の Internal Slot の値という名前を持つ durationFormat の内部スロットの値とする。
    3. styleunitOptions.[[Style]] とする。
    4. displayunitOptions.[[Display]] とする。
    5. unit を現在の行の Unit の値とする。
    6. numberFormatUnit を現在の行の NumberFormat Unit の値とする。
    7. style"numeric" または "2-digit" の場合、
      1. numericPartsListFormatNumericUnits(durationFormat, duration, unit, signDisplayed) とする。
      2. numericPartsList が空でないなら、resultnumericPartsList を追加する。
      3. numericUnitFoundtrue に設定する。
    8. それ以外なら、
      1. nfOptsOrdinaryObjectCreate(null) とする。
      2. NextUnitFractional(durationFormat, unit) が true の場合、
        1. valuevalue + ComputeFractionalDigits(durationFormat, duration) に設定する。
        2. fractionDigitsdurationFormat.[[FractionalDigits]] とする。
        3. fractionDigitsundefined の場合、
          1. CreateDataPropertyOrThrow(nfOpts, "maximumFractionDigits", 9𝔽) を実行する。
          2. CreateDataPropertyOrThrow(nfOpts, "minimumFractionDigits", +0𝔽) を実行する。
        4. それ以外なら、
          1. CreateDataPropertyOrThrow(nfOpts, "maximumFractionDigits", fractionDigits) を実行する。
          2. CreateDataPropertyOrThrow(nfOpts, "minimumFractionDigits", fractionDigits) を実行する。
        5. CreateDataPropertyOrThrow(nfOpts, "roundingMode", "trunc") を実行する。
        6. numericUnitFoundtrue に設定する。
      3. display"always" である、または value が 0 でない場合、
        1. CreateDataPropertyOrThrow(nfOpts, "numberingSystem", durationFormat.[[NumberingSystem]]) を実行する。
        2. signDisplayedtrue の場合、
          1. signDisplayedfalse に設定する。
          2. value が 0 で、かつ DurationSign(duration) が -1 なら、valuenegative-zero に設定する。
        3. それ以外なら、
          1. CreateDataPropertyOrThrow(nfOpts, "signDisplay", "never") を実行する。
        4. CreateDataPropertyOrThrow(nfOpts, "style", "unit") を実行する。
        5. CreateDataPropertyOrThrow(nfOpts, "unit", numberFormatUnit) を実行する。
        6. CreateDataPropertyOrThrow(nfOpts, "unitDisplay", style) を実行する。
        7. nf を ! Construct(%Intl.NumberFormat%, « durationFormat.[[Locale]], nfOpts ») とする。
        8. partsPartitionNumberPattern(nf, value) とする。
        9. list を新しい空の List とする。
        10. parts の各 Record { [[Type]], [[Value]] } part について、
          1. list に、Record { [[Type]]: part.[[Type]], [[Value]]: part.[[Value]], [[Unit]]: numberFormatUnit } を追加する。
        11. resultlist を追加する。
  5. ListFormatParts(durationFormat, result) を返す。
表 24: PartitionDurationFormatPattern に関連する DurationFormat インスタンスの内部スロットとプロパティ
値フィールド 内部スロット 単位 NumberFormat の単位
[[Years]] [[YearsOptions]] "years" "year"
[[Months]] [[MonthsOptions]] "months" "month"
[[Weeks]] [[WeeksOptions]] "weeks" "week"
[[Days]] [[DaysOptions]] "days" "day"
[[Hours]] [[HoursOptions]] "hours" "hour"
[[Minutes]] [[MinutesOptions]] "minutes" "minute"
[[Seconds]] [[SecondsOptions]] "seconds" "second"
[[Milliseconds]] [[MillisecondsOptions]] "milliseconds" "millisecond"
[[Microseconds]] [[MicrosecondsOptions]] "microseconds" "microsecond"
[[Nanoseconds]] [[NanosecondsOptions]] "nanoseconds" "nanosecond"

14 ListFormat オブジェクト

14.1 Intl.ListFormat コンストラクタ

Intl.ListFormat のコンストラクタ

Intl オブジェクトのすべてのサービスコンストラクタプロパティに共通の挙動は、9.1に規定される。

14.1.1 Intl.ListFormat ( [ locales [ , options ] ] )

Intl.ListFormat 関数が省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. NewTarget が undefined なら、TypeError 例外を投げる。
  2. listFormat を ? OrdinaryCreateFromConstructor(NewTarget, "%Intl.ListFormat.prototype%", « [[InitializedListFormat]], [[Locale]], [[Type]], [[Style]], [[Templates]] ») とする。
  3. optionsResolution を ? ResolveOptions(%Intl.ListFormat%, %Intl.ListFormat%.[[LocaleData]], locales, options) とする。
  4. optionsoptionsResolution.[[Options]] に設定する。
  5. roptionsResolution.[[ResolvedLocale]] に設定する。
  6. listFormat.[[Locale]]r.[[Locale]] に設定する。
  7. type を ? GetOption(options, "type", string, « "conjunction", "disjunction", "unit" », "conjunction") に設定する。
  8. listFormat.[[Type]]type に設定する。
  9. style を ? GetOption(options, "style", string, « "long", "short", "narrow" », "long") に設定する。
  10. listFormat.[[Style]]style に設定する。
  11. resolvedLocaleDatar.[[LocaleData]] に設定する。
  12. dataLocaleTypesresolvedLocaleData.[[<type>]] とする。
  13. listFormat.[[Templates]]dataLocaleTypes.[[<style>]] に設定する。
  14. listFormat を返す。

14.2 Intl.ListFormat コンストラクタのプロパティ

Intl.ListFormat のコンストラクタ

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

14.2.1 Intl.ListFormat.prototype

Intl.ListFormat.prototype の値は %Intl.ListFormat.prototype% である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

14.2.2 Intl.ListFormat.supportedLocalesOf ( locales [ , options ] )

supportedLocalesOf メソッドが引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. availableLocales%Intl.ListFormat%.[[AvailableLocales]] とする。
  2. requestedLocales を ? CanonicalizeLocaleList(locales) とする。
  3. FilterLocales(availableLocales, requestedLocales, options) を返す。

14.2.3 内部スロット

[[AvailableLocales]] 内部スロットの値は、9.1に記述された制約の範囲内で実装定義である。

[[RelevantExtensionKeys]] 内部スロットの値は « » である。

[[ResolutionOptionDescriptors]] 内部スロットの値は « » である。

注 1
Intl.ListFormat には関連する拡張キーは存在しない。

[[LocaleData]] 内部スロットの値は、9.1に記述された制約および、%Intl.ListFormat%.[[AvailableLocales]] の各ロケール値 locale に対する以下の追加制約の範囲内で実装定義である:

  • [[LocaleData]].[[<locale>]] は、3 つのフィールド [[conjunction]][[disjunction]][[unit]] を持つRecord である。これらはそれぞれ、書式スタイルの 3 つの名前 [[long]][[short]][[narrow]] をフィールドとして持つRecord でなければならない。
  • それぞれのフィールドはListFormat テンプレートセットと見なされ、ListRecords のリスト)であり、[[Pair]][[Start]][[Middle]][[End]] という名前のフィールドを持たなければならない。各フィールドは LDML の List Format Rules で規定されるテンプレート文字列でなければならない。各テンプレート文字列は "{0}""{1}" という部分文字列をそれぞれ 1 回だけ含まなければならない。substring "{0}" は、substring "{1}" より前に現れるべきである。
注 2
実装では、Common Locale Data Repository(https://cldr.unicode.org/)が提供するロケールデータを用いることが推奨される。LDML の listPattern において、conjunction は "standard"、disjunction は "or"、unit は "unit" に対応する。
注 3
リストタイプのうち、conjunction は「and」に基づくリスト(例: "A, B, and C")、disjunction は「or」に基づくリスト(例: "A, B, or C")、unit は単位を伴う値のリスト(例: "5 pounds, 12 ounces")を表す。

14.3 Intl.ListFormat プロトタイプオブジェクトのプロパティ

Intl.ListFormat プロトタイプオブジェクト

  • %Intl.ListFormat.prototype% である。
  • 通常のオブジェクトである。
  • Intl.ListFormat のインスタンスではなく、[[InitializedListFormat]] 内部スロットや、Intl.ListFormat インスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

14.3.1 Intl.ListFormat.prototype.constructor

Intl.ListFormat.prototype.constructor の初期値は %Intl.ListFormat% である。

14.3.2 Intl.ListFormat.prototype.resolvedOptions ( )

この関数は、オブジェクトの初期化時に計算されたロケールおよびオプションへのアクセスを提供する。

  1. lfthis の値とする。
  2. RequireInternalSlot(lf, [[InitializedListFormat]]) を実行する。
  3. optionsOrdinaryObjectCreate(%Object.prototype%) に設定する。
  4. 表 25 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. p を現在の行の Property の値とする。
    2. v を、現在の行の Internal Slot の値という名前を持つ lf の内部スロットの値とする。
    3. Assert: vundefined ではない。
    4. CreateDataPropertyOrThrow(options, p, v) を実行する。
  5. options を返す。
表 25: ListFormat インスタンスの解決済みオプション
内部スロット プロパティ
[[Locale]] "locale"
[[Type]] "type"
[[Style]] "style"

14.3.3 Intl.ListFormat.prototype.format ( list )

format メソッドが引数 list で呼び出されたとき、次の手順を行う:

  1. lfthis の値とする。
  2. RequireInternalSlot(lf, [[InitializedListFormat]]) を実行する。
  3. stringList を ? StringListFromIterable(list) に設定する。
  4. FormatList(lf, stringList) を返す。

14.3.4 Intl.ListFormat.prototype.formatToParts ( list )

formatToParts メソッドが引数 list で呼び出されたとき、次の手順を行う:

  1. lfthis の値とする。
  2. RequireInternalSlot(lf, [[InitializedListFormat]]) を実行する。
  3. stringList を ? StringListFromIterable(list) に設定する。
  4. FormatListToParts(lf, stringList) を返す。

14.3.5 Intl.ListFormat.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は、String 値 "Intl.ListFormat" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

14.4 Intl.ListFormat インスタンスのプロパティ

Intl.ListFormat インスタンスは、%Intl.ListFormat.prototype% からプロパティを継承する。

Intl.ListFormat インスタンスは [[InitializedListFormat]] 内部スロットを持つ。

Intl.ListFormat インスタンスはまた、Intl.ListFormat コンストラクタによって計算されるいくつかの内部スロットも持つ:

  • [[Locale]] は、リスト書式スタイルに用いられるローカライズのロケールのString 値(その言語タグ)である。
  • [[Type]] は、使用されるタイプのリストを識別する String 値 "conjunction""disjunction"、または "unit" のいずれかである。
  • [[Style]] は、使用されるリスト書式スタイルを識別する String 値 "long""short"、または "narrow" のいずれかである。
  • [[Templates]]ListFormat テンプレートセット である。

14.5 ListFormat オブジェクトの抽象操作

14.5.1 DeconstructPattern ( pattern, placeables )

抽象操作 DeconstructPattern は引数 patternPattern String)および placeablesRecord)を取り、List を返す。

これは、パターン文字列をパーツのList に分解する。

placeables は、そのキーがパターン文字列内で使用されるプレースホルダトークン、値が結果のListでトークン部分を表現するために用いるパーツのRecordsPartitionPatternによるもの)である。 例:

入力:
  DeconstructPattern("AA{xx}BB{yy}CC", {
    [[xx]]: {[[Type]]: "hour", [[Value]]: "15"},
    [[yy]]: {[[Type]]: "minute", [[Value]]: "06"}
  })

出力(パーツ Record の List):
  «
    {[[Type]]: "literal", [[Value]]: "AA"},
    {[[Type]]: "hour", [[Value]]: "15"},
    {[[Type]]: "literal", [[Value]]: "BB"},
    {[[Type]]: "minute", [[Value]]: "06"},
    {[[Type]]: "literal", [[Value]]: "CC"}
  »
          

呼び出し時に次の手順を行う:

  1. patternPartsPartitionPattern(pattern) とする。
  2. result を新しい空のList とする。
  3. patternParts の各 Record { [[Type]], [[Value]] } patternPart について、
    1. partpatternPart.[[Type]] とする。
    2. part"literal" なら、
      1. resultRecord { [[Type]]: "literal", [[Value]]: patternPart.[[Value]] } を追加する。
    3. それ以外なら、
      1. Assert: placeables はフィールド [[<part>]] を持つ。
      2. substplaceables.[[<part>]] とする。
      3. substList なら、
        1. subst の各要素 s について、
          1. results を追加する。
      4. それ以外なら、
        1. resultsubst を追加する。
  4. result を返す。

14.5.2 CreatePartsFromList ( listFormat, list )

抽象操作 CreatePartsFromList は引数 listFormat(Intl.ListFormat)および list(文字列のList)を取り、RecordsList(フィールド [[Type]]"element" または "literal")および [[Value]](String)を持つ)を返す。有効なロケールおよび listFormat の書式オプションに従って対応するパーツのListを生成する。呼び出し時に次の手順を行う:

  1. sizelist の要素数とする。
  2. size が 0 なら、
    1. 新しい空のListを返す。
  3. size が 2 なら、
    1. n を、listFormat.[[Locale]]list[0]、list[1] に基づいて listFormat.[[Templates]] を指すインデックスとする。
    2. patternlistFormat.[[Templates]][n].[[Pair]] とする。
    3. firstRecord { [[Type]]: "element", [[Value]]: list[0] } とする。
    4. secondRecord { [[Type]]: "element", [[Value]]: list[1] } とする。
    5. placeablesRecord { [[0]]: first, [[1]]: second } とする。
    6. DeconstructPattern(pattern, placeables) を返す。
  4. lastRecord { [[Type]]: "element", [[Value]]: list[size - 1] } とする。
  5. parts を « last » とする。
  6. isize - 2 とする。
  7. i ≥ 0 の間、繰り返す:
    1. headRecord { [[Type]]: "element", [[Value]]: list[i] } とする。
    2. nlistFormat.[[Locale]]head、および parts に基づく実装定義listFormat.[[Templates]] のインデックスとする。
    3. i が 0 なら、
      1. patternlistFormat.[[Templates]][n].[[Start]] とする。
    4. それ以外で isize - 2 より小さいなら、
      1. patternlistFormat.[[Templates]][n].[[Middle]] とする。
    5. それ以外なら、
      1. patternlistFormat.[[Templates]][n].[[End]] とする。
    6. placeablesRecord { [[0]]: head, [[1]]: parts } とする。
    7. partsDeconstructPattern(pattern, placeables) に設定する。
    8. i を 1 減らす。
  8. parts を返す。
複数のテンプレートから選択するためのインデックス n により、例えばスペイン語のように、後続の語に応じて "y" と "e" を使い分けるなど、接続詞を文脈依存にできる。

14.5.3 FormatList ( listFormat, list )

抽象操作 FormatList は引数 listFormat(Intl.ListFormat)および list(文字列のList)を取り、String を返す。呼び出し時に次の手順を行う:

  1. partsCreatePartsFromList(listFormat, list) とする。
  2. result を空文字列とする。
  3. parts の各 Record { [[Type]], [[Value]] } part について、
    1. resultresultpart.[[Value]]連結に設定する。
  4. result を返す。

14.5.4 FormatListToParts ( listFormat, list )

抽象操作 FormatListToParts は引数 listFormat(Intl.ListFormat)および list(文字列のList)を取り、Array を返す。呼び出し時に次の手順を行う:

  1. partsCreatePartsFromList(listFormat, list) とする。
  2. result を ! ArrayCreate(0) とする。
  3. n を 0 とする。
  4. parts の各 Record { [[Type]], [[Value]] } part について、
    1. OOrdinaryObjectCreate(%Object.prototype%) とする。
    2. CreateDataPropertyOrThrow(O, "type", part.[[Type]]) を実行する。
    3. CreateDataPropertyOrThrow(O, "value", part.[[Value]]) を実行する。
    4. CreateDataPropertyOrThrow(result, ! ToString(𝔽(n)), O) を実行する。
    5. n を 1 増やす。
  5. result を返す。

14.5.5 StringListFromIterable ( iterable )

抽象操作 StringListFromIterable は引数 iterableECMAScript 言語値)を取り、文字列のListnormal completionで含むか、throw completionを返す。呼び出し時に次の手順を行う:

  1. iterableundefined なら、
    1. 新しい空のListを返す。
  2. iteratorRecord を ? GetIterator(iterable, sync) とする。
  3. list を新しい空のList とする。
  4. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone なら、
      1. list を返す。
    3. nextString でない なら、
      1. errorThrowCompletion(新たに作成された TypeError オブジェクト) とする。
      2. IteratorClose(iteratorRecord, error) を返す。
    4. listnext を追加する。

このアルゴリズムは、String でない値に遭遇した場合に例外を送出する。任意の値に対する明らかなロケール対応の強制変換が存在しないためである。

15 Locale オブジェクト

15.1 Intl.Locale コンストラクタ

Intl.Locale のコンストラクタ

15.1.1 Intl.Locale ( tag [ , options ] )

Intl.Locale 関数が引数 tag と省略可能な引数 options で呼び出されたとき、次の手順を行う:

  1. NewTarget が undefined なら、TypeError 例外を投げる。
  2. localeExtensionKeys%Intl.Locale%.[[LocaleExtensionKeys]] とする。
  3. internalSlotsList を « [[InitializedLocale]], [[Locale]], [[Calendar]], [[Collation]], [[HourCycle]], [[NumberingSystem]] » とする。
  4. localeExtensionKeys"kf" を含むなら、
    1. [[CaseFirst]]internalSlotsList に追加する。
  5. localeExtensionKeys"kn" を含むなら、
    1. [[Numeric]]internalSlotsList に追加する。
  6. locale を ? OrdinaryCreateFromConstructor(NewTarget, "%Intl.Locale.prototype%", internalSlotsList) とする。
  7. tagString でなく、かつ tagObject でもないなら、TypeError 例外を投げる。
  8. tagObject で、tag[[InitializedLocale]] 内部スロットを持つなら、
    1. tagtag.[[Locale]] に設定する。
  9. それ以外なら、
    1. tag を ? ToString(tag) に設定する。
  10. options を ? CoerceOptionsToObject(options) に設定する。
  11. IsStructurallyValidLanguageTag(tag) が false なら、RangeError 例外を投げる。
  12. tagCanonicalizeUnicodeLocaleId(tag) に設定する。
  13. tag を ? UpdateLanguageId(tag, options) に設定する。
  14. opt を新しいRecord とする。
  15. calendar を ? GetOption(options, "calendar", string, empty, undefined) とする。
  16. calendarundefined でないなら、
    1. calendartype Unicode locale nonterminal にマッチしないなら、RangeError 例外を投げる。
  17. opt.[[ca]]calendar に設定する。
  18. collation を ? GetOption(options, "collation", string, empty, undefined) とする。
  19. collationundefined でないなら、
    1. collationtype Unicode locale nonterminal にマッチしないなら、RangeError 例外を投げる。
  20. opt.[[co]]collation に設定する。
  21. hc を ? GetOption(options, "hourCycle", string, « "h11", "h12", "h23", "h24" », undefined) とする。
  22. opt.[[hc]]hc に設定する。
  23. kf を ? GetOption(options, "caseFirst", string, « "upper", "lower", "false" », undefined) とする。
  24. opt.[[kf]]kf に設定する。
  25. kn を ? GetOption(options, "numeric", boolean, empty, undefined) とする。
  26. knundefined でないなら、kn を ! ToString(kn) に設定する。
  27. opt.[[kn]]kn に設定する。
  28. numberingSystem を ? GetOption(options, "numberingSystem", string, empty, undefined) とする。
  29. numberingSystemundefined でないなら、
    1. numberingSystemtype Unicode locale nonterminal にマッチしないなら、RangeError 例外を投げる。
  30. opt.[[nu]]numberingSystem に設定する。
  31. rMakeLocaleRecord(tag, opt, localeExtensionKeys) とする。
  32. locale.[[Locale]]r.[[locale]] に設定する。
  33. locale.[[Calendar]]r.[[ca]] に設定する。
  34. locale.[[Collation]]r.[[co]] に設定する。
  35. locale.[[HourCycle]]r.[[hc]] に設定する。
  36. localeExtensionKeys"kf" を含むなら、
    1. locale.[[CaseFirst]]r.[[kf]] に設定する。
  37. localeExtensionKeys"kn" を含むなら、
    1. SameValue(r.[[kn]], "true") が true である、または r.[[kn]] が空文字列なら、
      1. locale.[[Numeric]]true に設定する。
    2. それ以外なら、
      1. locale.[[Numeric]]false に設定する。
  38. locale.[[NumberingSystem]]r.[[nu]] に設定する。
  39. locale を返す。

15.1.2 UpdateLanguageId ( tag, options )

抽象操作 UpdateLanguageId は引数 tagUnicode 正規化済みロケール識別子)および options(Object)を取り、言語タグnormal completionで含むか、throw completionを返す。これは tagunicode_language_idサブタグoptions の対応するプロパティから更新し、構造的に妥当(ただし非正規化)な結果を返す。呼び出し時に次の手順を行う:

  1. baseNameGetLocaleBaseName(tag) とする。
  2. language を ? GetOption(options, "language", string, empty, GetLocaleLanguage(baseName)) とする。
  3. languageunicode_language_subtag Unicode locale nonterminal にマッチしないなら、RangeError 例外を投げる。
  4. script を ? GetOption(options, "script", string, empty, GetLocaleScript(baseName)) とする。
  5. scriptundefined でないなら、
    1. scriptunicode_script_subtag Unicode locale nonterminal にマッチしないなら、RangeError 例外を投げる。
  6. region を ? GetOption(options, "region", string, empty, GetLocaleRegion(baseName)) とする。
  7. regionundefined でないなら、
    1. regionunicode_region_subtag Unicode locale nonterminal にマッチしないなら、RangeError 例外を投げる。
  8. variants を ? GetOption(options, "variants", string, empty, GetLocaleVariants(baseName)) とする。
  9. variantsundefined でないなら、
    1. variants が空文字列なら、RangeError 例外を投げる。
    2. lowerVariantsvariantsASCII 小文字とする。
    3. variantSubtagsStringSplitToList(lowerVariants, "-") とする。
    4. variantSubtags の各要素 variant について、
      1. variantunicode_variant_subtag Unicode locale nonterminal にマッチしないなら、RangeError 例外を投げる。
    5. variantSubtags に重複要素が含まれるなら、RangeError 例外を投げる。
  10. allExtensionstag のうち baseName に続くサフィックスとする。
  11. newTaglanguage とする。
  12. scriptundefined でないなら、newTagnewTag"-"script連結に設定する。
  13. regionundefined でないなら、newTagnewTag"-"region の連結に設定する。
  14. variantsundefined でないなら、newTagnewTag"-"variants の連結に設定する。
  15. newTagnewTagallExtensions の連結に設定する。
  16. newTag を返す。

15.1.3 MakeLocaleRecord ( tag, options, localeExtensionKeys )

抽象操作 MakeLocaleRecord は引数 tag言語タグ)、optionsRecord)、localeExtensionKeys(String のList)を取り、Record を返す。これは、tagUnicode ロケール拡張シーケンスに含まれるデータを、options の対応するフィールドで上書きして取り込み、さらにそれらのフィールドを tag に組み込んで得られるUnicode 正規化済みロケール識別子を含む [[locale]] フィールドを追加した Record を構築して返す。呼び出し時に次の手順を行う:

  1. tag に、Unicode ロケール拡張シーケンスであるsubstringが含まれるなら、
    1. extension を、tag 内の該当substringUnicode ロケール拡張シーケンス)から成る String 値とする。
    2. componentsUnicodeExtensionComponents(extension) とする。
    3. attributescomponents.[[Attributes]] とする。
    4. keywordscomponents.[[Keywords]] とする。
  2. それ以外なら、
    1. attributes を新しい空のList とする。
    2. keywords を新しい空のList とする。
  3. result を新しいRecord とする。
  4. localeExtensionKeys の各要素 key について、
    1. keywords[[Key]]key である要素が含まれるなら、
      1. entry を、その [[Key]]key である keywords の要素とする。
      2. valueentry.[[Value]] とする。
    2. それ以外なら、
      1. entryempty とする。
      2. valueundefined とする。
    3. Assert: options は [[<key>]] フィールドを持つ。
    4. overrideValueoptions.[[<key>]] とする。
    5. overrideValueundefined でないなら、
      1. valueCanonicalizeUValue(key, overrideValue) に設定する。
      2. entryempty でないなら、
        1. entry.[[Value]]value に設定する。
      3. それ以外なら、
        1. keywordsRecord { [[Key]]: key, [[Value]]: value } を追加する。
    6. result.[[<key>]] を value に設定する。
  5. locale を、tag からUnicode ロケール拡張シーケンスをすべて取り除いた String 値とする。
  6. attributes が空でない、または keywords が空でないなら、
    1. result.[[locale]]InsertUnicodeExtensionAndCanonicalize(locale, attributes, keywords) に設定する。
  7. それ以外なら、
    1. result.[[locale]]CanonicalizeUnicodeLocaleId(locale) に設定する。
  8. result を返す。

15.2 Intl.Locale コンストラクタのプロパティ

Intl.Locale のコンストラクタ

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

15.2.1 Intl.Locale.prototype

Intl.Locale.prototype の値は %Intl.Locale.prototype% である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

15.2.2 内部スロット

[[LocaleExtensionKeys]] 内部スロットの値は、« "ca""co""hc""nu" » のすべての要素を含み、さらに %Intl.Collator%.[[RelevantExtensionKeys]] の要素でもある « "kf""kn" » の任意の要素を追加で含み、それ以外の要素を含まないListである。

15.3 Intl.Locale プロトタイプオブジェクトのプロパティ

Intl.Locale プロトタイプオブジェクト

  • %Intl.Locale.prototype% である。
  • 通常のオブジェクトである。
  • Intl.Locale のインスタンスではなく、[[InitializedLocale]] 内部スロットや、Intl.Locale インスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

15.3.1 Intl.Locale.prototype.constructor

Intl.Locale.prototype.constructor の初期値は %Intl.Locale% である。

15.3.2 get Intl.Locale.prototype.baseName

Intl.Locale.prototype.baseName は、その setter アクセサ関数が undefined であるアクセサプロパティである。getter アクセサ関数は次の手順を行う:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. GetLocaleBaseName(loc.[[Locale]]) を返す。

15.3.3 get Intl.Locale.prototype.calendar

Intl.Locale.prototype.calendar は、その setter アクセサ関数が undefined であるアクセサプロパティである。getter アクセサ関数は次の手順を行う:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. loc.[[Calendar]] を返す。

15.3.4 get Intl.Locale.prototype.caseFirst

このプロパティは、%Intl.Locale%.[[LocaleExtensionKeys]]"kf" を含む場合にのみ存在する。

Intl.Locale.prototype.caseFirst は、その setter アクセサ関数が undefined であるアクセサプロパティである。getter アクセサ関数は次の手順を行う:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. loc.[[CaseFirst]] を返す。

15.3.5 get Intl.Locale.prototype.collation

Intl.Locale.prototype.collation は、その setter アクセサ関数が undefined であるアクセサプロパティである。getter アクセサ関数は次の手順を行う:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. loc.[[Collation]] を返す。

15.3.6 get Intl.Locale.prototype.hourCycle

Intl.Locale.prototype.hourCycle は、その setter アクセサ関数が undefined であるアクセサプロパティである。getter アクセサ関数は次の手順を行う:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. loc.[[HourCycle]] を返す。

15.3.7 get Intl.Locale.prototype.language

Intl.Locale.prototype.language は、その setter アクセサ関数が undefined であるアクセサプロパティである。getter アクセサ関数は次の手順を行う:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. GetLocaleLanguage(loc.[[Locale]]) を返す。

15.3.8 Intl.Locale.prototype.maximize ( )

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. maximal を、Add Likely Subtags アルゴリズムを loc.[[Locale]] に適用した結果とする。エラーが通知された場合、maximalloc.[[Locale]] に設定する。
  4. Construct(%Intl.Locale%, maximal) を返す。

15.3.9 Intl.Locale.prototype.minimize ( )

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. minimal を、Remove Likely Subtags アルゴリズムを loc.[[Locale]] に適用した結果とする。エラーが通知された場合、minimalloc.[[Locale]] に設定する。
  4. Construct(%Intl.Locale%, minimal) を返す。

15.3.10 get Intl.Locale.prototype.numberingSystem

Intl.Locale.prototype.numberingSystemアクセサプロパティ であり、その setter アクセサ関数は undefined である。getter アクセサ関数は次の手順を実行する:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. loc.[[NumberingSystem]] を返す。

15.3.11 get Intl.Locale.prototype.numeric

このプロパティは %Intl.Locale%.[[LocaleExtensionKeys]]"kn" を含む場合にのみ存在する。

Intl.Locale.prototype.numericアクセサプロパティ であり、その setter アクセサ関数は undefined である。getter アクセサ関数は次の手順を実行する:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. loc.[[Numeric]] を返す。

15.3.12 get Intl.Locale.prototype.region

Intl.Locale.prototype.regionアクセサプロパティ であり、その setter アクセサ関数は undefined である。getter アクセサ関数は次の手順を実行する:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. GetLocaleRegion(loc.[[Locale]]) を返す。

15.3.13 get Intl.Locale.prototype.script

Intl.Locale.prototype.scriptアクセサプロパティ であり、その setter アクセサ関数は undefined である。getter アクセサ関数は次の手順を実行する:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. GetLocaleScript(loc.[[Locale]]) を返す。

15.3.14 Intl.Locale.prototype.toString ( )

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. loc.[[Locale]] を返す。

15.3.15 get Intl.Locale.prototype.variants

Intl.Locale.prototype.variantsアクセサプロパティ であり、その setter アクセサ関数は undefined である。getter アクセサ関数は次の手順を実行する:

  1. locthis の値とする。
  2. RequireInternalSlot(loc, [[InitializedLocale]]) を実行する。
  3. GetLocaleVariants(loc.[[Locale]]) を返す。

15.3.16 Intl.Locale.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "Intl.Locale" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

15.4 Intl.Locale インスタンスのプロパティ

Intl.Locale インスタンスは 通常のオブジェクト であり、%Intl.Locale.prototype% からプロパティを継承する。

Intl.Locale インスタンスは [[InitializedLocale]] 内部スロットを持つ。

Intl.Locale インスタンスはまた、Intl.Locale コンストラクタ によって計算されるいくつかの内部スロットも持つ:

  • [[Locale]]String 値であり、そのロケールの 言語タグ に従って書式が行われる。
  • [[Calendar]]undefined または、正規形の Unicode Calendar Identifier である String 値。
  • [[Collation]]undefined または、正規形の Unicode Collation Identifier である String 値。
  • [[HourCycle]]undefined または、正規形の Unicode Hour Cycle Identifier である String 値。
  • [[NumberingSystem]]undefined または、正規形の Unicode Number System Identifier である String 値。
  • [[CaseFirst]]undefined または "upper""lower""false" のいずれかの String 値。この内部スロットは %Intl.Locale%[[LocaleExtensionKeys]] 内部スロットが "kf" を含む場合のみ存在する。
  • [[Numeric]]undefined または、ロケールで数値ソートが使用されるかどうかを指定する Boolean 値。この内部スロットは %Intl.Locale%[[LocaleExtensionKeys]] 内部スロットが "kn" を含む場合のみ存在する。

15.5 Locale オブジェクトの抽象操作

15.5.1 GetLocaleBaseName ( locale )

抽象操作 GetLocaleBaseName は引数 locale(String)を受け取り、String を返す。呼び出し時に次の手順を行う:

  1. Assert: localeunicode_locale_id Unicode locale nonterminal にマッチできる。
  2. locale のうち unicode_language_id Unicode locale nonterminal にマッチする最長のプレフィックスを返す。

15.5.2 GetLocaleLanguage ( locale )

抽象操作 GetLocaleLanguage は引数 locale(String)を受け取り、String を返す。呼び出し時に次の手順を行う:

  1. baseNameGetLocaleBaseName(locale) に設定する。
  2. Assert: baseName の最初の subtagunicode_language_subtag Unicode locale nonterminal にマッチできる。
  3. baseName の最初の subtag を返す。

15.5.3 GetLocaleScript ( locale )

抽象操作 GetLocaleScript は引数 locale(String)を受け取り、String または undefined を返す。呼び出し時に次の手順を行う:

  1. baseNameGetLocaleBaseName(locale) に設定する。
  2. Assert: baseName には unicode_script_subtag Unicode locale nonterminal にマッチする subtag が高々1つだけ含まれている。
  3. baseNameunicode_script_subtag Unicode locale nonterminal にマッチする subtag が含まれていれば、その subtag を返す。
  4. undefined を返す。

15.5.4 GetLocaleRegion ( locale )

抽象操作 GetLocaleRegion は、引数 locale(String)を受け取り、String または undefined を返す。呼び出し時に次の手順を行う:

  1. baseNameGetLocaleBaseName(locale) に設定する。
  2. 注:unicode_region_subtag subtag は、最初の unicode_language_subtag subtag の直後、オプションで単一の unicode_script_subtag subtag の後にのみ有効である。この位置では unicode_region_subtag は他の有効な subtag と混同されることはなく、すべての生成規則が排他的である。
  3. AssertbaseName の最初の subtagunicode_language_subtag Unicode locale nonterminal にマッチできる。
  4. baseNameTailbaseName の最初の subtag の後のサフィックスとする。
  5. AssertbaseNameTail には unicode_region_subtag Unicode locale nonterminal にマッチする subtag が高々1つだけ含まれている。
  6. baseNameTailunicode_region_subtag Unicode locale nonterminal にマッチする subtag が含まれていれば、その subtag を返す。
  7. undefined を返す。

15.5.5 GetLocaleVariants ( locale )

抽象操作 GetLocaleVariants は、引数 locale(String)を受け取り、String または undefined を返す。呼び出し時に次の手順を行う:

  1. baseNameGetLocaleBaseName(locale) に設定する。
  2. 注:baseName 内で "-" の直後に現れる各 subtag は、unicode_script_subtagunicode_region_subtag、または unicode_variant_subtag のいずれかであるが、unicode_variant_subtag にマッチする substring は、他の生成規則にもマッチし得る任意のプレフィックスよりも必ず長い。
  3. variants を、baseName のうち "-" で始まり、その直後に unicode_variant_subtag Unicode locale nonterminal にマッチする substring が現れる最長のサフィックスとする。そのようなサフィックスがなければ undefined を返す。
  4. variants の 1 文字目以降のsubstringを返す。

16 NumberFormat オブジェクト

16.1 Intl.NumberFormat コンストラクタ

Intl.NumberFormat の コンストラクタ

  • %Intl.NumberFormat% である。
  • "NumberFormat" プロパティは Intl オブジェクト の初期値である。

Intl オブジェクト のすべての サービスコンストラクタ プロパティに共通する動作は、9.1 に規定される。

16.1.1 Intl.NumberFormat ( [ locales [ , options ] ] )

Intl.NumberFormat 関数が省略可能な引数 locales および options で呼び出された場合、次の手順を行う:

  1. NewTarget が undefined の場合、newTargetアクティブな関数オブジェクト とし、それ以外の場合は NewTarget を newTarget とする。
  2. numberFormat を ? OrdinaryCreateFromConstructor(newTarget, "%Intl.NumberFormat.prototype%", « [[InitializedNumberFormat]], [[Locale]], [[LocaleData]], [[NumberingSystem]], [[Style]], [[Unit]], [[UnitDisplay]], [[Currency]], [[CurrencyDisplay]], [[CurrencySign]], [[MinimumIntegerDigits]], [[MinimumFractionDigits]], [[MaximumFractionDigits]], [[MinimumSignificantDigits]], [[MaximumSignificantDigits]], [[RoundingType]], [[Notation]], [[CompactDisplay]], [[UseGrouping]], [[SignDisplay]], [[RoundingIncrement]], [[RoundingMode]], [[ComputedRoundingPriority]], [[TrailingZeroDisplay]], [[BoundFormat]] ») とする。
  3. optionsResolution を ? ResolveOptions(%Intl.NumberFormat%, %Intl.NumberFormat%.[[LocaleData]], locales, options, « coerce-options ») とする。
  4. optionsoptionsResolution.[[Options]] に設定する。
  5. roptionsResolution.[[ResolvedLocale]] に設定する。
  6. numberFormat.[[Locale]]r.[[Locale]] に設定する。
  7. numberFormat.[[LocaleData]]r.[[LocaleData]] に設定する。
  8. numberFormat.[[NumberingSystem]]r.[[nu]] に設定する。
  9. SetNumberFormatUnitOptions(numberFormat, options) を実行する。
  10. stylenumberFormat.[[Style]] に設定する。
  11. notation を ? GetOption(options, "notation", string, « "standard", "scientific", "engineering", "compact" », "standard") に設定する。
  12. numberFormat.[[Notation]]notation に設定する。
  13. もし style"currency" かつ notation"standard" なら、
    1. currencynumberFormat.[[Currency]] に設定する。
    2. cDigitsCurrencyDigits(currency) に設定する。
    3. mnfdDefaultcDigits に設定する。
    4. mxfdDefaultcDigits に設定する。
  14. それ以外の場合、
    1. mnfdDefault を 0 に設定する。
    2. もし style"percent" なら、
      1. mxfdDefault を 0 に設定する。
    3. それ以外の場合、
      1. mxfdDefault を 3 に設定する。
  15. SetNumberFormatDigitOptions(numberFormat, options, mnfdDefault, mxfdDefault, notation) を実行する。
  16. compactDisplay を ? GetOption(options, "compactDisplay", string, « "short", "long" », "short") に設定する。
  17. defaultUseGrouping"auto" に設定する。
  18. もし notation"compact" なら、
    1. numberFormat.[[CompactDisplay]]compactDisplay に設定する。
    2. defaultUseGrouping"min2" に設定する。
  19. 注:歴史的理由により、"true""false" という文字列も受け入れられ、デフォルト値に置き換えられる。
  20. useGrouping を ? GetBooleanOrStringNumberFormatOption(options, "useGrouping", « "min2", "auto", "always", "true", "false" », defaultUseGrouping) に設定する。
  21. useGrouping"true" または "false" なら、useGroupingdefaultUseGrouping に設定する。
  22. useGroupingtrue なら、useGrouping"always" に設定する。
  23. numberFormat.[[UseGrouping]]useGrouping に設定する。
  24. signDisplay を ? GetOption(options, "signDisplay", string, « "auto", "never", "always", "exceptZero", "negative" », "auto") に設定する。
  25. numberFormat.[[SignDisplay]]signDisplay に設定する。
  26. 実装が 4.3 注 1 の規範的オプション コンストラクタモードをサポートする場合、
    1. thisthis の値とする。
    2. ChainNumberFormat(numberFormat, NewTarget, this) を返す。
  27. numberFormat を返す。

16.1.1.1 ChainNumberFormat ( numberFormat, newTarget, this )

抽象操作 ChainNumberFormat は引数 numberFormat(Intl.NumberFormat)、newTargetECMAScript 言語値)、thisECMAScript 言語値)を受け取り、Object を含む 正常完了 または throw completion を返す。呼び出し時に次の手順を行う:

  1. newTargetundefined かつ ? OrdinaryHasInstance(%Intl.NumberFormat%, this) が true なら、
    1. DefinePropertyOrThrow(this, %Intl%.[[FallbackSymbol]], PropertyDescriptor{ [[Value]]: numberFormat, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
    2. this を返す。
  2. numberFormat を返す。

16.1.2 SetNumberFormatDigitOptions ( intlObj, options, mnfdDefault, mxfdDefault, notation )

抽象操作 SetNumberFormatDigitOptions は引数 intlObj(Object)、options(Object)、mnfdDefaultinteger)、mxfdDefaultinteger)、notation (String)を受け取り、unused を含む 正常完了 または throw completion を返す。これは intlObj のロケール非依存の数値丸めに関わる内部スロットを設定する(16.5.3 を参照)。呼び出し時に次の手順を行う:

  1. mnid を ? GetNumberOption(options, "minimumIntegerDigits,", 1, 21, 1) に設定する。
  2. mnfd を ? Get(options, "minimumFractionDigits") に設定する。
  3. mxfd を ? Get(options, "maximumFractionDigits") に設定する。
  4. mnsd を ? Get(options, "minimumSignificantDigits") に設定する。
  5. mxsd を ? Get(options, "maximumSignificantDigits") に設定する。
  6. intlObj.[[MinimumIntegerDigits]]mnid に設定する。
  7. roundingIncrement を ? GetNumberOption(options, "roundingIncrement", 1, 5000, 1) に設定する。
  8. roundingIncrement が « 1, 2, 5, 10, 20, 25, 50, 100, 200, 250, 500, 1000, 2000, 2500, 5000 » に含まれない場合、RangeError 例外を投げる。
  9. roundingMode を ? GetOption(options, "roundingMode", string, « "ceil", "floor", "expand", "trunc", "halfCeil", "halfFloor", "halfExpand", "halfTrunc", "halfEven" », "halfExpand") に設定する。
  10. roundingPriority を ? GetOption(options, "roundingPriority", string, « "auto", "morePrecision", "lessPrecision" », "auto") に設定する。
  11. trailingZeroDisplay を ? GetOption(options, "trailingZeroDisplay", string, « "auto", "stripIfInteger" », "auto") に設定する。
  12. 注:SetNumberFormatDigitOptions で必要となるすべてのフィールドは options から取得済み。残りの手順は options の解釈および例外送出。
  13. roundingIncrement が 1 でない場合、mxfdDefaultmnfdDefault に設定する。
  14. intlObj.[[RoundingIncrement]]roundingIncrement に設定する。
  15. intlObj.[[RoundingMode]]roundingMode に設定する。
  16. intlObj.[[TrailingZeroDisplay]]trailingZeroDisplay に設定する。
  17. mnsdundefined かつ mxsdundefined なら hasSdfalse、そうでなければ hasSdtrue に設定する。
  18. mnfdundefined かつ mxfdundefined なら hasFdfalse、そうでなければ hasFdtrue に設定する。
  19. needSdtrue に設定する。
  20. needFdtrue に設定する。
  21. roundingPriority"auto" の場合、
    1. needSdhasSd に設定する。
    2. needSdtrue または hasFdfalse かつ notation"compact" の場合、
      1. needFdfalse に設定する。
  22. needSdtrue の場合、
    1. hasSdtrue の場合、
      1. intlObj.[[MinimumSignificantDigits]] を ? DefaultNumberOption(mnsd, 1, 21, 1) に設定する。
      2. intlObj.[[MaximumSignificantDigits]] を ? DefaultNumberOption(mxsd, intlObj.[[MinimumSignificantDigits]], 21, 21) に設定する。
    2. それ以外の場合、
      1. intlObj.[[MinimumSignificantDigits]] を 1 に設定する。
      2. intlObj.[[MaximumSignificantDigits]] を 21 に設定する。
  23. needFdtrue の場合、
    1. hasFdtrue の場合、
      1. mnfd を ? DefaultNumberOption(mnfd, 0, 100, undefined) に設定する。
      2. mxfd を ? DefaultNumberOption(mxfd, 0, 100, undefined) に設定する。
      3. mnfdundefined の場合、mnfdmin(mnfdDefault, mxfd) に設定する。
      4. それ以外で mxfdundefined の場合、mxfdmax(mxfdDefault, mnfd) に設定する。
      5. それ以外で mnfdmxfd より大きい場合、RangeError 例外を投げる。
      6. intlObj.[[MinimumFractionDigits]]mnfd に設定する。
      7. intlObj.[[MaximumFractionDigits]]mxfd に設定する。
    2. それ以外の場合、
      1. intlObj.[[MinimumFractionDigits]]mnfdDefault に設定する。
      2. intlObj.[[MaximumFractionDigits]]mxfdDefault に設定する。
  24. needSdfalse かつ needFdfalse の場合、
    1. intlObj.[[MinimumFractionDigits]] を 0 に設定する。
    2. intlObj.[[MaximumFractionDigits]] を 0 に設定する。
    3. intlObj.[[MinimumSignificantDigits]] を 1 に設定する。
    4. intlObj.[[MaximumSignificantDigits]] を 2 に設定する。
    5. intlObj.[[RoundingType]]more-precision に設定する。
    6. intlObj.[[ComputedRoundingPriority]]"morePrecision" に設定する。
  25. それ以外で roundingPriority"morePrecision" の場合、
    1. intlObj.[[RoundingType]]more-precision に設定する。
    2. intlObj.[[ComputedRoundingPriority]]"morePrecision" に設定する。
  26. それ以外で roundingPriority"lessPrecision" の場合、
    1. intlObj.[[RoundingType]]less-precision に設定する。
    2. intlObj.[[ComputedRoundingPriority]]"lessPrecision" に設定する。
  27. それ以外で hasSdtrue の場合、
    1. intlObj.[[RoundingType]]significant-digits に設定する。
    2. intlObj.[[ComputedRoundingPriority]]"auto" に設定する。
  28. それ以外の場合、
    1. intlObj.[[RoundingType]]fraction-digits に設定する。
    2. intlObj.[[ComputedRoundingPriority]]"auto" に設定する。
  29. roundingIncrement が 1 でない場合、
    1. intlObj.[[RoundingType]]fraction-digits でない場合、TypeError 例外を投げる。
    2. intlObj.[[MaximumFractionDigits]]intlObj.[[MinimumFractionDigits]] と異なる場合、RangeError 例外を投げる。
  30. unused を返す。

16.1.3 SetNumberFormatUnitOptions ( intlObj, options )

抽象操作 SetNumberFormatUnitOptions は、引数 intlObj(Intl.NumberFormat)および options(Object)を受け取り、正常完了値を含む unused または throw completion を返す。ユーザー指定の単位に関するオプションを intlObj に解決する。呼び出し時に以下の手順を実行する:

  1. style を ? GetOption(options, "style", string, « "decimal", "percent", "currency", "unit" », "decimal") に設定する。
  2. intlObj.[[Style]]style を設定する。
  3. currency を ? GetOption(options, "currency", string, empty, undefined) に設定する。
  4. currencyundefined であれば、
    1. style"currency" なら TypeError 例外を投げる。
  5. それ以外の場合、
    1. IsWellFormedCurrencyCode(currency) が false なら RangeError 例外を投げる。
  6. currencyDisplay を ? GetOption(options, "currencyDisplay", string, « "code", "symbol", "narrowSymbol", "name" », "symbol") に設定する。
  7. currencySign を ? GetOption(options, "currencySign", string, « "standard", "accounting" », "standard") に設定する。
  8. unit を ? GetOption(options, "unit", string, empty, undefined) に設定する。
  9. unitundefined であれば、
    1. style"unit" なら TypeError 例外を投げる。
  10. それ以外の場合、
    1. IsWellFormedUnitIdentifier(unit) が false なら RangeError 例外を投げる。
  11. unitDisplay を ? GetOption(options, "unitDisplay", string, « "short", "narrow", "long" », "short") に設定する。
  12. style"currency" であれば、
    1. intlObj.[[Currency]]ASCII 大文字currency を設定する。
    2. intlObj.[[CurrencyDisplay]]currencyDisplay を設定する。
    3. intlObj.[[CurrencySign]]currencySign を設定する。
  13. style"unit" であれば、
    1. intlObj.[[Unit]]unit を設定する。
    2. intlObj.[[UnitDisplay]]unitDisplay を設定する。
  14. unused を返す。

16.2 Intl.NumberFormat コンストラクタのプロパティ

Intl.NumberFormat の コンストラクタ

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

16.2.1 Intl.NumberFormat.prototype

Intl.NumberFormat.prototype の値は %Intl.NumberFormat.prototype% である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

16.2.2 Intl.NumberFormat.supportedLocalesOf ( locales [ , options ] )

supportedLocalesOf メソッドが引数 locales および options で呼び出された場合、次の手順を行う:

  1. availableLocales%Intl.NumberFormat%.[[AvailableLocales]] とする。
  2. requestedLocales を ? CanonicalizeLocaleList(locales) とする。
  3. FilterLocales(availableLocales, requestedLocales, options) を返す。

16.2.3 内部スロット

[[AvailableLocales]] 内部スロットの値は、9.1で記述された制約の範囲内で実装依存である。

[[RelevantExtensionKeys]] 内部スロットの値は « "nu" » である。

[[ResolutionOptionDescriptors]] 内部スロットの値は « { [[Key]]: "nu", [[Property]]: "numberingSystem" } » である。

注1
Unicode Technical Standard #35 Part 1 Core, Section 3.6.1 Key and Type Definitions では、数値書式に関連する 3 つのロケール拡張キー "cu"(通貨), "cf"(通貨書式スタイル), "nu"(数字体系)が説明されている。しかし Intl.NumberFormat では、通貨フォーマットの通貨は options オブジェクトの currency プロパティで指定し、通貨フォーマットのスタイルは options オブジェクトの currencySign プロパティで指定する必要がある。

[[LocaleData]] 内部スロットの値は、9.1 で記述された制約および下記の追加制約の範囲内で実装依存である:

  • [[LocaleData]] の任意のロケールフィールドの "nu" フィールド値の List には "native""traditio""finance" を含めてはならない。
  • [[LocaleData]].[[<locale>]] は、すべてのロケール値 locale に対して [[patterns]] フィールドを持つ必要があり、その値は Record であり、4つの数値書式スタイル "decimal""percent""currency""unit" の名前のフィールドを持たなければならない。
  • 上記 "currency" および "unit" フィールドは Records であり、最低でも "fallback" フィールドを持たなければならない。 "currency" はさらに 6.3 に従う通貨コードに対応する追加フィールドを持つことができる。 "currency" の各フィールドは Record であり、currencyDisplay の値 "code""symbol""narrowSymbol""name" に対応するフィールドを持つ。 それぞれのフィールドは Record であり、currencySign の値 "standard" または "accounting" に対応するフィールドを持つ。 "unit" フィールド([[LocaleData]].[[<locale>]]) は、必須の "fallback" フィールド以外にも 6.6 に対応するコア測定単位識別子の追加フィールドを持つことができる。 "unit" の各フィールドは Record であり、unitDisplay の値 "narrow""short""long" に対応するフィールドを持つ。
  • これまで説明した patterns ツリーのリーフフィールド("decimal""percent""currency" の曾孫、"unit" の孫)は、キー "positivePattern""zeroPattern""negativePattern" を持つ Records でなければならない。
  • 上記のフィールド(符号依存パターンフィールド)の値は文字列であり、必ず substring "{number}" を含まなければならない。 "positivePattern"substring "{plusSign}" を含み、"{minusSign}" は含まないこと。 "negativePattern"substring "{minusSign}" を含み、"{plusSign}" は含まないこと。 "zeroPattern""{plusSign}" および "{minusSign}" のいずれも含まないこと。 さらに "percent" フィールドの値は substring "{percentSign}" を含まなければならない。 "currency" フィールドの値は substring "{currencyCode}""{currencyPrefix}""{currencySuffix}" のいずれか1つ以上を含まなければならない。 "unit" フィールドの値は substring "{unitPrefix}" または "{unitSuffix}" のいずれか1つ以上を含まなければならない。 パターン文字列は ECMA-2626.1.4 に記載されている UTF-16 エンコードされたコードポイントの並びとして解釈した場合、Unicode Standard に規定される General Category "Number, decimal digit" のコードポイントを含んではならない。
  • [[LocaleData]].[[<locale>]] は、すべてのロケール値 locale に対して [[notationSubPatterns]] フィールドも持つ必要がある。このフィールドの値は Record であり、2つのフィールド [[scientific]] および [[compact]] を持つ。[[scientific]] フィールドは "{number}""{scientificSeparator}""{scientificExponent}" の部分文字列を含む文字列値でなければならない。[[compact]] フィールドは Record であり、2つのフィールド "short" および "long" を持つ。これらのフィールドは、実装がサポートするコンパクト表記の全ての離散的な桁数に対応する integer キーを持つ Record でなければならない。これらのフィールドは、substring "{number}" を含む文字列値でよい。"short" 配下の文字列は substring "{compactSymbol}" を含み、"long" 配下の文字列は substring "{compactName}" を含まなければならない。
注2
実装においては、Common Locale Data Repository(https://cldr.unicode.org/)で提供されるロケールデータの利用が推奨される。

16.3 Intl.NumberFormat プロトタイプオブジェクトのプロパティ

Intl.NumberFormat プロトタイプオブジェクト

  • %Intl.NumberFormat.prototype% である。
  • 通常のオブジェクトである。
  • Intl.NumberFormat のインスタンスではなく、[[InitializedNumberFormat]] 内部スロットや Intl.NumberFormat インスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

16.3.1 Intl.NumberFormat.prototype.constructor

Intl.NumberFormat.prototype.constructor の初期値は %Intl.NumberFormat% である。

16.3.2 Intl.NumberFormat.prototype.resolvedOptions ( )

この関数は、オブジェクトの初期化時に計算されたロケールとオプションへのアクセスを提供する。

  1. nfthis の値とする。
  2. 実装が規範的オプション コンストラクタモード(4.3 注1)をサポートする場合、
    1. nf を ? UnwrapNumberFormat(nf) に設定する。
  3. RequireInternalSlot(nf, [[InitializedNumberFormat]]) を実行する。
  4. optionsOrdinaryObjectCreate(%Object.prototype%) に設定する。
  5. 表26 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. p を現在の行の Property の値とする。
    2. v を、現在の行の Internal Slot の値という名前を持つ nf の内部スロットの値とする。
    3. vundefined でない場合、
      1. 現在の行に Conversion 値がある場合、
        1. Assert:Conversion の値は number である。
        2. v𝔽(v) に設定する。
      2. CreateDataPropertyOrThrow(options, p, v) を実行する。
  6. options を返す。
表26: NumberFormat インスタンスの解決済みオプション
内部スロット プロパティ 変換
[[Locale]] "locale"
[[NumberingSystem]] "numberingSystem"
[[Style]] "style"
[[Currency]] "currency"
[[CurrencyDisplay]] "currencyDisplay"
[[CurrencySign]] "currencySign"
[[Unit]] "unit"
[[UnitDisplay]] "unitDisplay"
[[MinimumIntegerDigits]] "minimumIntegerDigits" number
[[MinimumFractionDigits]] "minimumFractionDigits" number
[[MaximumFractionDigits]] "maximumFractionDigits" number
[[MinimumSignificantDigits]] "minimumSignificantDigits" number
[[MaximumSignificantDigits]] "maximumSignificantDigits" number
[[UseGrouping]] "useGrouping"
[[Notation]] "notation"
[[CompactDisplay]] "compactDisplay"
[[SignDisplay]] "signDisplay"
[[RoundingIncrement]] "roundingIncrement" number
[[RoundingMode]] "roundingMode"
[[ComputedRoundingPriority]] "roundingPriority"
[[TrailingZeroDisplay]] "trailingZeroDisplay"

16.3.3 get Intl.NumberFormat.prototype.format

Intl.NumberFormat.prototype.format は アクセサプロパティ であり、その setter アクセサ関数は undefined である。getter アクセサ関数は次の手順を実行する:

  1. nfthis の値とする。
  2. 実装が規範的オプション コンストラクタ モード(4.3 注1)をサポートする場合、
    1. nf を ? UnwrapNumberFormat(nf) に設定する。
  3. RequireInternalSlot(nf, [[InitializedNumberFormat]]) を実行する。
  4. nf.[[BoundFormat]]undefined の場合、
    1. F を Number Format Functions(16.5.2)で定義される新しい組み込み 関数オブジェクト とする。
    2. F.[[NumberFormat]]nf を設定する。
    3. nf.[[BoundFormat]]F を設定する。
  5. nf.[[BoundFormat]] を返す。
返される関数は nf にバインドされているため、Array.prototype.map や他の関数に直接渡すことができる。 これは、現在は新機能では踏襲されない慣習の歴史的遺物と見なされるが、既存のプログラムとの互換性維持のため保存されている。

16.3.4 Intl.NumberFormat.prototype.formatRange ( start, end )

formatRange メソッドが引数 start および end で呼び出された場合、次の手順を行う:

  1. nfthis の値とする。
  2. RequireInternalSlot(nf, [[InitializedNumberFormat]]) を実行する。
  3. startundefined または endundefined なら、TypeError 例外を投げる。
  4. x を ? ToIntlMathematicalValue(start) に設定する。
  5. y を ? ToIntlMathematicalValue(end) に設定する。
  6. FormatNumericRange(nf, x, y) を返す。

16.3.5 Intl.NumberFormat.prototype.formatRangeToParts ( start, end )

formatRangeToParts メソッドが引数 start および end で呼び出された場合、次の手順を行う:

  1. nfthis の値とする。
  2. RequireInternalSlot(nf, [[InitializedNumberFormat]]) を実行する。
  3. startundefined または endundefined なら、TypeError 例外を投げる。
  4. x を ? ToIntlMathematicalValue(start) に設定する。
  5. y を ? ToIntlMathematicalValue(end) に設定する。
  6. FormatNumericRangeToParts(nf, x, y) を返す。

16.3.6 Intl.NumberFormat.prototype.formatToParts ( value )

formatToParts メソッドが省略可能な引数 value で呼び出された場合、次の手順を行う:

  1. nfthis の値とする。
  2. RequireInternalSlot(nf, [[InitializedNumberFormat]]) を実行する。
  3. x を ? ToIntlMathematicalValue(value) に設定する。
  4. FormatNumericToParts(nf, x) を返す。

16.3.7 Intl.NumberFormat.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "Intl.NumberFormat" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

16.4 Intl.NumberFormat インスタンスのプロパティ

Intl.NumberFormat インスタンスは 通常のオブジェクトであり、%Intl.NumberFormat.prototype% からプロパティを継承する。

Intl.NumberFormat インスタンスは [[InitializedNumberFormat]] 内部スロットを持つ。

Intl.NumberFormat インスタンスはまた、Intl.NumberFormat コンストラクタによって計算されるいくつかの内部スロットも持つ:

  • [[Locale]] は、書式化に用いられるロケールのString値(その言語タグ)である。
  • [[LocaleData]] は、書式化のために実装が利用可能なデータを表す Record である。これは %Intl.NumberFormat%.[[LocaleData]][[Locale]] の値またはそのプレフィックスに対応するエントリの値である。
  • [[NumberingSystem]] は、書式化に使用される Unicode 数字体系識別子 を表す String 値である。
  • [[Style]] は、"decimal""currency""percent""unit" のいずれかの String 値であり、測定される量の種類を識別する。
  • [[Currency]] は、通貨を識別する通貨コードの String値であり、"currency" ユニットタイプで書式化する場合にのみ使用される。これは [[Style]] の値が "currency" の場合のみ使われる。
  • [[CurrencyDisplay]] は、"code""symbol""narrowSymbol""name" のいずれかの String 値であり、"currency" スタイルで書式化する場合、通貨を ISO 4217 アルファベットコード・ローカライズされた記号・ローカライズされた通貨名のいずれとして表示するかを指定する。これは [[Style]] の値が "currency" の場合のみ使われる。
  • [[CurrencySign]] は、"standard" または "accounting" のいずれかの String 値であり、負の数値を会計書式(しばしば括弧で示される)で表示するかどうかを指定する。これは [[Style]] の値が "currency" かつ [[SignDisplay]]"never" でない場合のみ使われる。
  • [[Unit]]コア単位識別子 であり、[[Style]] の値が "unit" の場合のみ使われる。
  • [[UnitDisplay]] は、"short""narrow""long" のいずれかの String 値であり、"unit" スタイルで書式化する場合、単位を記号・狭い記号・ローカライズされた長い名前のいずれとして表示するかを指定する。これは [[Style]] の値が "unit" の場合のみ使われる。
  • [[MinimumIntegerDigits]] は、使用する最小の 整数桁数を示す非負の整数である。必要に応じて先頭にゼロを付加する。
  • [[MinimumFractionDigits]] および [[MaximumFractionDigits]] は、使用する最小および最大の 小数桁数を示す非負の整数である。必要に応じて丸められたり、末尾にゼロが付加される。これらのプロパティは [[RoundingType]]fraction-digitsmore-precisionless-precision の場合のみ使われる。
  • [[MinimumSignificantDigits]] および [[MaximumSignificantDigits]] は、表示する最小および最大の 有効桁数を示す正の整数である。指定された有効桁数を表示するために必要なだけ小数桁が使われる。これらのプロパティは [[RoundingType]]significant-digitsmore-precisionless-precision の場合のみ使われる。
  • [[UseGrouping]] は、区切り文字を使う条件を示す Boolean または String 値である。区切り文字の位置や表示は 実装依存である。"always" は可能な限り区切り文字を表示することを示唆し、"min2" はグループ内に2桁以上ある場合のみ、"auto" はロケールがそれを推奨する場合のみ表示する。false なら区切り文字は使われない。
  • [[RoundingType]]fraction-digitssignificant-digitsmore-precisionless-precision のいずれかであり、どの丸め方式を使うかを示す。fraction-digits の場合は [[MinimumFractionDigits]][[MaximumFractionDigits]]significant-digits の場合は [[MinimumSignificantDigits]][[MaximumSignificantDigits]] で丸める。more-precisionless-precision の場合は4つすべての設定が使われ、どちらを使うかは特定の規則で決定される。[[RoundingType]]"roundingPriority" オプションから導出される。
  • [[ComputedRoundingPriority]]"auto""morePrecision""lessPrecision" のいずれかの String 値であり、16.3.2[[RoundingType]] を有効な "roundingPriority" オプションに変換するのに使われる。
  • [[Notation]]"standard""scientific""engineering""compact" のいずれかの String 値であり、スケーリングせずに表示するか、科学表記・工学表記・コンパクト表記で表示するかを指定する。コンパクト表記では ILD のコンパクト十進法の桁数にスケーリングし、その接辞が付加される。
  • [[CompactDisplay]]"short" または "long" のいずれかの String 値であり、コンパクト表記で短い("5K")か長い("5千")接辞を使うかを指定する。これは [[Notation]] の値が "compact" の場合のみ使われる。
  • [[SignDisplay]]"auto""always""never""exceptZero""negative" のいずれかの String 値であり、符号をいつ表示するかを指定する("auto"以外はそれぞれ常に、決して、ゼロ以外のみ、ゼロ以外の負数のみ)。科学表記の場合、このスロットは仮数の符号表示には影響するが指数には影響しない。
  • [[RoundingIncrement]] は 10、100、1000、10000 を10分割・5分割・4分割・2分割する整数であり、丸めの単位を決定する。例えば [[MaximumFractionDigits]] が2で [[RoundingIncrement]] が5なら、最も近い0.05(ニッケル丸め)に丸める。
  • [[RoundingMode]]丸めモードであり、表27のIdentifier列のいずれかの String 値である。
  • [[TrailingZeroDisplay]]"auto" または "stripIfInteger" のいずれかの String 値であり、書式化した値が整数(小数桁がすべて0)なら末尾のゼロを除去するかどうかを示す。
表27: Intl.NumberFormatの丸めモード
Identifier 説明 例: 小数点以下0桁へ丸め
-1.5 0.4 0.5 0.6 1.5
"ceil" 正の無限大方向へ ⬆️ [-1] ⬆️ [1] ⬆️ [1] ⬆️ [1] ⬆️ [2]
"floor" 負の無限大方向へ ⬇️ [-2] ⬇️ [0] ⬇️ [0] ⬇️ [0] ⬇️ [1]
"expand" ゼロから遠ざかる方向へ ⬇️ [-2] ⬆️ [1] ⬆️ [1] ⬆️ [1] ⬆️ [2]
"trunc" ゼロ方向へ ⬆️ [-1] ⬇️ [0] ⬇️ [0] ⬇️ [0] ⬇️ [1]
"halfCeil" 同点は正の無限大方向へ ⬆️ [-1] ⬇️ [0] ⬆️ [1] ⬆️ [1] ⬆️ [2]
"halfFloor" 同点は負の無限大方向へ ⬇️ [-2] ⬇️ [0] ⬇️ [0] ⬆️ [1] ⬇️ [1]
"halfExpand" 同点はゼロから遠ざかる方向へ ⬇️ [-2] ⬇️ [0] ⬆️ [1] ⬆️ [1] ⬆️ [2]
"halfTrunc" 同点はゼロ方向へ ⬆️ [-1] ⬇️ [0] ⬇️ [0] ⬆️ [1] ⬇️ [1]
"halfEven" 同点は丸め増分の偶数倍へ ⬇️ [-2] ⬇️ [0] ⬇️ [0] ⬆️ [1] ⬆️ [2]
例は各オプションの特徴的な挙動を示すものです。⬆️は「正の無限大方向」、⬇️は「負の無限大方向」を意味します。

最後に、Intl.NumberFormat インスタンスは [[BoundFormat]] 内部スロットを持ち、これは format アクセサ(16.3.3)で返される関数をキャッシュする。

16.5 NumberFormat オブジェクトの抽象操作

16.5.1 CurrencyDigits ( currency )

実装定義 抽象操作 CurrencyDigits は引数 currency(String)を受け取り、非負の 整数 を返す。呼び出し時に次の手順を行う:

  1. Assert: IsWellFormedCurrencyCode(currency) は true である。
  2. currency に対応する通貨の数量をフォーマットする際に用いる小数桁数を表す非負の 整数 を返す。桁数に関する情報が存在しない場合は 2 を返す。

16.5.2 数値書式関数

数値書式関数は [[NumberFormat]] 内部スロットを持つ匿名の組み込み関数である。

数値書式関数 F が省略可能な引数 value で呼び出された場合、次の手順を行う:

  1. nfF.[[NumberFormat]] に設定する。
  2. Assert: nfオブジェクト かつ nf[[InitializedNumberFormat]] 内部スロットを持つ。
  3. value が与えられていなければ、valueundefined に設定する。
  4. x を ? ToIntlMathematicalValue(value) に設定する。
  5. FormatNumeric(nf, x) を返す。

数値書式関数の "length" プロパティは 1𝔽 である。

16.5.3 FormatNumericToString ( intlObject, x )

抽象操作 FormatNumericToString は、引数 intlObject(Object)、x数学値または negative-zero)を受け取り、フィールド [[RoundedNumber]]数学値または negative-zero)、[[FormattedString]](String)を持つ Record を返す。これは intlObject の内部スロットに従って xIntl 数学値 に丸める。[[RoundedNumber]] フィールドには丸めた結果、[[FormattedString]] フィールドには intlObject の内部スロットに従いフォーマットされた String 表現が入る。呼び出し時に次の手順を行う:

  1. Assert: intlObject[[RoundingMode]][[RoundingType]][[MinimumSignificantDigits]][[MaximumSignificantDigits]][[MinimumIntegerDigits]][[MinimumFractionDigits]][[MaximumFractionDigits]][[RoundingIncrement]][[TrailingZeroDisplay]] 内部スロットを持つ。
  2. xnegative-zero なら、
    1. signnegative に設定する。
    2. x を 0 に設定する。
  3. それ以外の場合、
    1. Assert: x数学値 である。
    2. x < 0 なら signnegative に、それ以外は signpositive に設定する。
    3. signnegative なら x を -x に設定する。
  4. unsignedRoundingModeGetUnsignedRoundingMode(intlObject.[[RoundingMode]], sign) に設定する。
  5. intlObject.[[RoundingType]]significant-digits なら、
    1. resultToRawPrecision(x, intlObject.[[MinimumSignificantDigits]], intlObject.[[MaximumSignificantDigits]], unsignedRoundingMode) に設定する。
  6. それ以外で intlObject.[[RoundingType]]fraction-digits なら、
    1. resultToRawFixed(x, intlObject.[[MinimumFractionDigits]], intlObject.[[MaximumFractionDigits]], intlObject.[[RoundingIncrement]], unsignedRoundingMode) に設定する。
  7. それ以外の場合、
    1. sResultToRawPrecision(x, intlObject.[[MinimumSignificantDigits]], intlObject.[[MaximumSignificantDigits]], unsignedRoundingMode) に設定する。
    2. fResultToRawFixed(x, intlObject.[[MinimumFractionDigits]], intlObject.[[MaximumFractionDigits]], intlObject.[[RoundingIncrement]], unsignedRoundingMode) に設定する。
    3. fResult.[[RoundingMagnitude]] < sResult.[[RoundingMagnitude]] なら fixedIsMorePrecisetrue に、それ以外は fixedIsMorePrecisefalse に設定する。
    4. intlObject.[[RoundingType]]more-precision かつ fixedIsMorePrecisetrue なら resultfResult に設定する。
    5. それ以外で intlObject.[[RoundingType]]less-precision かつ fixedIsMorePrecisefalse なら resultfResult に設定する。
    6. それ以外は resultsResult に設定する。
  8. xresult.[[RoundedNumber]] に設定する。
  9. stringresult.[[FormattedString]] に設定する。
  10. intlObject.[[TrailingZeroDisplay]]"stripIfInteger" かつ x modulo 1 = 0 なら、
    1. iStringIndexOf(string, ".", 0) に設定する。
    2. inot-found でなければ stringstring の 0 から i までの substring に設定する。
  11. intresult.[[IntegerDigitsCount]] に設定する。
  12. minIntegerintlObject.[[MinimumIntegerDigits]] に設定する。
  13. int < minInteger なら、
    1. forwardZerosminInteger - int 回 0x0030(DIGIT ZERO)のコードユニットからなる String に設定する。
    2. stringforwardZerosstring文字列連結 に設定する。
  14. signnegative なら、
    1. x が 0 なら xnegative-zero に、それ以外は x を -x に設定する。
  15. Record { [[RoundedNumber]]: x, [[FormattedString]]: string } を返す。

16.5.4 PartitionNumberPattern ( numberFormat, x )

抽象操作 PartitionNumberPattern は引数 numberFormat(NumberFormat として初期化されたオブジェクト)、xIntl 数学値)を受け取り、フィールド [[Type]](String)、[[Value]](String)を持つ RecordList を返す。これは x数学値numberFormat の有効ロケールおよび書式オプションに従って表現するパーツを作成する。呼び出し時に次の手順を行う:

  1. exponent を 0 に設定する。
  2. xnot-a-number なら、
    1. nILD で表される NaN 値を示す String 値に設定する。
  3. それ以外で xpositive-infinity なら、
    1. nILD で表される正の無限大を示す String 値に設定する。
  4. それ以外で xnegative-infinity なら、
    1. nILD で表される負の無限大を示す String 値に設定する。
  5. それ以外の場合、
    1. xnegative-zero でない場合、
      1. Assert: x数学値 である。
      2. numberFormat.[[Style]]"percent" なら、x を 100 × x に設定する。
      3. exponentComputeExponent(numberFormat, x) に設定する。
      4. xx × 10-exponent に設定する。
    2. formatNumberResultFormatNumericToString(numberFormat, x) に設定する。
    3. nformatNumberResult.[[FormattedString]] に設定する。
    4. xformatNumberResult.[[RoundedNumber]] に設定する。
  6. patternGetNumberFormatPattern(numberFormat, x) に設定する。
  7. result を新しい空の List に設定する。
  8. patternPartsPartitionPattern(pattern) に設定する。
  9. patternParts の各 Record { [[Type]], [[Value]] } patternPart について、
    1. ppatternPart.[[Type]] に設定する。
    2. p"literal" なら、
      1. Record { [[Type]]: "literal", [[Value]]: patternPart.[[Value]] } を result に追加する。
    3. それ以外で p"number" なら、
      1. notationSubPartsPartitionNotationSubPattern(numberFormat, x, n, exponent) に設定する。
      2. resultresultnotationSubPartsリスト連結に設定する。
    4. それ以外で p"plusSign" なら、
      1. plusSignSymbolILND で表されるプラス記号の String に設定する。
      2. Record { [[Type]]: "plusSign", [[Value]]: plusSignSymbol } を result に追加する。
    5. それ以外で p"minusSign" なら、
      1. minusSignSymbolILND で表されるマイナス記号の String に設定する。
      2. Record { [[Type]]: "minusSign", [[Value]]: minusSignSymbol } を result に追加する。
    6. それ以外で p"percentSign" かつ numberFormat.[[Style]]"percent" なら、
      1. percentSignSymbolILND で表されるパーセント記号の String に設定する。
      2. Record { [[Type]]: "percentSign", [[Value]]: percentSignSymbol } を result に追加する。
    7. それ以外で p"unitPrefix" かつ numberFormat.[[Style]]"unit" なら、
      1. unitnumberFormat.[[Unit]] に設定する。
      2. unitDisplaynumberFormat.[[UnitDisplay]] に設定する。
      3. muILDx の前に unitDisplay 形式で表す unit の String(複数形に依存する言語では x に依存してもよい)に設定する。
      4. Record { [[Type]]: "unit", [[Value]]: mu } を result に追加する。
    8. それ以外で p"unitSuffix" かつ numberFormat.[[Style]]"unit" なら、
      1. unitnumberFormat.[[Unit]] に設定する。
      2. unitDisplaynumberFormat.[[UnitDisplay]] に設定する。
      3. muILDx の後に unitDisplay 形式で表す unit の String(複数形に依存する言語では x に依存してもよい)に設定する。
      4. Record { [[Type]]: "unit", [[Value]]: mu } を result に追加する。
    9. それ以外で p"currencyCode" かつ numberFormat.[[Style]]"currency" なら、
      1. currencynumberFormat.[[Currency]] に設定する。
      2. cdcurrency に設定する。
      3. Record { [[Type]]: "currency", [[Value]]: cd } を result に追加する。
    10. それ以外で p"currencyPrefix" かつ numberFormat.[[Style]]"currency" なら、
      1. currencynumberFormat.[[Currency]] に設定する。
      2. currencyDisplaynumberFormat.[[CurrencyDisplay]] に設定する。
      3. cdILDx の前に currencyDisplay 形式で表す currency の String(複数形に依存する言語では x に依存してもよい)に設定する。
      4. Record { [[Type]]: "currency", [[Value]]: cd } を result に追加する。
    11. それ以外で p"currencySuffix" かつ numberFormat.[[Style]]"currency" なら、
      1. currencynumberFormat.[[Currency]] に設定する。
      2. currencyDisplaynumberFormat.[[CurrencyDisplay]] に設定する。
      3. cdILDx の後に currencyDisplay 形式で表す currency の String(複数形に依存する言語では x に依存してもよい。実装にその表現がなければ currency 自体を使う)に設定する。
      4. Record { [[Type]]: "currency", [[Value]]: cd } を result に追加する。
    12. それ以外の場合、
      1. unknownILNDx および p に基づく String に設定する。
      2. Record { [[Type]]: "unknown", [[Value]]: unknown } を result に追加する。
  10. result を返す。

16.5.5 PartitionNotationSubPattern ( numberFormat, x, n, exponent )

抽象操作 PartitionNotationSubPattern は、引数 numberFormat(Intl.NumberFormat)、xIntl 数学値)、n(String)、exponent整数)を受け取り、フィールド [[Type]](String)および [[Value]](String)を持つ RecordList を返す。 x は丸め後の Intl 数学値 であり、n は中間の書式化文字列である。 この操作は、numberFormat の有効ロケールと書式オプションに従って、数値と表記の対応パーツを作成する。 呼び出し時に次の手順を行う:

  1. result を新しい空の List に設定する。
  2. xnot-a-number なら、
    1. Record { [[Type]]: "nan", [[Value]]: n } を result に追加する。
  3. それ以外で xpositive-infinity または negative-infinity なら、
    1. Record { [[Type]]: "infinity", [[Value]]: n } を result に追加する。
  4. それ以外の場合、
    1. notationSubPatternGetNotationSubPattern(numberFormat, exponent) に設定する。
    2. patternPartsPartitionPattern(notationSubPattern) に設定する。
    3. patternParts の各 Record { [[Type]], [[Value]] } patternPart について、
      1. ppatternPart.[[Type]] に設定する。
      2. p"literal" なら、
        1. Record { [[Type]]: "literal", [[Value]]: patternPart.[[Value]] } を result に追加する。
      3. それ以外で p"number" なら、
        1. numberFormat.[[NumberingSystem]] が下記 表28 の Numbering System 列のいずれかに一致する場合、
          1. digits を対応する行の Digits 列で指定されたコードポイントの List に設定する。
          2. Assert: digits の長さは 10 である。
          3. transliterated を空文字列に設定する。
          4. lenn の長さに設定する。
          5. position を 0 に設定する。
          6. position < len の間繰り返す:
            1. cn の index position のコードユニットとする。
            2. 0x0030 ≤ c ≤ 0x0039 なら、
              1. 注:c はASCII数字。
              2. ic - 0x0030 に設定する。
              3. cCodePointsToStringdigits[i] ») に設定する。
            3. transliteratedtransliteratedc文字列連結に設定する。
            4. positionposition + 1 にする。
          7. ntransliterated に設定する。
        2. それ以外の場合、
          1. 実装依存アルゴリズムで n を指定された数字体系の適切な表現に変換する。
        3. decimalSepIndexStringIndexOf(n, ".", 0) に設定する。
        4. decimalSepIndexnot-found でなく かつ decimalSepIndex > 0 なら、
          1. integern の 0 から decimalSepIndex までの substring に設定する。
          2. fractionndecimalSepIndex + 1 からの substring に設定する。
        5. それ以外の場合、
          1. integern に設定する。
          2. fractionundefined に設定する。
        6. numberFormat.[[UseGrouping]]false なら、
          1. Record { [[Type]]: "integer", [[Value]]: integer } を result に追加する。
        7. それ以外の場合、
          1. groupSepSymbolILND で表される区切り記号の String に設定する。
          2. groupsILNDinteger 内の区切り位置に従った(numberFormat.[[UseGrouping]]の値にも依存)左から右の順の List に設定する。
          3. Assert: groups の要素数は 0 より大きい。
          4. groups が空でない間繰り返す:
            1. groups の先頭要素を除去し、それを integerGroup とする。
            2. Record { [[Type]]: "integer", [[Value]]: integerGroup } を result に追加する。
            3. groups がまだ空でないなら、
              1. Record { [[Type]]: "group", [[Value]]: groupSepSymbol } を result に追加する。
        8. fractionundefined でない場合、
          1. decimalSepSymbolILND で表される小数点記号の String に設定する。
          2. Record { [[Type]]: "decimal", [[Value]]: decimalSepSymbol } を result に追加する。
          3. Record { [[Type]]: "fraction", [[Value]]: fraction } を result に追加する。
      4. それ以外で p"compactSymbol" なら、
        1. compactSymbol を短い形式の exponent を表す ILD の文字列に設定(複数形を持つ言語では x に依存してよい。実装はこの文字列を提供できなければならない。パターンに "{compactSymbol}" プレースホルダーがなければならない)。
        2. Record { [[Type]]: "compact", [[Value]]: compactSymbol } を result に追加する。
      5. それ以外で p"compactName" なら、
        1. compactName を長い形式の exponent を表す ILD の文字列に設定(複数形を持つ言語では x に依存してよい。実装はこの文字列を提供できなければならない。パターンに "{compactName}" プレースホルダーがなければならない)。
        2. Record { [[Type]]: "compact", [[Value]]: compactName } を result に追加する。
      6. それ以外で p"scientificSeparator" なら、
        1. scientificSeparator を指数セパレータを表す ILND の String に設定する。
        2. Record { [[Type]]: "exponentSeparator", [[Value]]: scientificSeparator } を result に追加する。
      7. それ以外で p"scientificExponent" なら、
        1. exponent < 0 なら、
          1. minusSignSymbol をマイナス記号を表す ILND の String に設定する。
          2. Record { [[Type]]: "exponentMinusSign", [[Value]]: minusSignSymbol } を result に追加する。
          3. exponent を -exponent に設定する。
        2. exponentResultToRawFixed(exponent, 0, 0, 1, undefined) に設定する。
        3. Record { [[Type]]: "exponentInteger", [[Value]]: exponentResult.[[FormattedString]] } を result に追加する。
      8. それ以外の場合、
        1. unknownx および p に基づく ILND の String に設定する。
        2. Record { [[Type]]: "unknown", [[Value]]: unknown } を result に追加する。
  5. result を返す。
表28: 単純な数字対応を持つ数字体系
数字体系 数字
adlm U+1E950 〜 U+1E959
ahom U+11730 〜 U+11739
arab U+0660 〜 U+0669
arabext U+06F0 〜 U+06F9
bali U+1B50 〜 U+1B59
beng U+09E6 〜 U+09EF
bhks U+11C50 〜 U+11C59
brah U+11066 〜 U+1106F
cakm U+11136 〜 U+1113F
cham U+AA50 〜 U+AA59
deva U+0966 〜 U+096F
diak U+11950 〜 U+11959
fullwide U+FF10 〜 U+FF19
gara U+10D40 〜 U+10D49
gong U+11DA0 〜 U+11DA9
gonm U+11D50 〜 U+11D59
gujr U+0AE6 〜 U+0AEF
gukh U+16130 〜 U+16139
guru U+0A66 〜 U+0A6F
hanidec U+3007, U+4E00, U+4E8C, U+4E09, U+56DB, U+4E95, U+516D, U+4E03, U+516B, U+4E5D
hmng U+16B50 〜 U+16B59
hmnp U+1E140 〜 U+1E149
java U+A9D0 〜 U+A9D9
kali U+A900 〜 U+A909
kawi U+11F50 〜 U+11F59
khmr U+17E0 〜 U+17E9
knda U+0CE6 〜 U+0CEF
krai U+16D70 〜 U+16D79
lana U+1A80 〜 U+1A89
lanatham U+1A90 〜 U+1A99
laoo U+0ED0 〜 U+0ED9
latn U+0030 〜 U+0039
lepc U+1C40 〜 U+1C49
limb U+1946 〜 U+194F
mathbold U+1D7CE 〜 U+1D7D7
mathdbl U+1D7D8 〜 U+1D7E1
mathmono U+1D7F6 〜 U+1D7FF
mathsanb U+1D7EC 〜 U+1D7F5
mathsans U+1D7E2 〜 U+1D7EB
mlym U+0D66 〜 U+0D6F
modi U+11650 〜 U+11659
mong U+1810 〜 U+1819
mroo U+16A60 〜 U+16A69
mtei U+ABF0 〜 U+ABF9
mymr U+1040 〜 U+1049
mymrepka U+116DA 〜 U+116E3
mymrpao U+116D0 〜 U+116D9
mymrshan U+1090 〜 U+1099
mymrtlng U+A9F0 〜 U+A9F9
nagm U+1E4F0 〜 U+1E4F9
newa U+11450 〜 U+11459
nkoo U+07C0 〜 U+07C9
olck U+1C50 〜 U+1C59
onao U+1E5F1 〜 U+1E5FA
orya U+0B66 〜 U+0B6F
osma U+104A0 〜 U+104A9
outlined U+1CCF0 〜 U+1CCF9
rohg U+10D30 〜 U+10D39
saur U+A8D0 〜 U+A8D9
segment U+1FBF0 〜 U+1FBF9
shrd U+111D0 〜 U+111D9
sind U+112F0 〜 U+112F9
sinh U+0DE6 〜 U+0DEF
sora U+110F0 〜 U+110F9
sund U+1BB0 〜 U+1BB9
sunu U+11BF0 〜 U+11BF9
takr U+116C0 〜 U+116C9
talu U+19D0 〜 U+19D9
tamldec U+0BE6 〜 U+0BEF
telu U+0C66 〜 U+0C6F
thai U+0E50 〜 U+0E59
tibt U+0F20 〜 U+0F29
tirh U+114D0 〜 U+114D9
tnsa U+16AC0 〜 U+16AC9
vaii U+A620 〜 U+A629
wara U+118E0 〜 U+118E9
wcho U+1E2F0 〜 U+1E2F9
注1
計算は ILD および ILND の文字列値、および numberFormat の有効ロケールや数字体系に依存する数値文字列内の位置に依存する。ここで挙げた ILDILND の文字列値は、通貨名以外は Unicode Standard の「Number, decimal digit」一般カテゴリのコードポイントを含んではならない。
注2
実装には、Common Locale Data Repository(https://cldr.unicode.org/)で提供されるロケールの利用が推奨される。

16.5.6 FormatNumeric ( numberFormat, x )

抽象操作 FormatNumeric は、引数 numberFormat(Intl.NumberFormat)と xIntl 数学値)を受け取り、String を返す。呼び出し時に次の手順を行う:

  1. partsPartitionNumberPattern(numberFormat, x) に設定する。
  2. result を空文字列に設定する。
  3. parts の各 Record { [[Type]], [[Value]] } part について、
    1. resultresultpart.[[Value]]文字列連結に設定する。
  4. result を返す。

16.5.7 FormatNumericToParts ( numberFormat, x )

抽象操作 FormatNumericToParts は、引数 numberFormat(Intl.NumberFormat)、xIntl 数学値)を受け取り、Array を返す。呼び出し時に次の手順を行う:

  1. partsPartitionNumberPattern(numberFormat, x) に設定する。
  2. result を !ArrayCreate(0) に設定する。
  3. n を 0 に設定する。
  4. parts の各 Record { [[Type]], [[Value]] } part について、
    1. OOrdinaryObjectCreate(%Object.prototype%) に設定する。
    2. !CreateDataPropertyOrThrow(O, "type", part.[[Type]]) を実行する。
    3. !CreateDataPropertyOrThrow(O, "value", part.[[Value]]) を実行する。
    4. !CreateDataPropertyOrThrow(result, !ToString(𝔽(n)), O) を実行する。
    5. n を 1 加算する。
  5. result を返す。

16.5.8 ToRawPrecision ( x, minPrecision, maxPrecision, unsignedRoundingMode )

抽象操作 ToRawPrecision は、引数 x(非負の 数学値)、minPrecision整数、1〜21の閉区間)、maxPrecision整数、1〜21の閉区間)、unsignedRoundingMode表29のUnsigned Rounding Mode列の仕様型、またはundefined)を受け取り、フィールド [[FormattedString]](String)、[[RoundedNumber]]数学値)、[[IntegerDigitsCount]]整数)、[[RoundingMagnitude]]整数)を持つ Record を返す。

以下の式を解くことを含み、整数入力に対し有効な数学値を返す:

ToRawPrecisionFn(n, e, p) = n × 10ep+1
ここで 10p–1n < 10p

呼び出し時に次の手順を行う:

  1. pmaxPrecision に設定する。
  2. x = 0 なら、
    1. mp 回 0x0030(DIGIT ZERO)のコードユニットからなる文字列に設定する。
    2. e を 0 に設定する。
    3. xFinal を 0 に設定する。
  3. それ以外の場合、
    1. n1e1整数r1数学値とし、r1 = ToRawPrecisionFn(n1, e1, p)r1xかつr1が最大となるようにする。
    2. n2e2整数r2数学値とし、r2 = ToRawPrecisionFn(n2, e2, p)r2xかつr2が最小となるようにする。
    3. xFinalApplyUnsignedRoundingMode(x, r1, r2, unsignedRoundingMode) に設定する。
    4. xFinalr1 なら、
      1. nn1 に設定する。
      2. ee1 に設定する。
    5. それ以外の場合、
      1. nn2 に設定する。
      2. ee2 に設定する。
    6. mn の10進表現の桁からなる文字列(先頭にゼロなし)に設定する。
  4. e ≥ (p - 1) なら、
    1. mme - p + 1 回 0x0030(DIGIT ZERO)のコードユニットの文字列連結に設定する。
    2. inte + 1 に設定する。
  5. それ以外で e ≥ 0 なら、
    1. mm の先頭 e + 1 コードユニット、0x002E(FULL STOP)、残り p - (e + 1) コードユニットの文字列連結に設定する。
    2. inte + 1 に設定する。
  6. それ以外の場合、
    1. Assert: e < 0。
    2. m"0."、-(e + 1) 回 0x0030(DIGIT ZERO)、m文字列連結に設定する。
    3. int を 1 に設定する。
  7. m が 0x002E(FULL STOP)を含み、maxPrecision > minPrecision なら、
    1. cutmaxPrecision - minPrecision に設定する。
    2. cut > 0 かつ m の末尾コードユニットが 0x0030(DIGIT ZERO)の間繰り返す:
      1. m の末尾コードユニットを除去する。
      2. cutcut - 1 に設定する。
    3. m の末尾コードユニットが 0x002E(FULL STOP)なら、
      1. m の末尾コードユニットを除去する。
  8. Record { [[FormattedString]]: m, [[RoundedNumber]]: xFinal, [[IntegerDigitsCount]]: int, [[RoundingMagnitude]]: ep+1 } を返す。

16.5.9 ToRawFixed ( x, minFraction, maxFraction, roundingIncrement, unsignedRoundingMode )

抽象操作 ToRawFixed は、引数 x(非負の 数学値)、minFraction整数、0〜100の閉区間)、maxFraction整数、0〜100の閉区間)、roundingIncrement整数)、unsignedRoundingMode表29のUnsigned Rounding Mode列の仕様型、またはundefined)を受け取り、フィールド [[FormattedString]](String)、[[RoundedNumber]]数学値)、[[IntegerDigitsCount]]整数)、[[RoundingMagnitude]]整数)を持つ Record を返す。

以下の式を解くことを含み、整数入力に対し有効な数学値を返す:

ToRawFixedFn(n, f) = n × 10f

呼び出し時に次の手順を行う:

  1. fmaxFraction に設定する。
  2. n1整数r1数学値とし、r1 = ToRawFixedFn(n1, f)n1 modulo roundingIncrement = 0r1xかつr1が最大となるようにする。
  3. n2整数r2数学値とし、r2 = ToRawFixedFn(n2, f)n2 modulo roundingIncrement = 0r2xかつr2が最小となるようにする。
  4. xFinalApplyUnsignedRoundingMode(x, r1, r2, unsignedRoundingMode) に設定する。
  5. xFinalr1 なら nn1 に、それ以外は nn2 に設定する。
  6. n = 0 なら m"0" に、それ以外は mn の10進表現の桁からなる文字列(先頭にゼロなし)に設定する。
  7. f ≠ 0 なら、
    1. km の長さに設定する。
    2. kf なら、
      1. zf + 1 - k 回 0x0030(DIGIT ZERO)の String に設定する。
      2. mzm文字列連結に設定する。
      3. kf + 1 に設定する。
    3. am の先頭 k - f コードユニット、b を残り f コードユニットに設定する。
    4. ma"."b文字列連結に設定する。
    5. inta の長さに設定する。
  8. それ以外の場合、
    1. intm の長さに設定する。
  9. cutmaxFraction - minFraction に設定する。
  10. cut > 0 かつ m の末尾コードユニットが 0x0030(DIGIT ZERO)の間繰り返す:
    1. m の末尾コードユニットを除去する。
    2. cutcut - 1 に設定する。
  11. m の末尾コードユニットが 0x002E(FULL STOP)なら、
    1. m の末尾コードユニットを除去する。
  12. Record { [[FormattedString]]: m, [[RoundedNumber]]: xFinal, [[IntegerDigitsCount]]: int, [[RoundingMagnitude]]: –f } を返す。
規範的オプション

16.5.10 UnwrapNumberFormat ( nf )

抽象操作 UnwrapNumberFormat は、引数 nfECMAScript 言語値)を受け取り、正常完了値を含む ECMAScript 言語値または throw completion を返す。 入力オブジェクトの NumberFormat インスタンスを返す。これは値自体か、%Intl.NumberFormat%コンストラクタ4.3 注1の規範的オプションモードに従い関連付けた値である。 呼び出し時に次の手順を行う:

  1. nfオブジェクトでないなら、TypeError 例外を投げる。
  2. nf[[InitializedNumberFormat]] 内部スロットを持たず、? OrdinaryHasInstance(%Intl.NumberFormat%, nf) が true なら、
    1. ? Get(nf, %Intl%.[[FallbackSymbol]]) を返す。
  3. nf を返す。

16.5.11 GetNumberFormatPattern ( numberFormat, x )

抽象操作 GetNumberFormatPattern は、引数 numberFormat(Intl.NumberFormat)と xIntl 数学値)を受け取り、String を返す。 number format オブジェクトの単位関連オプションと、最終的にスケーリング・丸めされた数値(Intl 数学値)を考慮し、16.2.3 で説明されるパターン(String 値)を返す。 呼び出し時に次の手順を行う:

  1. resolvedLocaleDatanumberFormat.[[LocaleData]] に設定する。
  2. patternsresolvedLocaleData.[[patterns]] に設定する。
  3. Assert: patternsRecord16.2.3 参照)。
  4. stylenumberFormat.[[Style]] に設定する。
  5. style"percent" なら、
    1. patternspatterns.[[percent]] に設定する。
  6. それ以外で style"unit" なら、
    1. unitnumberFormat.[[Unit]] に設定する。
    2. unitDisplaynumberFormat.[[UnitDisplay]] に設定する。
    3. patternspatterns.[[unit]] に設定する。
    4. もし patterns に [[<unit>]] フィールドがなければ、
      1. unit"fallback" に設定する。
    5. patternspatterns.[[<unit>]] に設定する。
    6. patternspatterns.[[<unitDisplay>]] に設定する。
  7. それ以外で style"currency" なら、
    1. currencynumberFormat.[[Currency]] に設定する。
    2. currencyDisplaynumberFormat.[[CurrencyDisplay]] に設定する。
    3. currencySignnumberFormat.[[CurrencySign]] に設定する。
    4. patternspatterns.[[currency]] に設定する。
    5. もし patterns に [[<currency>]] フィールドがなければ、
      1. currency"fallback" に設定する。
    6. patternspatterns.[[<currency>]] に設定する。
    7. patternspatterns.[[<currencyDisplay>]] に設定する。
    8. patternspatterns.[[<currencySign>]] に設定する。
  8. それ以外、
    1. Assert: style"decimal" である。
    2. patternspatterns.[[decimal]] に設定する。
  9. xnegative-infinity なら、
    1. categorynegative-non-zero に設定する。
  10. それ以外で xnegative-zero なら、
    1. categorynegative-zero に設定する。
  11. それ以外で xnot-a-number なら、
    1. categorypositive-zero に設定する。
  12. それ以外で xpositive-infinity なら、
    1. categorypositive-non-zero に設定する。
  13. それ以外、
    1. Assert: x数学値 である。
    2. x < 0 なら、
      1. categorynegative-non-zero に設定する。
    3. それ以外で x > 0 なら、
      1. categorypositive-non-zero に設定する。
    4. それ以外、
      1. categorypositive-zero に設定する。
  14. signDisplaynumberFormat.[[SignDisplay]] に設定する。
  15. signDisplay"never" なら、
    1. patternpatterns.[[zeroPattern]] に設定する。
  16. それ以外で signDisplay"auto" なら、
    1. categorypositive-non-zero または positive-zero なら、
      1. patternpatterns.[[zeroPattern]] に設定する。
    2. それ以外、
      1. patternpatterns.[[negativePattern]] に設定する。
  17. それ以外で signDisplay"always" なら、
    1. categorypositive-non-zero または positive-zero なら、
      1. patternpatterns.[[positivePattern]] に設定する。
    2. それ以外、
      1. patternpatterns.[[negativePattern]] に設定する。
  18. それ以外で signDisplay"exceptZero" なら、
    1. categorypositive-zero または negative-zero なら、
      1. patternpatterns.[[zeroPattern]] に設定する。
    2. それ以外で categorypositive-non-zero なら、
      1. patternpatterns.[[positivePattern]] に設定する。
    3. それ以外、
      1. patternpatterns.[[negativePattern]] に設定する。
  19. それ以外、
    1. Assert: signDisplay"negative" である。
    2. categorynegative-non-zero なら、
      1. patternpatterns.[[negativePattern]] に設定する。
    3. それ以外、
      1. patternpatterns.[[zeroPattern]] に設定する。
  20. pattern を返す。

16.5.12 GetNotationSubPattern ( numberFormat, exponent )

抽象操作 GetNotationSubPattern は、引数 numberFormat(Intl.NumberFormat)と exponent整数)を受け取り、String を返す。 解決された表記法と exponent を考慮し、16.2.3 で説明される表記サブパターンの String 値を返す。 呼び出し時に次の手順を行う:

  1. resolvedLocaleDatanumberFormat.[[LocaleData]] に設定する。
  2. notationSubPatternsresolvedLocaleData.[[notationSubPatterns]] に設定する。
  3. Assert: notationSubPatternsRecord16.2.3 参照)。
  4. notationnumberFormat.[[Notation]] に設定する。
  5. notation"scientific" または notation"engineering" なら、
    1. notationSubPatterns.[[scientific]] を返す。
  6. それ以外で exponent が 0 でないなら、
    1. Assert: notation"compact" である。
    2. compactDisplaynumberFormat.[[CompactDisplay]] に設定する。
    3. compactPatternsnotationSubPatterns.[[compact]].[[<compactDisplay>]] に設定する。
    4. compactPatterns.[[<exponent>]] を返す。
  7. それ以外、
    1. "{number}" を返す。

16.5.13 ComputeExponent ( numberFormat, x )

抽象操作 ComputeExponent は、引数 numberFormat(Intl.NumberFormat)、x数学値)を受け取り、整数 を返す。 この操作は、数値書式設定に従い x をスケーリングするべき指数(10のべき乗)を計算する。 たとえば 999 が丸めで 1000 になる場合など、異なる指数が必要となるケースも処理する。 呼び出し時に次の手順を行う:

  1. x = 0 なら、
    1. 0 を返す。
  2. x < 0 なら、
    1. x = -x に設定する。
  3. magnitudex の常用対数(base 10)を下方切捨てした 整数とする。
  4. exponentComputeExponentForMagnitude(numberFormat, magnitude) に設定する。
  5. xx × 10-exponent に設定する。
  6. formatNumberResultFormatNumericToString(numberFormat, x) に設定する。
  7. formatNumberResult.[[RoundedNumber]] = 0 なら、
    1. exponent を返す。
  8. newMagnitudeformatNumberResult.[[RoundedNumber]] の常用対数(base 10)を下方切捨てした 整数とする。
  9. newMagnitudemagnitude - exponent なら、
    1. exponent を返す。
  10. ComputeExponentForMagnitude(numberFormat, magnitude + 1) を返す。

16.5.14 ComputeExponentForMagnitude ( numberFormat, magnitude )

抽象操作 ComputeExponentForMagnitude は、引数 numberFormat(Intl.NumberFormat)、magnitude整数)を受け取り、整数 を返す。 この操作は、ロケールと指定された表記(scientific, engineering, compact)に従い、与えられた桁数の数値をスケーリングする指数(最上位桁の10のべき乗)を計算する。 呼び出し時に次の手順を行う:

  1. notationnumberFormat.[[Notation]] に設定する。
  2. notation"standard" なら、
    1. 0 を返す。
  3. それ以外で notation"scientific" なら、
    1. magnitude を返す。
  4. それ以外で notation"engineering" なら、
    1. thousandsmagnitude / 3 以下で最大の 整数に設定する。
    2. thousands × 3 を返す。
  5. それ以外、
    1. Assert: notation"compact" である。
    2. exponent を現在のロケールで compact notation 用に与えられた桁数をスケーリングするための ILD整数に設定する。
    3. exponent を返す。

16.5.15 実行時意味論: StringIntlMV

構文指向操作 StringIntlMV は引数を取らずに実行される。

StringNumericLiteral を Number 値に変換する処理は、NumericValue により NumericLiteral の数値を得る方法と全体的には似ているが、細部は異なる(12.9.3 参照)。

以下の生成式ごとに定義される:

StringNumericLiteral ::: StrWhiteSpaceopt
  1. 0 を返す。
StringNumericLiteral ::: StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
  1. StringIntlMVStrNumericLiteral に適用した結果を返す。
StrNumericLiteral ::: NonDecimalIntegerLiteral
  1. NonDecimalIntegerLiteral の MV を返す。
StrDecimalLiteral ::: - StrUnsignedDecimalLiteral
  1. aStringIntlMVStrUnsignedDecimalLiteral に適用した結果とする。
  2. a が 0 なら negative-zero を返す。
  3. apositive-infinity なら negative-infinity を返す。
  4. -a を返す。
StrUnsignedDecimalLiteral ::: Infinity
  1. positive-infinity を返す。
StrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigitsopt ExponentPartopt
  1. 最初の DecimalDigits の MV を a とする。
  2. 2つめの DecimalDigits が存在する場合、
    1. 2つめの DecimalDigits の MV を b とする。
    2. 2つめの DecimalDigits のコードポイント数を n とする。
  3. それ以外の場合、
    1. b を 0 に設定する。
    2. n を 0 に設定する。
  4. ExponentPart が存在すれば e をその MV、なければ e を 0 とする。
  5. (a + (b × 10-n)) × 10e を返す。
StrUnsignedDecimalLiteral ::: . DecimalDigits ExponentPartopt
  1. bDecimalDigits の MV とする。
  2. ExponentPart が存在すれば e をその MV、なければ e を 0 とする。
  3. nDecimalDigits のコードポイント数とする。
  4. b × 10e - n を返す。
StrUnsignedDecimalLiteral ::: DecimalDigits ExponentPartopt
  1. aDecimalDigits の MV とする。
  2. ExponentPart が存在すれば e をその MV、なければ e を 0 とする。
  3. a × 10e を返す。

16.5.16 ToIntlMathematicalValue ( value )

抽象操作 ToIntlMathematicalValue は、引数 valueECMAScript 言語値)を受け取り、正常完了値を含む Intl 数学値 または throw completion を返す。 valueIntl 数学値 に変換して返す。これは 数学値positive-infinitynegative-infinitynot-a-numbernegative-zero を含む型である。 この抽象操作は 7.1.3 に似ているが、Number や BigInt の代わりに厳密な10進数値を表す 数学値 を返すことができる。 呼び出し時に次の手順を行う:

  1. primValue を ? ToPrimitive(value, number) に設定する。
  2. primValueBigInt なら、(primValue) を返す。
  3. primValueString なら、
    1. strprimValue に設定する。
  4. それ以外の場合、
    1. x を ? ToNumber(primValue) に設定する。
    2. x-0𝔽 なら、negative-zero を返す。
    3. strNumber::toString(x, 10) に設定する。
  5. textStringToCodePoints(str) に設定する。
  6. literalParseText(text, StringNumericLiteral) に設定する。
  7. literalList のエラーなら、not-a-number を返す。
  8. intlMVStringIntlMVliteral に適用した結果とする。
  9. intlMV数学値 なら、
    1. roundedRoundMVResult(abs(intlMV)) に設定する。
    2. rounded+∞𝔽 かつ intlMV < 0 なら、negative-infinity を返す。
    3. rounded+∞𝔽 なら、positive-infinity を返す。
    4. rounded+0𝔽 かつ intlMV < 0 なら、negative-zero を返す。
    5. rounded+0𝔽 なら、0 を返す。
  10. intlMV を返す。

16.5.17 GetUnsignedRoundingMode ( roundingMode, sign )

抽象操作 GetUnsignedRoundingMode は、引数 roundingMode丸めモード)、signnegative または positive)を受け取り、表29 の Unsigned Rounding Mode 列の仕様型を返す。絶対値にどの 丸めモード を適用すれば、signnegative の場合は負、そうでない場合は正の符号付き値への roundingMode の適用と同じ結果になるかを返す。呼び出し時に次の手順を行う:

  1. roundingMode 列が roundingMode、Sign 列が sign の行で、Unsigned Rounding Mode 列の値を返す。
表29: 丸めモードから非符号付き丸めモードへの変換
識別子 符号 非符号付き丸めモード
"ceil" positive infinity
negative zero
"floor" positive zero
negative infinity
"expand" positive infinity
negative infinity
"trunc" positive zero
negative zero
"halfCeil" positive half-infinity
negative half-zero
"halfFloor" positive half-zero
negative half-infinity
"halfExpand" positive half-infinity
negative half-infinity
"halfTrunc" positive half-zero
negative half-zero
"halfEven" positive half-even
negative half-even

16.5.18 ApplyUnsignedRoundingMode ( x, r1, r2, unsignedRoundingMode )

抽象操作 ApplyUnsignedRoundingMode は、引数 x数学値)、r1数学値)、r2数学値)、unsignedRoundingMode表29のUnsigned Rounding Mode列の仕様型、またはundefined)を受け取り、数学値を返す。 x(下限 r1、上限 r2)を考慮し、unsignedRoundingMode に従い r1 または r2 を返す。呼び出し時に次の手順を行う:

  1. xr1 なら r1 を返す。
  2. Assert: r1 < x < r2
  3. Assert: unsignedRoundingModeundefined でない。
  4. unsignedRoundingModezero なら r1 を返す。
  5. unsignedRoundingModeinfinity なら r2 を返す。
  6. d1xr1 に設定する。
  7. d2r2x に設定する。
  8. d1 < d2 なら r1 を返す。
  9. d2 < d1 なら r2 を返す。
  10. Assert: d1d2
  11. unsignedRoundingModehalf-zero なら r1 を返す。
  12. unsignedRoundingModehalf-infinity なら r2 を返す。
  13. Assert: unsignedRoundingModehalf-even
  14. cardinality(r1 / (r2r1)) modulo 2 に設定する。
  15. cardinality が 0 なら r1 を返す。
  16. r2 を返す。

16.5.19 PartitionNumberRangePattern ( numberFormat, x, y )

抽象操作 PartitionNumberRangePattern は、引数 numberFormat(Intl.NumberFormat)、xIntl 数学値)、yIntl 数学値)を受け取り、正常完了値としてフィールド [[Type]](String)、[[Value]](String)、[[Source]](String)を持つ RecordList または throw completion を返す。 xy、および numberFormat のフォーマットオプションに従ってローカライズされた数値範囲のパーツを生成する。呼び出し時に次の手順を行う:

  1. xnot-a-number または ynot-a-number なら、RangeError 例外を投げる。
  2. xResultPartitionNumberPattern(numberFormat, x) に設定する。
  3. yResultPartitionNumberPattern(numberFormat, y) に設定する。
  4. FormatNumeric(numberFormat, x) が FormatNumeric(numberFormat, y) と等しい場合、
    1. appxResultFormatApproximately(numberFormat, xResult) に設定する。
    2. appxResult の各要素 r について、
      1. r.[[Source]]"shared" に設定する。
    3. appxResult を返す。
  5. result を新しい空の List に設定する。
  6. xResult の各要素 r について、
    1. Record { [[Type]]: r.[[Type]], [[Value]]: r.[[Value]], [[Source]]: "startRange" } を result に追加する。
  7. rangeSeparator を2つの数値を区切るための ILND の String に設定する。
  8. Record { [[Type]]: "literal", [[Value]]: rangeSeparator, [[Source]]: "shared" } を result に追加する。
  9. yResult の各要素 r について、
    1. Record { [[Type]]: r.[[Type]], [[Value]]: r.[[Value]], [[Source]]: "endRange" } を result に追加する。
  10. CollapseNumberRange(numberFormat, result) を返す。

16.5.20 FormatApproximately ( numberFormat, result )

抽象操作 FormatApproximately は、引数 numberFormat(Intl.NumberFormat)、result(フィールド [[Type]](String)、[[Value]](String)を持つ RecordList)を受け取り、フィールド [[Type]](String)、[[Value]](String)を持つ RecordList を返す。 この操作は resultPartitionNumberPattern に記述される Record の List でなければならない)に約記号の Record を追加して修正する。約記号は numberFormat に依存する場合がある。呼び出し時に次の手順を行う:

  1. approximatelySign を約数を表す ILND の String に設定する。
  2. approximatelySign が空でなければ、Record { [[Type]]: "approximatelySign", [[Value]]: approximatelySign } を ILND の index の result に挿入する。例えば、numberFormat[[Locale]]"en-US"[[NumberingSystem]]"latn"[[Style]]"decimal" の場合、新しい Record は result の最初の要素の前に挿入される場合がある。
  3. result を返す。

16.5.21 CollapseNumberRange ( numberFormat, result )

実装依存 抽象操作 CollapseNumberRange は、引数 numberFormat(Intl.NumberFormat)と result(フィールド [[Type]](String)、[[Value]](String)、[[Source]](String)を持つ RecordList)を受け取り、フィールド [[Type]](String)、[[Value]](String)、[[Source]](String)を持つ RecordList を返す。 この操作は result(必ず RecordListPartitionNumberRangePattern で構築されたもの)を有効ロケールおよび numberFormat の書式オプションに従って、冗長な情報の除去、内部矛盾の解消、必要に応じた文字の置換、必要に応じたスペースの挿入を行って修正する。その後、修正後の List を返す。 アルゴリズムは ILND だが、Intl.NumberFormat.prototype.formatRange ( start, end ) の引数に対し、もし常に result を修正せず返す単純な CollapseNumberRange 実装で等しくならない場合、等価な結果を返してはならない(曖昧性を導入してはならない)。

例えば、実装は範囲セパレータの後ろにある通貨記号の Record を除去して、results List "$3–$5""$3–5" に変換することができる。

また、実装は文法的正しさのために Record[[Value]] を修正してもよい。例えば、results List "0.5 miles–1 mile""0.5–1 miles" に変換することができる。

result を修正せず返すことは CollapseNumberRange の正しい実装として保証される。

16.5.22 FormatNumericRange ( numberFormat, x, y )

抽象操作 FormatNumericRange は、引数 numberFormat(Intl.NumberFormat)、xIntl 数学値)、yIntl 数学値)を受け取り、正常完了値として String または throw completion を返す。呼び出し時に次の手順を行う:

  1. parts を ? PartitionNumberRangePattern(numberFormat, x, y) に設定する。
  2. result を空文字列に設定する。
  3. parts の各要素 part について、
    1. resultresultpart.[[Value]]文字列連結に設定する。
  4. result を返す。

16.5.23 FormatNumericRangeToParts ( numberFormat, x, y )

抽象操作 FormatNumericRangeToParts は、引数 numberFormat(Intl.NumberFormat)、xIntl 数学値)、yIntl 数学値)を受け取り、正常完了値として Array または throw completion を返す。呼び出し時に次の手順を行う:

  1. parts を ? PartitionNumberRangePattern(numberFormat, x, y) に設定する。
  2. result を !ArrayCreate(0) に設定する。
  3. n を 0 に設定する。
  4. parts の各要素 part について、
    1. OOrdinaryObjectCreate(%Object.prototype%) に設定する。
    2. !CreateDataPropertyOrThrow(O, "type", part.[[Type]]) を実行する。
    3. !CreateDataPropertyOrThrow(O, "value", part.[[Value]]) を実行する。
    4. !CreateDataPropertyOrThrow(O, "source", part.[[Source]]) を実行する。
    5. !CreateDataPropertyOrThrow(result, !ToString(𝔽(n)), O) を実行する。
    6. n を 1 加算する。
  5. result を返す。

17 PluralRules オブジェクト

17.1 Intl.PluralRules コンストラクタ

Intl.PluralRules コンストラクタ

  • %Intl.PluralRules% である。
  • "PluralRules" プロパティの初期値は Intl オブジェクト である。

全ての サービスコンストラクタ プロパティの共通動作は Intl オブジェクト9.1 に記述されている。

17.1.1 Intl.PluralRules ( [ locales [ , options ] ] )

Intl.PluralRules 関数が省略可能な引数 localesoptions で呼び出された場合、次の手順を行う:

  1. NewTarget が undefined なら、TypeError 例外を投げる。
  2. pluralRules を ? OrdinaryCreateFromConstructor(NewTarget, "%Intl.PluralRules.prototype%", « [[InitializedPluralRules]], [[Locale]], [[Type]], [[Notation]], [[MinimumIntegerDigits]], [[MinimumFractionDigits]], [[MaximumFractionDigits]], [[MinimumSignificantDigits]], [[MaximumSignificantDigits]], [[RoundingType]], [[RoundingIncrement]], [[RoundingMode]], [[ComputedRoundingPriority]], [[TrailingZeroDisplay]] ») に設定する。
  3. optionsResolution を ? ResolveOptions(%Intl.PluralRules%, %Intl.PluralRules%.[[LocaleData]], locales, options, « coerce-options ») に設定する。
  4. optionsoptionsResolution.[[Options]] に設定する。
  5. roptionsResolution.[[ResolvedLocale]] に設定する。
  6. pluralRules.[[Locale]]r.[[Locale]] に設定する。
  7. t を ? GetOption(options, "type", string, « "cardinal", "ordinal" », "cardinal") に設定する。
  8. pluralRules.[[Type]]t に設定する。
  9. notation を ? GetOption(options, "notation", string, « "standard", "scientific", "engineering", "compact" », "standard") に設定する。
  10. pluralRules.[[Notation]]notation に設定する。
  11. ? SetNumberFormatDigitOptions(pluralRules, options, 0, 3, notation) を実行する。
  12. pluralRules を返す。

17.2 Intl.PluralRules コンストラクタのプロパティ

Intl.PluralRules コンストラクタ

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

17.2.1 Intl.PluralRules.prototype

Intl.PluralRules.prototype の値は %Intl.PluralRules.prototype% である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

17.2.2 Intl.PluralRules.supportedLocalesOf ( locales [ , options ] )

supportedLocalesOf メソッドが引数 locales および options で呼び出された場合、次の手順を行う:

  1. availableLocales%Intl.PluralRules%.[[AvailableLocales]] に設定する。
  2. requestedLocales を ? CanonicalizeLocaleList(locales) に設定する。
  3. ? FilterLocales(availableLocales, requestedLocales, options) を返す。

17.2.3 内部スロット

[[AvailableLocales]] 内部スロットの値は 実装依存であり、9.1に記述された制約の範囲内である。

[[RelevantExtensionKeys]] 内部スロットの値は « » である。

[[ResolutionOptionDescriptors]] 内部スロットの値は « » である。

注1
Unicode Technical Standard #35 Part 1 Core, Section 3.6.1 Key and Type Definitions では、複数形処理に関連するロケール拡張キーは記載されていない。

[[LocaleData]] 内部スロットの値は 実装依存であり、9.1に記述された制約の範囲内である。

注2
実装においては、Common Locale Data Repository(https://cldr.unicode.org/)で提供されるロケールデータの利用が推奨される。

17.3 Intl.PluralRules プロトタイプオブジェクトのプロパティ

Intl.PluralRules プロトタイプオブジェクト

  • %Intl.PluralRules.prototype% である。
  • 通常のオブジェクトである。
  • Intl.PluralRules のインスタンスではなく、[[InitializedPluralRules]] 内部スロットや Intl.PluralRules インスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

17.3.1 Intl.PluralRules.prototype.constructor

Intl.PluralRules.prototype.constructor の初期値は %Intl.PluralRules% である。

17.3.2 Intl.PluralRules.prototype.resolvedOptions ( )

この関数は、オブジェクトの初期化時に計算されたロケールとオプションへのアクセスを提供する。

  1. prthis の値とする。
  2. ? RequireInternalSlot(pr, [[InitializedPluralRules]]) を実行する。
  3. optionsOrdinaryObjectCreate(%Object.prototype%) に設定する。
  4. pluralCategoriesList の String で、選択したロケール pr.[[Locale]] に対する PluralRuleSelect の全ての可能な結果を含み、次の順序でソートされている:"zero", "one", "two", "few", "many", "other"
  5. 表30 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. p を現在の行の Property の値とする。
    2. p"pluralCategories" の場合、
      1. vCreateArrayFromList(pluralCategories) に設定する。
    3. それ以外の場合、
      1. v を現在の行の Internal Slot の値という名前を持つ pr の内部スロットの値とする。
    4. vundefined でない場合、
      1. 現在の行に Conversion 値がある場合、
        1. Assert:Conversion の値は number である。
        2. v𝔽(v) に設定する。
      2. ! CreateDataPropertyOrThrow(options, p, v) を実行する。
  6. options を返す。
表30: PluralRules インスタンスの解決済みオプション
内部スロット プロパティ 変換
[[Locale]] "locale"
[[Type]] "type"
[[Notation]] "notation"
[[MinimumIntegerDigits]] "minimumIntegerDigits" number
[[MinimumFractionDigits]] "minimumFractionDigits" number
[[MaximumFractionDigits]] "maximumFractionDigits" number
[[MinimumSignificantDigits]] "minimumSignificantDigits" number
[[MaximumSignificantDigits]] "maximumSignificantDigits" number
"pluralCategories"
[[RoundingIncrement]] "roundingIncrement" number
[[RoundingMode]] "roundingMode"
[[ComputedRoundingPriority]] "roundingPriority"
[[TrailingZeroDisplay]] "trailingZeroDisplay"

17.3.3 Intl.PluralRules.prototype.select ( value )

select メソッドが引数 value で呼び出された場合、次の手順を行う:

  1. prthis の値とする。
  2. ? RequireInternalSlot(pr, [[InitializedPluralRules]]) を実行する。
  3. n を ? ToNumber(value) に設定する。
  4. ResolvePlural(pr, n) の [[PluralCategory]] を返す。

17.3.4 Intl.PluralRules.prototype.selectRange ( start, end )

selectRange メソッドが引数 start および end で呼び出された場合、次の手順を行う:

  1. prthis の値とする。
  2. ? RequireInternalSlot(pr, [[InitializedPluralRules]]) を実行する。
  3. startundefined または endundefined なら、TypeError 例外を投げる。
  4. x を ? ToNumber(start) に設定する。
  5. y を ? ToNumber(end) に設定する。
  6. ? ResolvePluralRange(pr, x, y) を返す。

17.3.5 Intl.PluralRules.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "Intl.PluralRules" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

17.4 Intl.PluralRules インスタンスのプロパティ

Intl.PluralRules インスタンスは 通常のオブジェクトであり、%Intl.PluralRules.prototype% からプロパティを継承する。

Intl.PluralRules インスタンスは [[InitializedPluralRules]] 内部スロットを持つ。

Intl.PluralRules インスタンスはまた、Intl.PluralRules コンストラクタによって計算されるいくつかの内部スロットも持つ:

  • [[Locale]] は、複数形ルールに用いられるロケールのString値(その言語タグ)である。
  • [[Type]] は、"cardinal" または "ordinal" のいずれかの String 値であり、使用される複数形ルールを識別する。
  • [[Notation]] は、"standard""scientific""engineering""compact" のいずれかの String 値であり、使用される表記法を識別する。
  • [[MinimumIntegerDigits]] は、使用する最小の 整数桁数を示す非負の整数である。
  • [[MinimumFractionDigits]] および [[MaximumFractionDigits]] は、使用する最小および最大の 小数桁数を示す非負の整数である。必要に応じて丸められたり、末尾にゼロが付加される。
  • [[MinimumSignificantDigits]] および [[MaximumSignificantDigits]] は、使用する最小および最大の 有効桁数を示す正の整数である。これらが両方とも存在する場合は、最小・最大の 整数および小数桁より優先される。
  • [[RoundingType]]fraction-digitssignificant-digitsmore-precisionless-precision のいずれかであり、どの丸め方式を使うかを示す(詳細は 16.4 を参照)。
  • [[ComputedRoundingPriority]]"auto""morePrecision""lessPrecision" のいずれかの String 値であり、17.3.2[[RoundingType]] を有効な "roundingPriority" オプションに変換するのに使われる。
  • [[RoundingIncrement]] は 10、100、1000、10000 を10分割・5分割・4分割・2分割する整数であり、丸めの単位を決定する。例えば [[MaximumFractionDigits]] が2で [[RoundingIncrement]] が5なら、最も近い0.05(ニッケル丸め)に丸める。
  • [[RoundingMode]] は使用する 丸めモード を識別する。
  • [[TrailingZeroDisplay]]"auto" または "stripIfInteger" のいずれかの String 値であり、書式化した値が整数(小数桁がすべて0)なら末尾のゼロを除去するかどうかを示す。

17.5 PluralRules オブジェクトの抽象操作

17.5.1 PluralRuleSelect ( locale, type, notation, s )

実装依存 抽象操作 PluralRuleSelect は引数 locale言語タグ)、type"cardinal" または "ordinal")、notation(String)、s(10進文字列)を受け取り、"zero""one""two""few""many"、または "other" を返す。返される文字列は localetypenotation に従い s の複数形カテゴリを特徴づける。

17.5.2 ResolvePlural ( pluralRules, n )

抽象操作 ResolvePlural は、引数 pluralRules(Intl.PluralRules)、n(Number)を受け取り、フィールド [[PluralCategory]]"zero""one""two""few""many""other")および [[FormattedString]](String)を持つ Record を返す。返される Record は、n を有効ロケールおよび pluralRules のオプションに従い説明する2つの文字列フィールドを持つ:[[PluralCategory]] はその 複数形カテゴリ を特徴づけ、[[FormattedString]] は書式化表現を含む。呼び出し時に次の手順を行う:

  1. n有限 Number でない場合、
    1. s を ! ToString(n) に設定する。
    2. Record { [[PluralCategory]]: "other", [[FormattedString]]: s } を返す。
  2. resFormatNumericToString(pluralRules, (n)) に設定する。
  3. sres.[[FormattedString]] に設定する。
  4. localepluralRules.[[Locale]] に設定する。
  5. typepluralRules.[[Type]] に設定する。
  6. notationpluralRules.[[Notation]] に設定する。
  7. pPluralRuleSelect(locale, type, notation, s) に設定する。
  8. Record { [[PluralCategory]]: p, [[FormattedString]]: s } を返す。

17.5.3 PluralRuleSelectRange ( locale, type, notation, xp, yp )

実装依存 抽象操作 PluralRuleSelectRange は引数 locale(String)、type"cardinal" または "ordinal")、notation(String)、xp"zero""one""two""few""many"、または "other")、yp(同上)を受け取り、"zero""one""two""few""many"、または "other" を返す。これは、範囲の開始と終了を特徴づける複数形カテゴリ文字列 xpyp を、対応する localetypenotation に対する範囲全体の複数形解決文字列にマッピングする実装依存のアルゴリズムである。該当しない場合は "other" を返す。

17.5.4 ResolvePluralRange ( pluralRules, x, y )

抽象操作 ResolvePluralRange は、引数 pluralRules(Intl.PluralRules)、x(Number)、y(Number)を受け取り、正常完了値として "zero""one""two""few""many"、または "other"、または throw completion を返す。返される文字列値は、有効ロケールおよび pluralRules のオプションに従い、x から y までの範囲の複数形を表す。呼び出し時に次の手順を行う:

  1. xNaN または yNaN なら、RangeError 例外を投げる。
  2. xpResolvePlural(pluralRules, x) に設定する。
  3. ypResolvePlural(pluralRules, y) に設定する。
  4. xp.[[FormattedString]]yp.[[FormattedString]] なら、
    1. xp.[[PluralCategory]] を返す。
  5. localepluralRules.[[Locale]] に設定する。
  6. typepluralRules.[[Type]] に設定する。
  7. notationpluralRules.[[Notation]] に設定する。
  8. PluralRuleSelectRange(locale, type, notation, xp.[[PluralCategory]], yp.[[PluralCategory]]) を返す。

18 RelativeTimeFormat オブジェクト

18.1 Intl.RelativeTimeFormat コンストラクタ

Intl.RelativeTimeFormat コンストラクタ

  • %Intl.RelativeTimeFormat% である。
  • "RelativeTimeFormat" プロパティの初期値は Intl オブジェクト である。

サービスコンストラクタ に共通の動作は、Intl オブジェクト9.1 に規定されている。

18.1.1 Intl.RelativeTimeFormat ( [ locales [ , options ] ] )

Intl.RelativeTimeFormat 関数が省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. NewTarget が undefined なら、TypeError 例外を投げる。
  2. relativeTimeFormat を ? OrdinaryCreateFromConstructor(NewTarget, "%Intl.RelativeTimeFormat.prototype%", « [[InitializedRelativeTimeFormat]], [[Locale]], [[LocaleData]], [[Style]], [[Numeric]], [[NumberFormat]], [[NumberingSystem]], [[PluralRules]] ») に設定する。
  3. optionsResolution を ? ResolveOptions(%Intl.RelativeTimeFormat%, %Intl.RelativeTimeFormat%.[[LocaleData]], locales, options, « coerce-options ») に設定する。
  4. optionsoptionsResolution.[[Options]] に設定する。
  5. roptionsResolution.[[ResolvedLocale]] に設定する。
  6. localer.[[Locale]] に設定する。
  7. relativeTimeFormat.[[Locale]]locale に設定する。
  8. relativeTimeFormat.[[LocaleData]]r.[[LocaleData]] に設定する。
  9. relativeTimeFormat.[[NumberingSystem]]r.[[nu]] に設定する。
  10. style を ? GetOption(options, "style", string, « "long", "short", "narrow" », "long") に設定する。
  11. relativeTimeFormat.[[Style]]style に設定する。
  12. numeric を ? GetOption(options, "numeric", string, « "always", "auto" », "always") に設定する。
  13. relativeTimeFormat.[[Numeric]]numeric に設定する。
  14. nfOptionsOrdinaryObjectCreate(null) に設定する。
  15. CreateDataPropertyOrThrow(nfOptions, "numberingSystem", relativeTimeFormat.[[NumberingSystem]]) を実行する。
  16. relativeTimeFormat.[[NumberFormat]] を ! Construct(%Intl.NumberFormat%, « locale, nfOptions ») に設定する。
  17. relativeTimeFormat.[[PluralRules]] を ! Construct(%Intl.PluralRules%, « locale ») に設定する。
  18. relativeTimeFormat を返す。

18.2 Intl.RelativeTimeFormat コンストラクタのプロパティ

Intl.RelativeTimeFormat コンストラクタ

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 次のプロパティを持つ:

18.2.1 Intl.RelativeTimeFormat.prototype

Intl.RelativeTimeFormat.prototype の値は %Intl.RelativeTimeFormat.prototype% である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

18.2.2 Intl.RelativeTimeFormat.supportedLocalesOf ( locales [ , options ] )

supportedLocalesOf メソッドが引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. availableLocales%Intl.RelativeTimeFormat%.[[AvailableLocales]] に設定する。
  2. requestedLocales を ? CanonicalizeLocaleList(locales) に設定する。
  3. FilterLocales(availableLocales, requestedLocales, options) を返す。

18.2.3 内部スロット

[[AvailableLocales]] 内部スロットの値は 実装依存 であり、9.1 に記述された制約の範囲内である。

[[RelevantExtensionKeys]] 内部スロットの値は « "nu" » である。

[[ResolutionOptionDescriptors]] 内部スロットの値は « { [[Key]]: "nu", [[Property]]: "numberingSystem" } » である。

注1
Unicode Technical Standard #35 Part 1 Core, Section 3.6.1 Key and Type Definitions は、相対時刻の書式設定に関連するロケール拡張キーとして、整形される数値の番号体系を表す "nu" を記述している。

[[LocaleData]] 内部スロットの値は 実装依存 であり、9.1 に記述された制約および以下の追加制約の範囲内である(すべてのロケール値 locale に対して):

  • [[LocaleData]].[[<locale>]] はフィールド "second""minute""hour""day""week""month""quarter""year" を持つ。これらの名称に "-narrow" または "-short" を連結した追加フィールドが存在してもよい。これらのフィールドに対応する値は、次の2種類のフィールドを含む Record である:
    • "future" および "past" フィールドで、locale に関連する複数形カテゴリごとにフィールドを持つ Record。それらのフィールドに対応する値は、書式化された数値で置き換える "{0}" を含み得るパターンである。
    • 任意で、キーが Number の ToString の結果であり、値がテンプレートとして扱われないリテラル文字列である追加フィールド。
  • [[LocaleData]] の任意のロケールフィールドにおける "nu" フィールドの値である List は、"native""traditio""finance" を含んではならない。
注2
実装においては、Common Locale Data Repository(https://cldr.unicode.org/)で提供されるロケールデータの利用が推奨される。

18.3 Intl.RelativeTimeFormat プロトタイプオブジェクトのプロパティ

Intl.RelativeTimeFormat プロトタイプオブジェクト

  • %Intl.RelativeTimeFormat.prototype% である。
  • 通常のオブジェクトである。
  • Intl.RelativeTimeFormat インスタンスではなく、[[InitializedRelativeTimeFormat]] 内部スロットや Intl.RelativeTimeFormat インスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

18.3.1 Intl.RelativeTimeFormat.prototype.constructor

Intl.RelativeTimeFormat.prototype.constructor の初期値は %Intl.RelativeTimeFormat% である。

18.3.2 Intl.RelativeTimeFormat.prototype.resolvedOptions ( )

この関数は、オブジェクトの初期化時に計算されたロケールとオプションへのアクセスを提供する。

  1. relativeTimeFormatthis の値とする。
  2. RequireInternalSlot(relativeTimeFormat, [[InitializedRelativeTimeFormat]]) を実行する。
  3. optionsOrdinaryObjectCreate(%Object.prototype%) に設定する。
  4. 表31 のヘッダー行を除く各行について、表の順序で次を行う:
    1. p を現在の行の Property の値とする。
    2. v を、現在の行の Internal Slot の値という名前を持つ relativeTimeFormat の内部スロットの値とする。
    3. Assert: vundefined ではない。
    4. CreateDataPropertyOrThrow(options, p, v) を実行する。
  5. options を返す。
表31: RelativeTimeFormat インスタンスの解決済みオプション
内部スロット プロパティ
[[Locale]] "locale"
[[Style]] "style"
[[Numeric]] "numeric"
[[NumberingSystem]] "numberingSystem"

18.3.3 Intl.RelativeTimeFormat.prototype.format ( value, unit )

format メソッドが引数 valueunit で呼び出されたとき、次の手順を行う:

  1. relativeTimeFormatthis の値とする。
  2. RequireInternalSlot(relativeTimeFormat, [[InitializedRelativeTimeFormat]]) を実行する。
  3. value を ? ToNumber(value) に設定する。
  4. unit を ? ToString(unit) に設定する。
  5. FormatRelativeTime(relativeTimeFormat, value, unit) を返す。

18.3.4 Intl.RelativeTimeFormat.prototype.formatToParts ( value, unit )

formatToParts メソッドが引数 valueunit で呼び出されたとき、次の手順を行う:

  1. relativeTimeFormatthis の値とする。
  2. RequireInternalSlot(relativeTimeFormat, [[InitializedRelativeTimeFormat]]) を実行する。
  3. value を ? ToNumber(value) に設定する。
  4. unit を ? ToString(unit) に設定する。
  5. FormatRelativeTimeToParts(relativeTimeFormat, value, unit) を返す。

18.3.5 Intl.RelativeTimeFormat.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "Intl.RelativeTimeFormat" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

18.4 Intl.RelativeTimeFormat インスタンスのプロパティ

Intl.RelativeTimeFormat インスタンスは 通常のオブジェクトであり、%Intl.RelativeTimeFormat.prototype% からプロパティを継承する。

Intl.RelativeTimeFormat インスタンスは [[InitializedRelativeTimeFormat]] 内部スロットを持つ。

Intl.RelativeTimeFormat インスタンスはまた、Intl.RelativeTimeFormat コンストラクタによって計算されるいくつかの内部スロットも持つ:

  • [[Locale]] は、書式設定に用いられるロケールの String 値(その 言語タグ)である。
  • [[LocaleData]] は、実装が書式設定に使用できるデータを表す Record である。これは、%Intl.RelativeTimeFormat%.[[LocaleData]] のエントリの値で、[[Locale]] の値またはその接頭辞に対応する。
  • [[Style]] は、使用される相対時刻フォーマットスタイルを識別する "long""short""narrow" のいずれかの String 値である。
  • [[Numeric]] は、より具体的な表現が利用できない場合にのみ数値表現を使用するか(例:"yesterday" ではなく "1 day ago")、常に使用するかを識別する "always" または "auto" のいずれかの String 値である。
  • [[NumberFormat]] は、書式化に使用される Intl.NumberFormat オブジェクトである。
  • [[NumberingSystem]] は、書式化に使用される Unicode Number System Identifier を表す String 値である。
  • [[PluralRules]] は、書式化に使用される Intl.PluralRules オブジェクトである。

18.5 RelativeTimeFormat オブジェクトの抽象操作

18.5.1 SingularRelativeTimeUnit ( unit )

抽象操作 SingularRelativeTimeUnit は引数 unit(String)を取り、正常完了値として String を返すか、または throw completion を返す。呼び出し時に次の手順を行う:

  1. unit"seconds" なら "second" を返す。
  2. unit"minutes" なら "minute" を返す。
  3. unit"hours" なら "hour" を返す。
  4. unit"days" なら "day" を返す。
  5. unit"weeks" なら "week" を返す。
  6. unit"months" なら "month" を返す。
  7. unit"quarters" なら "quarter" を返す。
  8. unit"years" なら "year" を返す。
  9. unit"second""minute""hour""day""week""month""quarter""year" のいずれでもないなら、RangeError 例外を投げる。
  10. unit を返す。

18.5.2 PartitionRelativeTimePattern ( relativeTimeFormat, value, unit )

抽象操作 PartitionRelativeTimePattern は引数 relativeTimeFormat(Intl.RelativeTimeFormat)、value(Number)、unit(String)を取り、正常完了値として RecordList(フィールド [[Type]](String)、[[Value]](String)、[[Unit]](String または empty)を持つ)を返すか、throw completion を返す。返される List は、有効ロケールおよび relativeTimeFormat の書式オプションに従って value を表現する。呼び出し時に次の手順を行う:

  1. valueNaN+∞𝔽、または -∞𝔽 なら、RangeError 例外を投げる。
  2. unit を ? SingularRelativeTimeUnit(unit) に設定する。
  3. fieldsrelativeTimeFormat.[[LocaleData]] に設定する。
  4. patternsfields.[[<unit>]] に設定する。
  5. stylerelativeTimeFormat.[[Style]] に設定する。
  6. style"short" または "narrow" なら、
    1. keyunit"-"style文字列連結とする。
    2. fields がフィールド [[<key>]] を持つなら、 patternsfields.[[<key>]] に設定する。
  7. relativeTimeFormat.[[Numeric]]"auto" なら、
    1. valueString を ! ToString(value) に設定する。
    2. patterns がフィールド [[<valueString>]] を持つなら、
      1. resultpatterns.[[<valueString>]] に設定する。
      2. Record { [[Type]]: "literal", [[Value]]: result, [[Unit]]: empty } を含む List を返す。
  8. value-0𝔽 か、または value < -0𝔽 なら、
    1. tl"past" とする。
  9. それ以外の場合、
    1. tl"future" とする。
  10. popatterns.[[<tl>]] とする。
  11. fvPartitionNumberPattern(relativeTimeFormat.[[NumberFormat]], (value)) とする。
  12. prResolvePlural(relativeTimeFormat.[[PluralRules]], value).[[PluralCategory]] とする。
  13. patternpo.[[<pr>]] とする。
  14. MakePartsList(pattern, unit, fv) を返す。

18.5.3 MakePartsList ( pattern, unit, parts )

抽象操作 MakePartsList は、引数 patternパターン文字列)、unit(String)、parts(書式化済み Number を表す RecordList)を取り、フィールド [[Type]](String)、[[Value]](String)、[[Unit]](String または empty)を持つ RecordList を返す。呼び出し時に次の手順を行う:

  1. patternPartsPartitionPattern(pattern) に設定する。
  2. result を新しい空の List に設定する。
  3. patternParts の各 Record { [[Type]], [[Value]] } patternPart について、
    1. patternPart.[[Type]]"literal" なら、
      1. Record { [[Type]]: "literal", [[Value]]: patternPart.[[Value]], [[Unit]]: empty } を result に追加する。
    2. それ以外の場合、
      1. Assert: patternPart.[[Type]]"0" である。
      2. parts の各 Record { [[Type]], [[Value]] } part について、
        1. Record { [[Type]]: part.[[Type]], [[Value]]: part.[[Value]], [[Unit]]: unit } を result に追加する。
  4. result を返す。
例:
  1. MakePartsList("AA{0}BB", "hour", « Record { [[Type]]: "integer", [[Value]]: "15" } ») を返す。
これは次のような RecordList を返す: « { [[Type]]: "literal", [[Value]]: "AA", [[Unit]]: empty}, { [[Type]]: "integer", [[Value]]: "15", [[Unit]]: "hour"}, { [[Type]]: "literal", [[Value]]: "BB", [[Unit]]: empty} »

18.5.4 FormatRelativeTime ( relativeTimeFormat, value, unit )

抽象操作 FormatRelativeTime は引数 relativeTimeFormat(Intl.RelativeTimeFormat)、value(Number)、unit(String)を取り、正常完了値として String を返すか、throw completion を返す。呼び出し時に次の手順を行う:

  1. parts を ? PartitionRelativeTimePattern(relativeTimeFormat, value, unit) に設定する。
  2. result を空文字列に設定する。
  3. parts の各 Record { [[Type]], [[Value]], [[Unit]] } part について、
    1. resultresultpart.[[Value]]文字列連結に設定する。
  4. result を返す。

18.5.5 FormatRelativeTimeToParts ( relativeTimeFormat, value, unit )

抽象操作 FormatRelativeTimeToParts は引数 relativeTimeFormat(Intl.RelativeTimeFormat)、value(Number)、unit(String)を取り、正常完了値として Array を返すか、throw completion を返す。呼び出し時に次の手順を行う:

  1. parts を ? PartitionRelativeTimePattern(relativeTimeFormat, value, unit) に設定する。
  2. result を ! ArrayCreate(0) に設定する。
  3. n を 0 に設定する。
  4. parts の各 Record { [[Type]], [[Value]], [[Unit]] } part について、
    1. OOrdinaryObjectCreate(%Object.prototype%) に設定する。
    2. CreateDataPropertyOrThrow(O, "type", part.[[Type]]) を実行する。
    3. CreateDataPropertyOrThrow(O, "value", part.[[Value]]) を実行する。
    4. part.[[Unit]]empty でないなら、
      1. CreateDataPropertyOrThrow(O, "unit", part.[[Unit]]) を実行する。
    5. CreateDataPropertyOrThrow(result, ! ToString(𝔽(n)), O) を実行する。
    6. n を 1 増やす。
  5. result を返す。

19 Segmenter オブジェクト

19.1 Intl.Segmenter コンストラクタ

Intl.Segmenter コンストラクタ

サービスコンストラクタ プロパティに共通の挙動は、Intl オブジェクト9.1 に規定される。

19.1.1 Intl.Segmenter ( [ locales [ , options ] ] )

Intl.Segmenter 関数が省略可能な引数 locales および options とともに呼び出されたとき、次の手順を行う:

  1. NewTarget が undefined なら、TypeError 例外を投げる。
  2. internalSlotsList を « [[InitializedSegmenter]], [[Locale]], [[SegmenterGranularity]] » に設定する。
  3. segmenter を ? OrdinaryCreateFromConstructor(NewTarget, "%Intl.Segmenter.prototype%", internalSlotsList) に設定する。
  4. optionsResolution を ? ResolveOptions(%Intl.Segmenter%, %Intl.Segmenter%.[[LocaleData]], locales, options) に設定する。
  5. optionsoptionsResolution.[[Options]] に設定する。
  6. roptionsResolution.[[ResolvedLocale]] に設定する。
  7. segmenter.[[Locale]]r.[[Locale]] に設定する。
  8. granularity を ? GetOption(options, "granularity", string, « "grapheme", "word", "sentence" », "grapheme") に設定する。
  9. segmenter.[[SegmenterGranularity]]granularity に設定する。
  10. segmenter を返す。

19.2 Intl.Segmenter コンストラクタのプロパティ

Intl.Segmenter コンストラクタ

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 次のプロパティを持つ:

19.2.1 Intl.Segmenter.prototype

Intl.Segmenter.prototype の値は %Intl.Segmenter.prototype% である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

19.2.2 Intl.Segmenter.supportedLocalesOf ( locales [ , options ] )

supportedLocalesOf メソッドが引数 locales および options で呼び出されたとき、次の手順を行う:

  1. availableLocales%Intl.Segmenter%.[[AvailableLocales]] に設定する。
  2. requestedLocales を ? CanonicalizeLocaleList(locales) に設定する。
  3. ? FilterLocales(availableLocales, requestedLocales, options) を返す。

19.2.3 内部スロット

[[AvailableLocales]] 内部スロットの値は 実装依存 であり、9.1 に記述された制約の範囲内である。

[[RelevantExtensionKeys]] 内部スロットの値は « » である。

[[ResolutionOptionDescriptors]] 内部スロットの値は « » である。

Intl.Segmenter には関連する拡張キーは存在しない。

[[LocaleData]] 内部スロットの値は 実装依存 であり、9.1 に記述された制約の範囲内である。

19.3 Intl.Segmenter プロトタイプオブジェクトのプロパティ

Intl.Segmenter プロトタイプオブジェクト

  • %Intl.Segmenter.prototype% である。
  • 通常のオブジェクトである。
  • Intl.Segmenter インスタンスではなく、[[InitializedSegmenter]] 内部スロットや Intl.Segmenter インスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

19.3.1 Intl.Segmenter.prototype.constructor

Intl.Segmenter.prototype.constructor の初期値は %Intl.Segmenter% である。

19.3.2 Intl.Segmenter.prototype.resolvedOptions ( )

この関数は、オブジェクトの初期化時に計算されたロケールとオプションへのアクセスを提供する。

  1. segmenterthis の値とする。
  2. ? RequireInternalSlot(segmenter, [[InitializedSegmenter]]) を実行する。
  3. optionsOrdinaryObjectCreate(%Object.prototype%) に設定する。
  4. 表32 の各行(ヘッダー行を除く)について、表の順序で次を行う:
    1. p を現在の行の Property の値とする。
    2. v を現在の行の Internal Slot の値という名前を持つ segmenter の内部スロットの値とする。
    3. Assert: vundefined ではない。
    4. ! CreateDataPropertyOrThrow(options, p, v) を実行する。
  5. options を返す。
表32: Segmenter インスタンスの解決済みオプション
内部スロット プロパティ
[[Locale]] "locale"
[[SegmenterGranularity]] "granularity"

19.3.3 Intl.Segmenter.prototype.segment ( string )

Intl.Segmenter.prototype.segment メソッドは、Intl.Segmenter インスタンス上で引数 string とともに呼び出され、当該 Intl.Segmenter インスタンスのロケールとオプションを用いて、その文字列に対する Segments インスタンス を作成する。次の手順を行う:

  1. segmenterthis の値とする。
  2. ? RequireInternalSlot(segmenter, [[InitializedSegmenter]]) を実行する。
  3. string を ? ToString(string) に設定する。
  4. CreateSegmentsObject(segmenter, string) を返す。

19.3.4 Intl.Segmenter.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "Intl.Segmenter" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

19.4 Intl.Segmenter インスタンスのプロパティ

Intl.Segmenter インスタンスは 通常のオブジェクトであり、%Intl.Segmenter.prototype% からプロパティを継承する。

Intl.Segmenter インスタンスは [[InitializedSegmenter]] 内部スロットを持つ。

Intl.Segmenter インスタンスはまた、Intl.Segmenter コンストラクタによって計算される内部スロットも持つ:

  • [[Locale]] は、分割に用いられるロケールの String 値(その 言語タグ)である。
  • [[SegmenterGranularity]] は、分割するテキスト要素の種類を識別する "grapheme""word""sentence" のいずれかの String 値である。

19.5 Segments オブジェクト

Segments インスタンスは、特定の文字列の分割結果を表すオブジェクトであり、その作成元の Intl.Segmenter インスタンスのロケールおよびオプションに従う。

19.5.1 CreateSegmentsObject ( segmenter, string )

抽象操作 CreateSegmentsObject は引数 segmenter(Intl.Segmenter)および string(String)を受け取り、Segments インスタンス を返す。Segments インスタンスsegmenterstring を参照する。呼び出し時に次の手順を行う:

  1. internalSlotsList を « [[SegmentsSegmenter]], [[SegmentsString]] » に設定する。
  2. segmentsOrdinaryObjectCreate(%IntlSegmentsPrototype%, internalSlotsList) に設定する。
  3. segments.[[SegmentsSegmenter]]segmenter に設定する。
  4. segments.[[SegmentsString]]string に設定する。
  5. segments を返す。

19.5.2 %IntlSegmentsPrototype% オブジェクト

%IntlSegmentsPrototype% オブジェクト:

  • すべての Segments オブジェクトのプロトタイプである。
  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。
  • 次のプロパティを持つ:

19.5.2.1 %IntlSegmentsPrototype%.containing ( index )

containing メソッドは、Segments インスタンス 上で引数 index とともに呼び出され、指定されたインデックスのコードユニットを含む文字列内のセグメントを記述する Segment Data オブジェクト を、当該 Segments インスタンスの作成元 Intl.Segmenter インスタンスのロケールとオプションに従って返す。次の手順を行う:

  1. segmentsthis の値とする。
  2. ? RequireInternalSlot(segments, [[SegmentsSegmenter]]) を実行する。
  3. segmentersegments.[[SegmentsSegmenter]] に設定する。
  4. stringsegments.[[SegmentsString]] に設定する。
  5. lenstring の長さに設定する。
  6. n を ? ToIntegerOrInfinity(index) に設定する。
  7. n < 0 または nlen なら、undefined を返す。
  8. startIndexFindBoundary(segmenter, string, n, before) に設定する。
  9. endIndexFindBoundary(segmenter, string, n, after) に設定する。
  10. CreateSegmentDataObject(segmenter, string, startIndex, endIndex) を返す。

19.5.2.2 %IntlSegmentsPrototype% [ %Symbol.iterator% ] ( )

%Symbol.iterator% メソッドは、Segments インスタンス 上で呼び出され、その作成元 Intl.Segmenter インスタンスのロケールとオプションを用いて、当該文字列に対する Segment Iterator を作成する。次の手順を行う:

  1. segmentsthis の値とする。
  2. ? RequireInternalSlot(segments, [[SegmentsSegmenter]]) を実行する。
  3. segmentersegments.[[SegmentsSegmenter]] に設定する。
  4. stringsegments.[[SegmentsString]] に設定する。
  5. CreateSegmentIterator(segmenter, string) を返す。

この関数の "name" プロパティの値は "[Symbol.iterator]" である。

19.5.3 Segments インスタンスのプロパティ

Segments インスタンスは 通常のオブジェクトであり、%IntlSegmentsPrototype% からプロパティを継承する。

Segments インスタンスは、反復に用いられた作成元 Intl.Segmenter インスタンスを参照する [[SegmentsSegmenter]] 内部スロットを持つ。

Segments インスタンスは、セグメントを公開する対象の String 値を参照する [[SegmentsString]] 内部スロットを持つ。

19.6 Segment Iterator オブジェクト

Segment Iterator は、特定の文字列のセグメントに対する特定の反復を表すオブジェクトである。

19.6.1 CreateSegmentIterator ( segmenter, string )

抽象操作 CreateSegmentIterator は引数 segmenter(Intl.Segmenter)および string(String)を受け取り、Segment Iterator を返す。Segment Iteratorsegmenter のロケールとオプションを用いて string を反復する。呼び出し時に次の手順を行う:

  1. internalSlotsList を « [[IteratingSegmenter]], [[IteratedString]], [[IteratedStringNextSegmentCodeUnitIndex]] » に設定する。
  2. iteratorOrdinaryObjectCreate(%IntlSegmentIteratorPrototype%, internalSlotsList) に設定する。
  3. iterator.[[IteratingSegmenter]]segmenter に設定する。
  4. iterator.[[IteratedString]]string に設定する。
  5. iterator.[[IteratedStringNextSegmentCodeUnitIndex]] を 0 に設定する。
  6. iterator を返す。

19.6.2 %IntlSegmentIteratorPrototype% オブジェクト

%IntlSegmentIteratorPrototype% オブジェクト:

19.6.2.1 %IntlSegmentIteratorPrototype%.next ( )

next メソッドは、Segment Iterator インスタンス上で呼び出され、1 セグメント先に進め、反復が完了したことを宣言するか新しいセグメントを記述する IteratorResult オブジェクトを返す。次の手順を行う:

  1. iteratorthis の値とする。
  2. ? RequireInternalSlot(iterator, [[IteratingSegmenter]]) を実行する。
  3. segmenteriterator.[[IteratingSegmenter]] に設定する。
  4. stringiterator.[[IteratedString]] に設定する。
  5. startIndexiterator.[[IteratedStringNextSegmentCodeUnitIndex]] に設定する。
  6. lenstring の長さに設定する。
  7. startIndexlen なら、
    1. CreateIteratorResultObject(undefined, true) を返す。
  8. endIndexFindBoundary(segmenter, string, startIndex, after) に設定する。
  9. iterator.[[IteratedStringNextSegmentCodeUnitIndex]]endIndex に設定する。
  10. segmentDataCreateSegmentDataObject(segmenter, string, startIndex, endIndex) に設定する。
  11. CreateIteratorResultObject(segmentData, false) を返す。

19.6.2.2 %IntlSegmentIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "Segmenter String Iterator" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

19.6.3 Segment Iterator インスタンスのプロパティ

Segment Iterator インスタンスは 通常のオブジェクトであり、%SegmentIteratorPrototype% からプロパティを継承する。Segment Iterator インスタンスは、表33 に記述の内部スロットを持って初期化される。

表33: Segment Iterator インスタンスの内部スロット
内部スロット 説明
[[IteratingSegmenter]] 反復に使用される Intl.Segmenter インスタンス。
[[IteratedString]] 反復対象の String 値。
[[IteratedStringNextSegmentCodeUnitIndex]] 次のセグメントの開始時点における、反復対象 String 値のコードユニットのインデックス。

19.7 Segment Data オブジェクト

Segment Data オブジェクトは、文字列からの特定のセグメントを表すオブジェクトである。

19.7.1 CreateSegmentDataObject ( segmenter, string, startIndex, endIndex )

抽象操作 CreateSegmentDataObject は引数 segmenter(Intl.Segmenter)、string(String)、startIndex(非負の 整数)、endIndex(非負の 整数)を受け取り、Segment Data オブジェクト を返す。Segment Data オブジェクト は、segmenter により決定される string 内の、インデックス startIndexendIndex により境界付けられるセグメントを記述する。呼び出し時に次の手順を行う:

  1. lenstring の長さに設定する。
  2. Assert: endIndexlen
  3. Assert: startIndex < endIndex
  4. resultOrdinaryObjectCreate(%Object.prototype%) に設定する。
  5. segmentstringsubstringstartIndex から endIndex)に設定する。
  6. ! CreateDataPropertyOrThrow(result, "segment", segment) を実行する。
  7. ! CreateDataPropertyOrThrow(result, "index", 𝔽(startIndex)) を実行する。
  8. ! CreateDataPropertyOrThrow(result, "input", string) を実行する。
  9. granularitysegmenter.[[SegmenterGranularity]] に設定する。
  10. granularity"word" なら、
    1. isWordLike を、ロケール segmenter.[[Locale]] に従って string 内の segment が「語らしさ」を持つかどうかを示す Boolean 値に設定する。
    2. ! CreateDataPropertyOrThrow(result, "isWordLike", isWordLike) を実行する。
  11. result を返す。
セグメントが「語らしい」かどうかは実装依存であり、実装はロケールに応じた調整を用いることが推奨される。一般に、空白および/または句読点のみから成るセグメント(ICU [International Components for Unicode,https://unicode-org.github.io/icu-docs/ 参照] における "WORD_NONE" 境界で終端されるものなど)は「語らしい」とは見なされない。

19.8 Segmenter オブジェクトの抽象操作

19.8.1 FindBoundary ( segmenter, string, startIndex, direction )

抽象操作 FindBoundary は引数 segmenter(Intl.Segmenter)、string(String)、startIndex(非負の 整数)、directionbefore または after)を受け取り、非負の 整数 を返す。指定された direction に従って、segmenter のロケールとオプションに基づき、string 内の startIndex のコードユニットからのセグメント境界を探索し、その直後のコードユニットのインデックスを返す。呼び出し時に次の手順を行う:

  1. lenstring の長さに設定する。
  2. Assert: startIndex < len
  3. localesegmenter.[[Locale]] に設定する。
  4. granularitysegmenter.[[SegmenterGranularity]] に設定する。
  5. directionbefore なら、
    1. ロケール locale とテキスト要素の粒度 granularity を用いて、string の先頭から高々 startIndex 個のコードユニットで前置される最後のセグメント境界を検索する。
    2. 境界が見つかったら、string 内でそれに先行するコードユニットの個数を返す。
    3. 0 を返す。
  6. Assert: directionafter である。
  7. ロケール locale とテキスト要素の粒度 granularity を用いて、インデックス startIndex のコードユニットに続く最初のセグメント境界を string 中から検索する。
  8. 境界が見つかったら、string 内でそれに先行するコードユニットの個数を返す。
  9. len を返す。
境界の決定は実装依存だが、一般的な既定アルゴリズムは Unicode Standard Annex #29 に規定されている。実装においては、Common Locale Data Repository(https://cldr.unicode.org)が提供するロケールに応じた調整を用いることが推奨される。

20 ECMAScript 言語仕様におけるロケール依存関数

ECMA-262 では、いくつかのロケールに依存する関数を記述している。本仕様を実装する ECMAScript 実装は、ここで記述されるとおりにこれらの関数を実装しなければならない。

本項のアルゴリズム内で作成される Collator、NumberFormat、DateTimeFormat オブジェクトは、これらのアルゴリズム内でのみ使用される。これらは ECMAScript コードから直接アクセスされることはなく、実装内で実際に存在している必要もない。

20.1 String プロトタイプオブジェクトのプロパティ

20.1.1 String.prototype.localeCompare ( that [ , locales [ , options ] ] )

この定義は、ECMA-26222.1.3.12 で提供される定義に優先する。

localeCompare メソッドが引数 that と省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. O を ? RequireObjectCoercible(this value) に設定する。
  2. S を ? ToString(O) に設定する。
  3. thatValue を ? ToString(that) に設定する。
  4. collator を ? Construct(%Intl.Collator%, « locales, options ») に設定する。
  5. CompareStrings(collator, S, thatValue) を返す。

この関数の "length" プロパティは 1𝔽 である。

注 1
localeCompare メソッド自体は Array.prototype.sort の引数として直接使用するのに適していない。後者は 2 つの引数を取る関数を要求するためである。
注 2
localeCompare 関数は意図的にジェネリックであり、その this 値が String オブジェクトであることを要求しない。したがって、メソッドとして使用するために他の種類のオブジェクトへ転用できる。

20.1.2 String.prototype.toLocaleLowerCase ( [ locales ] )

この定義は、ECMA-26222.1.3.26 で提供される定義に優先する。

この関数は、ECMA-2626.1.4 に記述されるとおり、String 値をコードポイントの列として解釈する。次の手順を行う:

  1. O を ? RequireObjectCoercible(this value) に設定する。
  2. S を ? ToString(O) に設定する。
  3. ? TransformCase(S, locales, lower) を返す。
toLocaleLowerCase 関数は意図的にジェネリックであり、その this 値が String オブジェクトであることを要求しない。したがって、メソッドとして使用するために他の種類のオブジェクトへ転用できる。

20.1.2.1 TransformCase ( S, locales, targetCase )

抽象操作 TransformCase は、引数 S(String)、localesECMAScript 言語値)、targetCaselower または upper)を受け取る。S を、ECMA-2626.1.4 に記述されるとおり UTF-16 エンコードされたコードポイントの列として解釈し、ILD による targetCase への変換結果を新たな String 値として返す。呼び出し時に次の手順を行う:

  1. requestedLocales を ? CanonicalizeLocaleList(locales) に設定する。
  2. requestedLocales が空でない List なら、
    1. requestedLocalerequestedLocales[0] に設定する。
  3. それ以外の場合、
    1. requestedLocaleDefaultLocale() に設定する。
  4. availableLocales を、Unicode Character Database が言語依存の大文字小文字変換を含む 言語タグを含む 使用可能ロケールのリスト とする。実装が追加のロケール依存変換をサポートする場合、availableLocales にはそれらに対応する 言語タグ も含めるべきである。
  5. matchLookupMatchingLocaleByPrefix(availableLocales, « requestedLocale ») に設定する。
  6. matchundefined でないなら localematch.[[locale]] とし、そうでなければ locale"und" とする。
  7. codePointsStringToCodePoints(S) に設定する。
  8. targetCaselower なら、
    1. newCodePoints を、locale を用いる実装由来のアルゴリズムまたは Unicode 既定の大文字小文字変換アルゴリズムに従って codePoints に小文字変換を施した結果の要素からなる List とする。
  9. それ以外の場合、
    1. Assert: targetCaseupper である。
    2. newCodePoints を、locale を用いる実装由来のアルゴリズムまたは Unicode 既定の大文字小文字変換アルゴリズムに従って codePoints に大文字変換を施した結果の要素からなる List とする。
  10. CodePointsToString(newCodePoints) を返す。

コードポイントの対応は、Unicode 標準の既定の大文字小文字変換アルゴリズムの調整版に従って導出してよい。実装は、Unicode Character Database の SpecialCasing.txt や CLDR、その他の独自調整で定義されたロケール依存の調整を使用してよい。いかなる調整を行う場合でも、適合する実装の大文字小文字変換アルゴリズムは、同じ入力コードポイント・ロケール・ターゲット大小で常に同一の結果を生成しなければならない。

一部のコードポイントの大小変換は複数のコードポイントを生成することがあり、結果の長さは入力と同一とは限らない。また、toLocaleUpperCasetoLocaleLowerCase は文脈依存の挙動を持つため、これらの関数は対称ではない。言い換えると、s.toLocaleUpperCase().toLocaleLowerCase() は必ずしも s.toLocaleLowerCase() と等しくならず、s.toLocaleLowerCase().toLocaleUpperCase() は必ずしも s.toLocaleUpperCase() と等しくならない。

20.1.3 String.prototype.toLocaleUpperCase ( [ locales ] )

この定義は、ECMA-26222.1.3.27 で提供される定義に優先する。

この関数は、ECMA-2626.1.4 に記述されるとおり、String 値をコードポイントの列として解釈する。次の手順を行う:

  1. O を ? RequireObjectCoercible(this value) に設定する。
  2. S を ? ToString(O) に設定する。
  3. ? TransformCase(S, locales, upper) を返す。
toLocaleUpperCase 関数は意図的にジェネリックであり、その this 値が String オブジェクトであることを要求しない。したがって、メソッドとして使用するために他の種類のオブジェクトへ転用できる。

20.2 Number プロトタイプオブジェクトのプロパティ

以下の定義は、ECMA-26221.1.3 で定義される抽象操作 thisNumberValue を参照する。

20.2.1 Number.prototype.toLocaleString ( [ locales [ , options ] ] )

この定義は、ECMA-26221.1.3.4 で提供される定義に優先する。

toLocaleString メソッドが省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. x を ? ThisNumberValue(this value) に設定する。
  2. numberFormat を ? Construct(%Intl.NumberFormat%, « locales, options ») に設定する。
  3. FormatNumeric(numberFormat, ! ToIntlMathematicalValue(x)) を返す。

20.3 BigInt プロトタイプオブジェクトのプロパティ

以下の定義は、ECMA-26221.2.3 で定義される抽象操作 thisBigIntValue を参照する。

20.3.1 BigInt.prototype.toLocaleString ( [ locales [ , options ] ] )

この定義は、ECMA-26221.2.3.2 で提供される定義に優先する。

toLocaleString メソッドが省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. x を ? ThisBigIntValue(this value) に設定する。
  2. numberFormat を ? Construct(%Intl.NumberFormat%, « locales, options ») に設定する。
  3. FormatNumeric(numberFormat, (x)) を返す。

20.4 Date プロトタイプオブジェクトのプロパティ

以下の定義は、ECMA-26221.4.4 で定義される抽象操作 thisTimeValue を参照する。

20.4.1 Date.prototype.toLocaleString ( [ locales [ , options ] ] )

この定義は、ECMA-26221.4.4.39 で提供される定義に優先する。

toLocaleString メソッドが省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. dateObjectthis の値とする。
  2. ? RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. xdateObject.[[DateValue]] に設定する。
  4. xNaN なら、"Invalid Date" を返す。
  5. dateFormat を ? CreateDateTimeFormat(%Intl.DateTimeFormat%, locales, options, any, all) に設定する。
  6. ! FormatDateTime(dateFormat, x) を返す。

20.4.2 Date.prototype.toLocaleDateString ( [ locales [ , options ] ] )

この定義は、Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] ) で提供される定義に優先する。

toLocaleDateString メソッドが省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. dateObjectthis の値とする。
  2. ? RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. xdateObject.[[DateValue]] に設定する。
  4. xNaN なら、"Invalid Date" を返す。
  5. dateFormat を ? CreateDateTimeFormat(%Intl.DateTimeFormat%, locales, options, date, date) に設定する。
  6. ! FormatDateTime(dateFormat, x) を返す。

20.4.3 Date.prototype.toLocaleTimeString ( [ locales [ , options ] ] )

この定義は、Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] ) で提供される定義に優先する。

toLocaleTimeString メソッドが省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. dateObjectthis の値とする。
  2. ? RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. xdateObject.[[DateValue]] に設定する。
  4. xNaN なら、"Invalid Date" を返す。
  5. timeFormat を ? CreateDateTimeFormat(%Intl.DateTimeFormat%, locales, options, time, time) に設定する。
  6. ! FormatDateTime(timeFormat, x) を返す。

20.5 Array プロトタイプオブジェクトのプロパティ

20.5.1 Array.prototype.toLocaleString ( [ locales [ , options ] ] )

この定義は、Array.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] ) で提供される定義に優先する。

toLocaleString メソッドが省略可能な引数 localesoptions で呼び出されたとき、次の手順を行う:

  1. array を ? ToObject(this value) に設定する。
  2. len を ? LengthOfArrayLike(array) に設定する。
  3. separator を、ホスト環境の現在のロケールに適切な(たとえば ", " のような)実装依存のリスト区切り文字列値に設定する。
  4. R を空文字列に設定する。
  5. k を 0 に設定する。
  6. k < len の間、繰り返す、
    1. k > 0 なら、
      1. RRseparator文字列連結に設定する。
    2. nextElement を ? Get(array, ! ToString(𝔽(k))) に設定する。
    3. nextElementundefined または null でないなら、
      1. S を ? ToString(? Invoke(nextElement, "toLocaleString", « locales, options »)) に設定する。
      2. RRS文字列連結に設定する。
    4. kk + 1 に設定する。
  7. R を返す。
注 1
このアルゴリズムの手順は、Array.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] ) の手順を反映しているが、Invoke(nextElement, "toLocaleString") が localesoptions を引数として取る点が異なる。
注 2
配列の各要素はその toLocaleString メソッドを用いて String に変換され、これらの String は、ホスト環境の現在のロケールの慣習に対応する、実装依存のロケール依存区切り文字列で区切られて連結される。この関数は toString に類似するが、ロケールに応じた結果を生成することを意図している。
注 3
toLocaleString 関数は意図的にジェネリックであり、その this 値が Array オブジェクトであることを要求しない。したがって、メソッドとして使用するために他の種類のオブジェクトへ転用できる。

Annex A (informative) 実装依存の挙動

本仕様の以下の側面は実装依存である:

Annex B (informative) 以前の版との非互換性を生じさせる追加と変更

Annex C (informative) 奥付

本仕様は GitHub 上で Ecmarkup と呼ばれるプレーンテキストのソース形式で執筆されている。Ecmarkup は、プレーンテキストで ECMAScript 仕様を執筆し、本書の編集上の慣習に従った高機能な HTML レンダリングへ処理するためのフレームワークとツール群を提供する、HTML と Markdown の方言である。Ecmarkup は、構文定義のための Grammarkdown、およびアルゴリズム手順の執筆のための Ecmarkdown など、複数のフォーマットや技術の上に構築・統合されている。本仕様の PDF 版は、HTML レンダリングを PDF に印刷することで生成される。

本仕様の以前の版は Word によって執筆されていた。本版の基となった Ecmarkup ソーステキストは、ECMAScript 2015 の Word 文書を自動変換ツールで Ecmarkup に変換することで作成された。

Copyright & Software License

Ecma International

Rue du Rhone 114

CH-1204 Geneva

Tel: +41 22 849 6000

Fax: +41 22 849 6001

Web: https://ecma-international.org/

Software License

All Software contained in this document ("Software") is protected by copyright and is being made available under the "BSD License", included below. This Software may be subject to third party rights (rights from parties other than Ecma International), including patent rights, and no licenses under such third party rights are granted under this license even if the third party concerned is a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  3. Neither the name of the authors nor Ecma International may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.