ECMAScript® 2026 Internationalization API Specification
Contributing to this Specification
This specification is developed on GitHub with the help of the ECMAScript community. There are a number of ways to contribute to the development of this specification:
The ECMAScript 2026 Internationalization API Specification (ECMA-402 13th Edition), provides key language sensitive functionality as a complement to ECMA-262. Its functionality has been selected from that of well-established internationalization APIs such as those of the Internationalization Components for Unicode (ICU) library (https://unicode-org.github.io/icu-docs/), of the .NET framework, or of the Java platform.
The 1st Edition API was developed by an ad-hoc group established by Ecma TC39 in September 2010 based on a proposal by Nebojša Ćirić and Jungshik Shin.
The 2nd Edition API was adopted by the General Assembly of June 2015, as a complement to the ECMAScript 6th Edition.
The 3rd Edition API was the first edition released under Ecma TC39's new yearly release cadence and open development process. A plain-text source document was built from the ECMA-402 source document to serve as the base for further development entirely on GitHub. Over the year of this standard's development, dozens of pull requests and issues were filed representing several of bug fixes, editorial fixes and other improvements. Additionally, numerous software tools were developed to aid in this effort including Ecmarkup, Ecmarkdown, and Grammarkdown.
Dozens of individuals representing many organizations have made very significant contributions within Ecma TC39 to the development of this edition and to the prior editions. In addition, a vibrant community has emerged supporting TC39's ECMAScript efforts. This community has reviewed numerous drafts, filed dozens of bug reports, performed implementation experiments, contributed test suites, and educated the world-wide developer community about ECMAScript Internationalization. Unfortunately, it is impossible to identify and acknowledge every person and organization who has contributed to this effort.
Caridy Patiño
ECMA-402, 3rd, 4th and 5th Editions Project Editor
Caridy Patiño, Daniel Ehrenberg, Leo Balter
ECMA-402, 6th Edition Project Editors
Leo Balter, Valerie Young, Isaac Durazo
ECMA-402, 7th Edition Project Editors
Leo Balter, Richard Gibson
ECMA-402, 8th Edition Project Editors
Leo Balter, Richard Gibson, Ujjwal Sharma
ECMA-402, 9th Edition Project Editors
Richard Gibson, Ujjwal Sharma
ECMA-402, 10th Edition Project Editors
Richard Gibson, Ujjwal Sharma
ECMA-402, 11th Edition Project Editors
Ben Allen, Richard Gibson, Ujjwal Sharma
ECMA-402, 12th Edition Project Editors
Ben Allen, Richard Gibson, Ujjwal Sharma
ECMA-402, 13th Edition Project Editors
1 Scope
This Standard defines the application programming interface for ECMAScript objects that support programs that need to adapt to the linguistic and cultural conventions used by different human languages and countries.
2 Conformance
A conforming implementation of this specification must conform to ECMA-262, and must provide and support all the objects, properties, functions, and program semantics described in this specification. Nothing in this specification is intended to allow behaviour that is otherwise prohibited by ECMA-262, and any such conflict should be considered an editorial error rather than an override of constraints from ECMA-262.
A conforming implementation is permitted to provide additional objects, properties, and functions beyond those described in this specification. In particular, a conforming implementation is permitted to provide properties not described in this specification, and values for those properties, for objects that are described herein. A conforming implementation is not permitted to add optional arguments to the functions defined in this specification.
A conforming implementation is permitted to accept additional values, and then have implementation-defined behaviour instead of throwing a RangeError, for the following properties of options arguments:
The options property "localeMatcher" in all constructors and supportedLocalesOf methods.
The options properties "usage" and "sensitivity" in the Collator constructor.
The options properties "style", "currencyDisplay", "notation", "compactDisplay", "signDisplay", "currencySign", and "unitDisplay" in the NumberFormat constructor.
The options properties "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", and "maximumSignificantDigits" in the NumberFormat constructor, provided that the additional values are interpreted as integer values higher than the specified limits.
The options properties listed in Table 16 in the DateTimeFormat constructor.
The options property "formatMatcher" in the DateTimeFormat constructor.
The options properties "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", and "minimumSignificantDigits" in the PluralRules constructor, provided that the additional values are interpreted as integer values higher than the specified limits.
The options property "type" in the PluralRules constructor.
The options property "style" and "numeric" in the RelativeTimeFormat constructor.
The options property "style" and "type" in the DisplayNames constructor.
3 Normative References
The following referenced documents are required for the application of this document. For dated references, only the edition cited applies. For undated references, the latest edition of the referenced document (including any amendments) applies.
ISO/IEC 10646:2014: Information Technology – Universal Multiple-Octet Coded Character Set (UCS) plus Amendment 1:2015 and Amendment 2, plus additional amendments and corrigenda, or successor
Sections of this specification that depend on these references are updated on a best-effort basis, but are not guaranteed to be up-to-date with those standards.
4 Overview
This section is non-normative.
4.1 Internationalization, Localization, and Globalization
Internationalization of software means designing it such that it supports or can be easily adapted to support the needs of users speaking different languages and having different cultural expectations, and enables worldwide communication between them. Localization then is the actual adaptation to a specific language and culture. Globalization of software is commonly understood to be the combination of internationalization and localization. Globalization starts at the lowest level by using a text representation that supports all languages in the world, and using standard identifiers to identify languages, countries, time zones, and other relevant parameters. It continues with using a user interface language and data presentation that the user understands, and finally often requires product-specific adaptations to the user's language, culture, and environment.
ECMA-262 lays the foundation by using Unicode for text representation and by providing a few language-sensitive functions, but gives applications little control over the behaviour of these functions. This specification builds on that foundation by providing a set of customizable language-sensitive functionality. The API is useful even for applications that themselves are not internationalized, as even applications targeting only one language and one region need to properly support that one language and region. However, the API also enables applications that support multiple languages and regions, even concurrently, as may be needed in server environments.
4.2 API Overview
This specification is designed to complement ECMA-262 by providing key language-sensitive functionality, and can be added to an implementation thereof in whole or in part. This specification introduces new language values observable to ECMAScript code (such as the value of a [[FallbackSymbol]] internal slot and the set of values transitively reachable from %Intl% by property access), and also refines the definition of some functions specified in ECMA-262 (as described below). Neither category prohibits behaviour that is otherwise permitted for values and interfaces defined in ECMA-262, in order to support adoption of this specification by any implementation.
This specification provides several key pieces of language-sensitive functionality that are required in most applications: locale selection and inspection, string comparison (collation) and case conversion, pluralization rules, text segmentation, and formatting of numbers, absolute and relative dates and times, durations, and lists. While ECMA-262 provides functions for this basic functionality (on Array.prototype: toLocaleString; on String.prototype: localeCompare, toLocaleLowerCase, toLocaleUpperCase; on Number.prototype: toLocaleString; on Date.prototype: toLocaleString, toLocaleDateString, and toLocaleTimeString), their actual behaviour is left largely implemenation-defined. This specification provides additional functionality, control over the language and over details of the behaviour to be used, and a more complete specification of required functionality.
Applications can use the API in two ways:
Directly, by using a service constructor to construct an object, specifying a list of preferred languages and options to configure its behaviour. The object provides a main function (compare, select, format, etc.), which can be called repeatedly. It also provides a resolvedOptions function, which the application can use to find out the exact configuration of the object.
Indirectly, by using the functions of ECMA-262 mentioned above. The collation and formatting functions are respecified in this specification to accept the same arguments as the Collator, NumberFormat, and DateTimeFormat constructors and produce the same results as their compare or format methods. The case conversion functions are respecified to accept a list of preferred languages.
The Intl object is used to package all functionality defined in this specification in order to avoid name collisions.
Note
While the API includes a variety of formatters, it does not provide any parsing facilities. This is intentional, has been discussed extensively, and concluded after weighing in all the benefits and drawbacks of including said functionality. See the discussion on the issue tracker.
4.3 API Conventions
Every Intl constructor should behave as if defined by a class, throwing a TypeError exception when called as a function (without NewTarget). For backwards compatibility with past editions, this does not apply to %Intl.Collator%, %Intl.DateTimeFormat%, or %Intl.NumberFormat%, each of which construct and return a new object when called as a function.
In ECMA 402 v1, Intl constructors supported a mode of operation where calling them with an existing object as a receiver would add relevant internal slots to the receiver, effectively transforming it into an instance of the class. In ECMA 402 v2, this capability was removed, to avoid adding internal slots to existing objects. In ECMA 402 v3, the capability was re-added as "normative optional" in a mode which chains the underlying Intl instance on any object, when the constructor is called. See Issue 57 for details.
4.4 Implementation Dependencies
Due to the nature of internationalization, this specification has to leave several details implementation dependent:
The set of locales that an implementation supports with adequate localizations: Linguists estimate the number of human languages to around 6000, and the more widely spoken ones have variations based on regions or other parameters. Even large locale data collections, such as the Common Locale Data Repository, cover only a subset of this large set. Implementations targeting resource-constrained devices may have to further reduce the subset.
The exact form of localizations such as format patterns: In many cases locale-dependent conventions are not standardized, so different forms may exist side by side, or they vary over time. Different internationalization libraries may have implemented different forms, without any of them being actually wrong. In order to allow this API to be implemented on top of existing libraries, such variations have to be permitted.
Subsets of Unicode: Some operations, such as collation, operate on strings that can include characters from the entire Unicode character set. However, both the Unicode Standard and the ECMAScript standard allow implementations to limit their functionality to subsets of the Unicode character set. In addition, locale conventions typically don't specify the desired behaviour for the entire Unicode character set, but only for those characters that are relevant for the locale. While the Unicode Collation Algorithm combines a default collation order for the entire Unicode character set with the ability to tailor for local conventions, subsets and tailorings still result in differences in behaviour.
Throughout this specification, implementation- and locale-dependent behaviour is referred to as ILD, and implementation-, locale-, and numbering system-dependent behaviour is referred to as ILND.
4.4.1 Compatibility across implementations
ECMA 402 describes the schema of the data used by its functions. The
data contained inside is implementation-dependent, and expected to
change over time and vary between implementations. The variation is
visible by programmers, and it is possible to construct programs which
will depend on a particular output. However, this specification
attempts to describe reasonable constraints which will allow
well-written programs to function across implementations.
Implementations are encouraged to continue their efforts to harmonize
linguistic data.
5 Notational Conventions
This standard uses a subset of the notational conventions of ECMA-262:
As described in ECMA-262, algorithms are used to precisely specify the required semantics of ECMAScript constructs, but are not intended to imply the use of any specific implementation technique. Internal slots are used to define the semantics of object values, but are not part of the API. They are defined purely for expository purposes. An implementation of the API must behave as if it produced and operated upon internal slots in the manner described here.
As an extension to the Record Specification Type, the notation “[[<name>]]” denotes a field whose name is given by the variable name, which must have a String value. For example, if a variable s has the value "a", then [[<s>]] denotes the field [[a]].
This specification uses blocks demarcated as Normative Optional to denote the sense of Annex B in ECMA 262. That is, normative optional sections are required when the ECMAScript host is a web browser. The content of the section is normative but optional if the ECMAScript host is not a web browser.
6 Identification of Locales, Currencies, Time Zones, Measurement Units, Numbering Systems, Collations, and Calendars
This clause describes the String values used in this specification to identify locales, currencies, time zones, measurement units, numbering systems, collations, calendars, and pattern strings.
6.1 Case Sensitivity and Case Mapping
The String values used to identify locales, currencies, scripts, and time zones are interpreted in an ASCII-case-insensitive manner, treating the code units 0x0041 through 0x005A (corresponding to Unicode characters LATIN CAPITAL LETTER A through LATIN CAPITAL LETTER Z) as equivalent to the corresponding code units 0x0061 through 0x007A (corresponding to Unicode characters LATIN SMALL LETTER A through LATIN SMALL LETTER Z), both inclusive. No other case folding equivalences are applied.
Note
For example, "ß" (U+00DF) must not match or be mapped to "SS" (U+0053, U+0053). "ı" (U+0131) must not match or be mapped to "I" (U+0049).
The ASCII-uppercase of a String value S is the String value derived from S by replacing each occurrence of an ASCII lowercase letter code unit (0x0061 through 0x007A, inclusive) with the corresponding ASCII uppercase letter code unit (0x0041 through 0x005A, inclusive) while preserving all other code units.
The ASCII-lowercase of a String value S is the String value derived from S by replacing each occurrence of an ASCII uppercase letter code unit (0x0041 through 0x005A, inclusive) with the corresponding ASCII lowercase letter code unit (0x0061 through 0x007A, inclusive) while preserving all other code units.
A String value A is an ASCII-case-insensitive match for String value B if the ASCII-uppercase of A is exactly the same sequence of code units as the ASCII-uppercase of B. A sequence of Unicode code points A is an ASCII-case-insensitive match for B if B is an ASCII-case-insensitive match for CodePointsToString(A).
Locale identifiers consist of case-insensitive Unicode Basic Latin alphanumeric subtags separated by "-" (U+002D HYPHEN-MINUS) characters, with single-character subtags referred to as "singleton subtags".
Unicode Technical Standard #35 Part 1 Core, Section 3.6 Unicode BCP 47 U Extensionsubtag sequences are used extensively, and the term "Unicode locale extension sequence" describes the longest substring of a language tag that can be matched by the unicode_locale_extensions Unicode locale nonterminal and is not part of a "-x-…" private use subtag sequence. It starts with "-u-" and includes all immediately following subtags that are not singleton subtags, along with their preceding "-" separators. For example, the Unicode locale extension sequence of "en-US-u-fw-mon-x-u-ex-foobar" is "-u-fw-mon".
All structurally valid language tags are appropriate for use with the APIs defined by this specification, but implementations are not required to use Unicode Common Locale Data Repository (CLDR) data for validating them; the set of locales and thus language tags that an implementation supports with adequate localizations is implementation-defined. Intl constructors map requested language tags to locales supported by their respective implementations.
6.2.1 IsStructurallyValidLanguageTag ( locale )
The abstract operation IsStructurallyValidLanguageTag takes argument locale (a String) and returns a Boolean. It determines whether locale is a syntactically well-formed language tag. It does not consider whether locale conveys any meaningful semantics, nor does it differentiate between aliased subtags and their preferred replacement subtags or require canonical casing or subtag ordering. It performs the following steps when called:
If variants contains any duplicate subtags, return false.
Let extensions be the suffix of lowerLocale following baseName.
NOTE: A "-x-…" private use subtag sequence matched by the pu_extensionsUnicode locale nonterminal must be ignored, but an isolated final "x"subtag with no following content does not affect any of the below checks.
If puIndex is not not-found, set extensions to the substring of extensions from 0 to puIndex.
If extensions is not the empty String, then
If extensions contains any duplicate singleton subtags, return false.
Let transformExtension be the longest substring of extensions matched by the transformed_extensionsUnicode locale nonterminal. If there is no such substring, return true.
Assert: The substring of transformExtension from 0 to 3 is "-t-".
Let tPrefix be the substring of transformExtension from 3.
Let tlang be the longest prefix of tPrefix matched by the tlangUnicode locale nonterminal. If there is no such prefix, return true.
If tlangVariants contains any duplicate subtags, return false.
Return true.
6.2.2 CanonicalizeUnicodeLocaleId ( locale )
The abstract operation CanonicalizeUnicodeLocaleId takes argument locale (a language tag) and returns a Unicode canonicalized locale identifier. It returns the canonical and case-regularized form of locale. It performs the following steps when called:
This specification identifies currencies using 3-letter currency codes as defined by ISO 4217. Their canonical form is uppercase.
All well-formed 3-letter ISO 4217 currency codes are allowed. However, the set of combinations of currency code and language tag for which localized currency symbols are available is implementation dependent. Where a localized currency symbol is not available, the ISO 4217 currency code is used for formatting.
6.3.1 IsWellFormedCurrencyCode ( currency )
The abstract operation IsWellFormedCurrencyCode takes argument currency (a String) and returns a Boolean. It verifies that the currency argument represents a well-formed 3-letter ISO 4217 currency code. It performs the following steps when called:
If normalized contains any code unit outside of 0x0041 through 0x005A (corresponding to Unicode characters LATIN CAPITAL LETTER A through LATIN CAPITAL LETTER Z), return false.
Return true.
6.4 AvailableCanonicalCurrencies ( )
The implementation-defined abstract operation AvailableCanonicalCurrencies takes no arguments and returns a List of Strings. The returned List is sorted according to lexicographic code unit order, and contains unique, well-formed, and upper case canonicalized 3-letter ISO 4217 currency codes, identifying the currencies for which the implementation provides the functionality of Intl.DisplayNames and Intl.NumberFormat objects.
For historical reasons, "UTC" must be a primary time zone identifier.
"Etc/UTC", "Etc/GMT", and "GMT", as well as all Link names that resolve to any of them, must be non-primary time identifiers that resolve to "UTC".
Any Link name that is present in the “TZ” column of file zone.tab must be a primary time zone identifier.
For example, both "Europe/Prague" and "Europe/Bratislava" must be primary time zone identifiers.
This requirement guarantees at least one primary time zone identifier for each ISO 3166-1 Alpha-2 country code, and ensures that future changes to time zone rules of one country will not affect ECMAScript programs that use another country's time zone(s), unless those countries' territorial boundaries have also changed.
Any Link name that is not listed in the “TZ” column of file zone.tab and that represents a geographical area entirely contained within the territory of a single ISO 3166-1 Alpha-2 country code must resolve to a primary identifier that also represents a geographical area entirely contained within the territory of the same country code.
For example, "Atlantic/Jan_Mayen" must resolve to "Arctic/Longyearbyen".
Note
The IANA Time Zone Database offers build options that affect which available named time zone identifiers are primary.
The default build options merge different countries' time zones, for example "Atlantic/Reykjavik" is built as a Link to the Zone "Africa/Abidjan".
Geographically and politically distinct locations are likely to introduce divergent time zone rules in a future version of the IANA Time Zone Database.
The exceptions above serve to mitigate these future-compatibility issues.
The Unicode Common Locale Data Repository (CLDR) implements most of the exceptions above when determining which available named time zone identifiers are primary or non-primary.
Although use of CLDR data is recommended for consistency between implementations, it is not required.
Non-CLDR-based implementations can still use CLDR's identifier data in timezone.xml.
Implementations may also build the IANA Time Zone Database directly, for example by using build options such as PACKRATDATA=backzone PACKRATLIST=zone.tab and performing any post-processing needed to ensure compliance with the requirements above.
The IANA Time Zone Database is typically updated between five and ten times per year.
These updates may add new Zone or Link names, may change Zones to Links, and may change the UTC offsets and transitions associated with any Zone.
Implementations are recommended to include updates to the IANA Time Zone Database as soon as possible.
Such prompt action ensures that ECMAScript programs can accurately perform time-zone-sensitive calculations and can use newly-added available named time zone identifiers supplied by external input or the host environment.
Although the IANA Time Zone Database maintainers strive for stability, in rare cases (averaging less than once per year) a Zone may be replaced by a new Zone.
For example, in 2022 "Europe/Kiev" was deprecated to a Link resolving to a new "Europe/Kyiv" Zone.
The deprecated Link is called a renamed time zone identifier and the newly-added Zone is called a replacement time zone identifier.
To reduce disruption from these infrequent changes, implementations should initially add each replacement time zone identifier as a non-primary time zone identifier that resolves to the existing renamed time zone identifier.
This allows ECMAScript programs to recognize both identifiers, but also reduces the chance that an ECMAScript program will send the replacement time zone identifier to another system that does not yet recognize it.
After a rename waiting period, implementations should promote the new Zone to a primary time zone identifier while simultaneously demoting the renamed time zone identifier to non-primary.
To provide ample time for other systems to be updated, the recommended rename waiting period is two years.
However, it does not need to be either exact or dynamic.
Instead, implementations should make the replacement time zone identifier primary after the waiting period as part of their normal release process for updating time zone data.
A waiting period should only apply when a new Zone is added to replace an existing Zone.
If an existing Zone and Link are swapped, then no renaming has happened and no waiting period is necessary.
If identifier is a Link name in the IANA Time Zone Database and identifier is not present in the “TZ” column of zone.tab of the IANA Time Zone Database, then
Let zone be the Zone name that identifier resolves to, according to the rules for resolving Link names in the IANA Time Zone Database.
If zone starts with "Etc/", then
Set primary to zone.
Else,
Let identifierCountryCode be the ISO 3166-1 Alpha-2 country code whose territory contains the geographical area corresponding to identifier.
Let zoneCountryCode be the ISO 3166-1 Alpha-2 country code whose territory contains the geographical area corresponding to zone.
If identifierCountryCode is zoneCountryCode, then
Set primary to zone.
Else,
Let countryCodeLineCount be the number of lines in file zone.tab of the IANA Time Zone Database where the “country-code” column is identifierCountryCode.
If countryCodeLineCount is 1, then
Let countryCodeLine be the line in file zone.tab of the IANA Time Zone Database where the “country-code” column is identifierCountryCode.
Set primary to the contents of the “TZ” column of countryCodeLine.
Else,
Let backzone be undefined.
Let backzoneLinkLines be the List of lines in the file backzone of the IANA Time Zone Database that start with either "Link " or "#PACKRATLIST zone.tab Link ".
The algorithm above for resolving Links to primary time zone identifiers is intended to correspond to the behaviour of icu::TimeZone::getIanaID() in the International Components for Unicode (ICU) and the processes for maintaining time zone identifier data in the Unicode Common Locale Data Repository (CLDR).
This algorithm resolves Links to primary time zone identifiers without crossing the boundaries of ISO 3166-1 Alpha-2 country codes, using data from files zone.tab and backzone of the IANA Time Zone Database.
If the country code of a Link has only one line in zone.tab, then that line will determine the primary time zone identifier.
However, if that country code has multiple lines in zone.tab, then historical mappings in backzone must be used to identify the correct primary time zone identifier.
For example, to resolve "Pacific/Truk" (in country code "FM") if the default build options of the IANA Time Zone Database identify it as a Link to "Pacific/Port_Moresby" (in country code "PG"), then the “country-code” column of zone.tab must be checked for lines corresponding with "FM".
If there were only one such line, then the “TZ” column of that line would determine the primary time zone identifier associated with "Pacific/Truk".
But if there are multiple "FM" lines in zone.tab, then backzone must be inspected and a line such as "Link Pacific/Chuuk Pacific/Truk" would result in using "Pacific/Chuuk" as the primary time zone identifier.
Note that zone.tab is the preferred source of mapping data because backzone mappings may, in rare cases, cross the boundaries of ISO 3166-1 Alpha-2 country codes.
For example, "Atlantic/Jan_Mayen" (in country code "SJ") is mapped in backzone to "Europe/Oslo" (in country code "NO").
As of the 2024a release of the IANA Time Zone Database, "Atlantic/Jan_Mayen" is the only case where this happens.
Note 2
Time zone identifiers in the IANA Time Zone Database can change over time.
At a minimum, it is recommended that implementations limit changes to the result of AvailableNamedTimeZoneIdentifiers to the changes allowed by GetAvailableNamedTimeZoneIdentifier, for the lifetime of the surrounding agent.
Due to the complexity of supporting these recommendations, it is recommended that the result of AvailableNamedTimeZoneIdentifiers remains the same for the lifetime of the surrounding agent.
For any timeZoneIdentifier, or any value that is an ASCII-case-insensitive match for it, it is required that the resulting Time Zone Identifier Record contain the same field values for the lifetime of the surrounding agent.
Furthermore, it is required that time zone identifiers not dynamically change from primary to non-primary during the lifetime of the surrounding agent, meaning that if timeZoneIdentifier is an ASCII-case-insensitive match for the [[PrimaryIdentifier]] field of the result of a previous call to GetAvailableNamedTimeZoneIdentifier, then GetAvailableNamedTimeZoneIdentifier(timeZoneIdentifier) must return a Time Zone Identifier Record where [[Identifier]] is [[PrimaryIdentifier]].
Due to the complexity of supporting these requirements, it is recommended that the result of AvailableNamedTimeZoneIdentifiers (and therefore GetAvailableNamedTimeZoneIdentifier too) remains the same for the lifetime of the surrounding agent.
6.5.3 AvailablePrimaryTimeZoneIdentifiers ( )
The abstract operation AvailablePrimaryTimeZoneIdentifiers takes no arguments and returns a List of Strings. The returned List is a sorted List of supported Zone and Link names in the IANA Time Zone Database. It performs the following steps when called:
For each element timeZoneIdentifierRecord of records, do
If timeZoneIdentifierRecord.[[Identifier]] is timeZoneIdentifierRecord.[[PrimaryIdentifier]], then
Append timeZoneIdentifierRecord.[[Identifier]] to result.
Return result.
6.5.4 StringSplitToList ( S, separator )
The abstract operation StringSplitToList takes arguments S (a String) and separator (a String) and returns a List of Strings.
The returned List contains all disjoint substrings of S that do not contain separator but are immediately preceded and/or immediately followed by an occurrence of separator.
Each such substring will be the empty String between adjacent occurrences of separator, before a separator at the very start of S, or after a separator at the very end of S, but otherwise will not be empty.
It performs the following steps when called:
This specification identifies measurement units using a core unit identifier (or equivalently core unit ID) as defined by Unicode Technical Standard #35 Part 2 General, Section 6.2 Unit Identifiers. Their canonical form is a string containing only Unicode Basic Latin lowercase letters (U+0061 LATIN SMALL LETTER A through U+007A LATIN SMALL LETTER Z) with zero or more medial hyphens (U+002D HYPHEN-MINUS).
Only a limited set of core unit identifiers are sanctioned.
Attempting to use an unsanctioned core unit identifier results in a RangeError.
The abstract operation IsWellFormedUnitIdentifier takes argument unitIdentifier (a String) and returns a Boolean. It verifies that the unitIdentifier argument represents a well-formed core unit identifier that is either a sanctioned single unit or a complex unit formed by division of two sanctioned single units. It performs the following steps when called:
The abstract operation IsSanctionedSingleUnitIdentifier takes argument unitIdentifier (a String) and returns a Boolean. It verifies that the unitIdentifier argument is among the single unit identifiers sanctioned in the current version of this specification, which are a subset of the Common Locale Data Repository release 38 unit validity data; the list may grow over time. As discussed in Unicode Technical Standard #35 Part 2 General, Section 6.2 Unit Identifiers, a single unit identifier is a core unit identifier that is not composed of multiplication or division of other unit identifiers. It performs the following steps when called:
If unitIdentifier is listed in Table 2 below, return true.
Else, return false.
Table 2: Single units sanctioned for use in ECMAScript
Single Unit Identifier
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 ( )
The abstract operation AvailableCanonicalUnits takes no arguments and returns a List of Strings. The returned List is sorted according to lexicographic code unit order, and consists of the unique values of simple unit identifiers listed in every row of Table 2, except the header row.
6.7 Numbering System Identifiers
This specification identifies numbering systems using a numbering system identifier corresponding with the name referenced by Unicode Technical Standard #35 Part 3 Numbers, Section 1 Numbering Systems. Their canonical form is a string containing only Unicode Basic Latin lowercase letters (U+0061 LATIN SMALL LETTER A through U+007A LATIN SMALL LETTER Z).
6.7.1 AvailableCanonicalNumberingSystems ( )
The implementation-defined abstract operation AvailableCanonicalNumberingSystems takes no arguments and returns a List of Strings. The returned List is sorted according to lexicographic code unit order, and contains unique canonical numbering systems identifiers identifying the numbering systems for which the implementation provides the functionality of Intl.DateTimeFormat, Intl.NumberFormat, and Intl.RelativeTimeFormat objects. The List must include the Numbering System value of every row of Table 28, except the header row.
6.8 Collation Types
This specification identifies collations using a collation type as defined by Unicode Technical Standard #35 Part 5 Collation, Section 3.1 Collation Types. Their canonical form is a string containing only Unicode Basic Latin lowercase letters (U+0061 LATIN SMALL LETTER A through U+007A LATIN SMALL LETTER Z) with zero or more medial hyphens (U+002D HYPHEN-MINUS).
6.8.1 AvailableCanonicalCollations ( )
The implementation-defined abstract operation AvailableCanonicalCollations takes no arguments and returns a List of Strings. The returned List is sorted according to lexicographic code unit order, and contains unique canonical collation types identifying the collations for which the implementation provides the functionality of Intl.Collator objects.
6.9 Calendar Types
This specification identifies calendars using a calendar type as defined by Unicode Technical Standard #35 Part 4 Dates, Section 2 Calendar Elements. Their canonical form is a string containing only Unicode Basic Latin lowercase letters (U+0061 LATIN SMALL LETTER A through U+007A LATIN SMALL LETTER Z) with zero or more medial hyphens (U+002D HYPHEN-MINUS).
6.9.1 AvailableCalendars ( )
The implementation-defined abstract operation AvailableCalendars takes no arguments and returns a List of Strings. The returned List is sorted according to lexicographic code unit order, and contains unique calendar types in canonical form (6.9) identifying the calendars for which the implementation provides the functionality of Intl.DateTimeFormat objects, including their aliases (e.g., either both or neither of "islamicc" and "islamic-civil"). The List must include "iso8601".
6.10 Pattern String Types
Pattern String is a String value which contains zero or more substrings of the form "{key}", where key can be any non-empty sequence consisting only of elements from the ASCII word characters. The syntax of the abstract pattern strings is an implementation detail and is not exposed to users of ECMA-402.
7 Requirements for Standard Built-in ECMAScript Objects
Unless specified otherwise in this document, the objects, functions, and constructors described in this standard are subject to the generic requirements and restrictions specified for standard built-in ECMAScript objects in ECMAScript Standard Built-in Objects.
8 The Intl Object
The Intl object is the %Intl% intrinsic object and the initial value of the "Intl" property of the global object. The Intl object is a single ordinary object.
The value of the [[Prototype]] internal slot of the Intl object is the intrinsic object %Object.prototype%.
The Intl object is not a function object. It does not have a [[Construct]] internal method; it is not possible to use the Intl object as a constructor with the new operator. The Intl object does not have a [[Call]] internal method; it is not possible to invoke the Intl object as a function.
The Intl object has an internal slot, [[FallbackSymbol]], which is a new %Symbol% in the current realm with the [[Description]]"IntlLegacyConstructedSymbol".
8.1 Value Properties of the Intl Object
8.1.1 Intl [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the String value "Intl".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
8.2 Constructor Properties of the Intl Object
With the exception of Intl.Locale, each of the following constructors is a service constructor that creates objects providing locale-sensitive services.
Service constructors use common patterns to negotiate the requests represented by locales and options arguments against the actual capabilities of an implementation. That common behaviour is explained here in terms of internal slots describing the capabilities, abstract operations using these internal slots, and specialized data types defined below.
A Language Priority List is a List of structurally valid and canonicalizedlanguage tags representing a sequence of locale preferences by descending priority. It corresponds with the term of the same name defined in BCP 47 at RFC 4647 section 2.3 but prohibits "*" elements and contains only canonicalized contents.
A Resolution Option Descriptor is a Record with fields [[Key]] (a string, usually an element of a [[RelevantExtensionKeys]]List) and [[Property]] (a string), and optionally also with either or both of [[Type]] (boolean or string) and [[Values]] (empty or a List of ECMAScript language values). It describes how to read options relevant to locale resolution during object construction.
[[AvailableLocales]] is an Available Locales List. It must include the value returned by DefaultLocale. Additionally, for each element with more than one subtag, it must also include a less narrow language tag with the same language subtag and a strict subset of the same following subtags (i.e., omitting one or more) to serve as a potential fallback from ResolveLocale. In particular, each element with a language subtag and a script subtag and a region subtag must be accompanied by another element consisting of only the same language subtag and region subtag but missing the script subtag. For example,
If [[AvailableLocales]] contains "de-DE", then it must also contain "de" (which might be selected to satisfy requested locales such as "de-AT" and "de-CH").
If [[AvailableLocales]] contains "az-Latn-AZ", then it must also contain "az-AZ" (which might be selected to satisfy requested locales such as "az-Cyrl-AZ" if "az-Cyrl" is unavailable).
[[SortLocaleData]] and [[SearchLocaleData]] (for Intl.Collator) and [[LocaleData]] (for every other service constructor) are Records. In addition to fields specific to its service constructor, each such Record has a field for each locale contained in [[AvailableLocales]]. The value of each such locale-named field is a Record in which each element of [[RelevantExtensionKeys]] identifies the name of a field whose value is a non-empty List of Strings representing the type values that are supported by the implementation in the relevant locale for the corresponding Unicode locale extension sequence key, with the first element providing the default value for that key in the locale.
Note
For example, an implementation of DateTimeFormat might include the language tag"fa-IR" in its [[AvailableLocales]] internal slot, and must (according to 11.2.3) include the keys "ca", "hc", and "nu" in its [[RelevantExtensionKeys]] internal slot.
The default calendar for that locale is usually "persian", but an implementation might also support "gregory", "islamic", and "islamic-civil".
The Record in the DateTimeFormat [[LocaleData]] internal slot would therefore include a [[fa-IR]] field whose value is a Record like { [[ca]]: « "persian", "gregory", "islamic", "islamic-civil" », [[hc]]: « … », [[nu]]: « … » }, along with other locale-named fields having the same value shape but different elements in their Lists.
If seen does not contain canonicalizedTag, append canonicalizedTag to seen.
Set k to k + 1.
Return seen.
Note 1
Non-normative summary: The abstract operation interprets the locales argument as an array and copies its elements into a List, validating the elements as structurally valid language tags and canonicalizing them, and omitting duplicates.
Note 2
Requiring kValue to be a String or Object means that the Number value NaN will not be interpreted as the language tag"nan", which stands for Min Nan Chinese.
NOTE: It is recommended that implementations use the 'u' extension data in common/bcp47 provided by the Common Locale Data Repository (available at https://cldr.unicode.org/).
The abstract operation UnicodeExtensionComponents takes argument extension (a Unicode locale extension sequence) and returns a Record with fields [[Attributes]] and [[Keywords]]. It deconstructs extension into a List of unique attributes and a List of keywords with unique keys. Any repeated appearance of an attribute or keyword key after the first is ignored. It performs the following steps when called:
If e is not-found, let len be size - k; else let len be e - k.
Let subtag be the substring of extension from k to k + len.
NOTE: A keyword is a sequence of subtags in which the first is a key of length 2 and any subsequent ones (if present) have length in the inclusive interval from 3 to 8, collectively constituting a value along with their medial "-" separators. An attribute is a single subtag with length in the inclusive interval from 3 to 8 that precedes all keywords.
The abstract operation ResolveLocale takes arguments availableLocales (an Available Locales List), requestedLocales (a Language Priority List), options (a Record), relevantExtensionKeys (a List of Strings), and localeData (a Record) and returns a Record. It performs "lookup" as defined in BCP 47 at RFC 4647 section 3, determining the best element of availableLocales for satisfying requestedLocales using either the LookupMatchingLocaleByBestFit algorithm or LookupMatchingLocaleByPrefix algorithm as specified by options.[[localeMatcher]], ignoring Unicode locale extension sequences, and returns a representation of the match that also includes corresponding data from localeData and a resolved value for each element of relevantExtensionKeys (defaulting to data from the matched locale, superseded by data from the requested Unicode locale extension sequence if present and then by data from options if present). If the matched element from requestedLocales contains a Unicode locale extension sequence, it is copied onto the language tag in the [[Locale]] field of the returned Record, omitting any keywordUnicode locale nonterminal whose key value is not contained within relevantExtensionKeys or type value is superseded by a different value from options. It performs the following steps when called:
If specialBehaviours is present and contains require-options and options is undefined, throw a TypeError exception.
If specialBehaviours is present and contains coerce-options, set options to ? CoerceOptionsToObject(options). Otherwise, set options to ? GetOptionsObject(options).
Let matcher be ? GetOption(options, "localeMatcher", string, « "lookup", "best fit" », "best fit").
Let opt be the Record { [[localeMatcher]]: matcher }.
The abstract operation GetOptionsObject takes argument options (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion.
It returns an Object suitable for use with GetOption, either options itself or a default empty Object.
It throws a TypeError if options is not undefined and not an Object.
It performs the following steps when called:
The abstract operation CoerceOptionsToObject takes argument options (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion.
It coerces options into an Object suitable for use with GetOption, defaulting to an empty Object.
Because it coerces non-null primitive values into objects, its use is discouraged for new functionality in favour of GetOptionsObject.
It performs the following steps when called:
The abstract operation GetOption takes arguments options (an Object), property (a property key), type (boolean or string), values (empty or a List of ECMAScript language values), and default (required or an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It extracts the value of the specified property of options, converts it to the required type, checks whether it is allowed by values if values is not empty, and substitutes default if the value is undefined. It performs the following steps when called:
The abstract operation GetBooleanOrStringNumberFormatOption takes arguments options (an Object), property (a property key), stringValues (a List of Strings), and fallback (an ECMAScript language value) and returns either a normal completion containing either a Boolean, String, or fallback, or a throw completion. It extracts the value of the property named property from the provided options object. It returns fallback if that value is undefined, true if that value is true, false if that value coerces to false, and otherwise coerces it to a String and returns the result if it is allowed by stringValues. It performs the following steps when called:
The abstract operation DefaultNumberOption takes arguments value (an ECMAScript language value), minimum (an integer), maximum (an integer), and fallback (an integer or undefined) and returns either a normal completion containing either an integer or undefined, or a throw completion. It converts value to an integer, checks whether it is in the allowed range, and fills in a fallback value if necessary. It performs the following steps when called:
The abstract operation GetNumberOption takes arguments options (an Object), property (a String), minimum (an integer), maximum (an integer), and fallback (an integer or undefined) and returns either a normal completion containing either an integer or undefined, or a throw completion. It extracts the value of the property named property from the provided options object, converts it to an integer, checks whether it is in the allowed range, and fills in a fallback value if necessary. It performs the following steps when called:
The abstract operation PartitionPattern takes argument pattern (a Pattern String) and returns a List of Records with fields [[Type]] (a String) and [[Value]] (a String or undefined).
The [[Value]] field will be a String value if [[Type]] is "literal", and undefined otherwise.
It performs the following steps when called:
Let placeholderStart be StringIndexOf(pattern, "{", 0).
Repeat, while placeholderStart is not not-found,
Let literal be the substring of pattern from placeholderEnd + 1 to placeholderStart.
If literal is not the empty String, then
Append the Record { [[Type]]: "literal", [[Value]]: literal } to result.
Set placeholderEnd to StringIndexOf(pattern, "}", placeholderStart).
Assert: placeholderEnd is not not-found and placeholderStart < placeholderEnd.
Let placeholderName be the substring of pattern from placeholderStart + 1 to placeholderEnd.
Append the Record { [[Type]]: placeholderName, [[Value]]: undefined } to result.
Set placeholderStart to StringIndexOf(pattern, "{", placeholderEnd).
Let tail be the substring of pattern from placeholderEnd + 1.
If tail is not the empty String, then
Append the Record { [[Type]]: "literal", [[Value]]: tail } to result.
Return result.
10 Collator Objects
10.1 The Intl.Collator Constructor
The Intl.Collator constructor is the %Intl.Collator% intrinsic object and a standard built-in property of the Intl object. Behaviour common to all service constructor properties of the Intl object is specified in 9.1.
NOTE: The source of locale data for ResolveOptions depends upon the "usage" property of options, but the following two steps must observably precede that lookup (and must not observably repeat inside ResolveOptions).
The value of the [[AvailableLocales]] internal slot is implementation-defined within the constraints described in 9.1. The value of the [[RelevantExtensionKeys]] internal slot is a List that must include the element "co", may include any or all of the elements "kf" and "kn", and must not include any other elements.
Note
Unicode Technical Standard #35 Part 1 Core, Section 3.6.1 Key and Type Definitions describes ten locale extension keys that are relevant to collation: "co" for collator usage and specializations, "ka" for alternate handling, "kb" for backward second level weight, "kc" for case level, "kf" for case first, "kh" for hiragana quaternary, "kk" for normalization, "kn" for numeric, "kr" for reordering, "ks" for collation strength, and "vt" for variable top. Collator, however, requires that the usage is specified through the "usage" property of the options object, alternate handling through the "ignorePunctuation" property of the options object, and case level and the strength through the "sensitivity" property of the options object. The "co" key in the language tag is supported only for collator specializations, and the keys "kb", "kh", "kk", "kr", and "vt" are not allowed in this version of the Internationalization API. Support for the remaining keys is implementation dependent.
The value of the [[ResolutionOptionDescriptors]] internal slot is « { [[Key]]: "co", [[Property]]: "collation" }, { [[Key]]: "kn", [[Property]]: "numeric", [[Type]]: boolean }, { [[Key]]: "kf", [[Property]]: "caseFirst", [[Values]]: « "upper", "lower", "false" » } ».
The values of the [[SortLocaleData]] and [[SearchLocaleData]] internal slots are implementation-defined within the constraints described in 9.1 and the following additional constraints, for all locale values locale:
The first element of [[SortLocaleData]].[[<locale>]].[[co]] and [[SearchLocaleData]].[[<locale>]].[[co]] must be null.
The values "standard" and "search" must not be used as elements in any [[SortLocaleData]].[[<locale>]].[[co]] and [[SearchLocaleData]].[[<locale>]].[[co]]List.
[[SearchLocaleData]].[[<locale>]] must have a [[sensitivity]] field with one of the String values "base", "accent", "case", or "variant".
[[SearchLocaleData]].[[<locale>]] and [[SortLocaleData]].[[<locale>]] must have an [[ignorePunctuation]] field with a Boolean value.
10.3 Properties of the Intl.Collator Prototype Object
The Intl.Collator prototype object is itself an ordinary object. %Intl.Collator.prototype% is not an Intl.Collator instance and does not have an [[InitializedCollator]] internal slot or any of the other internal slots of Intl.Collator instance objects.
10.3.1 Intl.Collator.prototype.constructor
The initial value of Intl.Collator.prototype.constructor is %Intl.Collator%.
This named accessor property returns a function that compares two strings according to the sort order of this Collator object.
Intl.Collator.prototype.compare is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
The "length" property of a Collator compare function is 2𝔽.
10.3.3.2 CompareStrings ( collator, x, y )
The implementation-defined abstract operation CompareStrings takes arguments collator (an Intl.Collator), x (a String), and y (a String) and returns a Number, but not NaN.
The returned Number represents the result of an implementation-defined locale-sensitive String comparison of x with y.
The result is intended to correspond with a sort order of String values according to the effective locale and collation options of collator, and will be negative when x is ordered before y, positive when x is ordered after y, and zero in all other cases (representing no relative ordering between x and y).
String values must be interpreted as UTF-16 code unit sequences as described in ECMA-262, 6.1.4, and a surrogate pair (a code unit in the range 0xD800 to 0xDBFF followed by a code unit in the range 0xDC00 to 0xDFFF) within a string must be interpreted as the corresponding code point.
Behaviour as described below depends upon locale-sensitive identification of the sequence of collation elements for a string, in particular "base letters", and different base letters always compare as unequal (causing the strings containing them to also compare as unequal). Results of comparing variations of the same base letter with different case, diacritic marks, or potentially other aspects further depends upon collator.[[Sensitivity]] as follows:
Table 4: Effects of Collator Sensitivity
[[Sensitivity]]
Description
"a" vs. "á"
"a" vs. "A"
"base"
Characters with the same base letter do not compare as unequal, regardless of differences in case and/or diacritic marks.
equal
equal
"accent"
Characters with the same base letter compare as unequal only if they differ in accents and/or other diacritic marks, regardless of differences in case.
not equal
equal
"case"
Characters with the same base letter compare as unequal only if they differ in case, regardless of differences in accents and/or other diacritic marks.
equal
not equal
"variant"
Characters with the same base letter compare as unequal if they differ in case, diacritic marks, and/or potentially other differences.
not equal
not equal
Note 1
The mapping from input code points to base letters can include arbitrary contractions, expansions, and collisions, including those that apply special treatment to certain characters with diacritic marks. For example, in Swedish, "ö" is a base letter that differs from "o", and "v" and "w" are considered to be the same base letter. In Slovak, "ch" is a single base letter, and in English, "æ" is a sequence of base letters starting with "a" and ending with "e".
If collator.[[IgnorePunctuation]] is true, then punctuation is ignored (e.g., strings that differ only in punctuation compare as equal).
The actual return values are implementation-defined to permit encoding additional information in them, but this operation for any given collator, when considered as a function of x and y, is required to be a consistent comparator defining a total ordering on the set of all Strings. This operation is also required to recognize and honour canonical equivalence according to the Unicode Standard, including returning +0𝔽 when comparing distinguishable Strings that are canonically equivalent.
Note 2
It is recommended that the CompareStrings abstract operation be implemented following Unicode Technical Standard #10: Unicode Collation Algorithm, using tailorings for the effective locale and collation options of collator. It is recommended that implementations use the tailorings provided by the Common Locale Data Repository (available at https://cldr.unicode.org/).
Note 3
Applications should not assume that the behaviour of the CompareStrings abstract operation for Collator instances with the same resolved options will remain the same for different versions of the same implementation.
[[Locale]]is a String value with the language tag of the locale whose localization is used for collation.
[[Usage]] is one of the String values "sort" or "search", identifying the collator usage.
[[Sensitivity]] is one of the String values "base", "accent", "case", or "variant", identifying the collator's sensitivity.
[[IgnorePunctuation]]is a Boolean value, specifying whether punctuation should be ignored in comparisons.
[[Collation]]is a String value representing the Unicode Collation Identifier used for collation, except that the values "standard" and "search" are not allowed, while the value "default" is allowed.
Intl.Collator instances also have the following internal slots if the key corresponding to the name of the internal slot in Table 3 is included in the [[RelevantExtensionKeys]] internal slot of Intl.Collator:
[[Numeric]]is a Boolean value, specifying whether numeric sorting is used.
[[CaseFirst]] is one of the String values "upper", "lower", or "false".
Finally, Intl.Collator instances have a [[BoundCompare]] internal slot that caches the function returned by the compare accessor (10.3.3).
11 DateTimeFormat Objects
11.1 The Intl.DateTimeFormat Constructor
The Intl.DateTimeFormat constructor is the %Intl.DateTimeFormat% intrinsic object and a standard built-in property of the Intl object. Behaviour common to all service constructor properties of the Intl object is specified in 9.1.
The abstract operation FormatOffsetTimeZoneIdentifier takes argument offsetMinutes (an integer) and returns a String.
It formats a UTC offset, in minutes, into a UTC offset string formatted like ±HH:MM.
It performs the following steps when called:
If offsetMinutes ≥ 0, let sign be the code unit 0x002B (PLUS SIGN); otherwise, let sign be the code unit 0x002D (HYPHEN-MINUS).
The value of the [[AvailableLocales]] internal slot is implementation-defined within the constraints described in 9.1.
The value of the [[RelevantExtensionKeys]] internal slot is « "ca", "hc", "nu" ».
Note 1
Unicode Technical Standard #35 Part 1 Core, Section 3.6.1 Key and Type Definitions describes four locale extension keys that are relevant to date and time formatting: "ca" for calendar, "hc" for hour cycle, "nu" for numbering system (of formatted numbers), and "tz" for time zone. DateTimeFormat, however, requires that the time zone is specified through the "timeZone" property in the options objects.
The value of the [[ResolutionOptionDescriptors]] internal slot is « { [[Key]]: "ca", [[Property]]: "calendar" }, { [[Key]]: "nu", [[Property]]: "numberingSystem" }, { [[Key]]: "hour12", [[Property]]: "hour12", [[Type]]: boolean }, { [[Key]]: "hc", [[Property]]: "hourCycle", [[Values]]: « "h11", "h12", "h23", "h24" » } ».
The value of the [[LocaleData]] internal slot is implementation-defined within the constraints described in 9.1 and the following additional constraints, for all locale values locale:
[[LocaleData]].[[<locale>]].[[nu]] must be a List that does not include the values "native", "traditio", or "finance".
[[LocaleData]].[[<locale>]].[[hc]] must be « null, "h11", "h12", "h23", "h24" ».
[[LocaleData]].[[<locale>]].[[hourCycle]] must be one of the String values "h11", "h12", "h23", or "h24".
[[LocaleData]].[[<locale>]].[[hourCycle12]] must be one of the String values "h11" or "h12".
[[LocaleData]].[[<locale>]].[[hourCycle24]] must be one of the String values "h23" or "h24".
[[LocaleData]].[[<locale>]] must have a [[formats]] field. The value of this [[formats]] field must be a Record with a [[<calendar>]] field for each calendar value calendar. The value of each [[<calendar>]] field must be a List of DateTime Format Records. Multiple Records in such a List may use the same subset of the fields as long as the corresponding values differ for at least one field. The following subsets must be available for each locale:
[[LocaleData]].[[<locale>]] must have a [[styles]] field. The value of this [[styles]] field must be a Record with a [[<calendar>]] field for each calendar value calendar. The value of each [[<calendar>]] field must be a DateTime Styles Record.
11.2.3.1 DateTime Format Records
Each DateTime Format Record has the fields defined in Table 5.
Contains for each of the date and time format component fields of the record a substring starting with "{", followed by the name of the field, followed by "}". If the record has a [[year]] field, the string may contain the substrings "{yearName}" and "{relatedYear}".
Optional field. Present if the [[hour]] field is present. In addition to the substrings of the [[pattern]] field, contains at least one of the substrings "{ampm}" or "{dayPeriod}".
It is recommended that implementations use the locale data provided by the Common Locale Data Repository (available at https://cldr.unicode.org/).
11.3 Properties of the Intl.DateTimeFormat Prototype Object
The Intl.DateTimeFormat prototype object is itself an ordinary object. %Intl.DateTimeFormat.prototype% is not an Intl.DateTimeFormat instance and does not have an [[InitializedDateTimeFormat]] internal slot or any of the other internal slots of Intl.DateTimeFormat instance objects.
11.3.1 Intl.DateTimeFormat.prototype.constructor
The initial value of Intl.DateTimeFormat.prototype.constructor is %Intl.DateTimeFormat%.
Table 15: Resolved Options of DateTimeFormat Instances
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"
For web compatibility reasons, if the property "hourCycle" is set, the "hour12" property should be set to true when "hourCycle" is "h11" or "h12", or to false when "hourCycle" is "h23" or "h24".
Note 1
In this version of the API, the "timeZone" property will be the identifier of the host environment's time zone if no "timeZone" property was provided in the options object provided to the Intl.DateTimeFormat constructor. The first edition left the "timeZone" property undefined in this case.
Note 2
For compatibility with versions prior to the fifth edition, the "hour12" property is set in addition to the "hourCycle" property.
11.3.3 get Intl.DateTimeFormat.prototype.format
Intl.DateTimeFormat.prototype.format is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
Let dtf be the this value.
If the implementation supports the normative optional constructor mode of 4.3 Note 1, then
Let F be a new built-in function object as defined in DateTime Format Functions (11.5.4).
Set F.[[DateTimeFormat]] to dtf.
Set dtf.[[BoundFormat]] to F.
Return dtf.[[BoundFormat]].
Note
The returned function is bound to dtf so that it can be passed directly to Array.prototype.map or other functions.
This is considered a historical artefact, as part of a convention which is no longer followed for new features, but is preserved to maintain compatibility with existing programs.
[[HourCycle]]is a String value indicating whether the 12-hour format ("h11", "h12") or the 24-hour format ("h23", "h24") should be used. "h11" and "h23" start with hour 0 and go up to 11 and 23 respectively. "h12" and "h24" start with hour 1 and go up to 12 and 24. [[HourCycle]] is only used when [[DateTimeFormat]] has an [[hour]] field.
[[DateStyle]], [[TimeStyle]] are each either undefined, or a String value with values "full", "long", "medium", or "short".
Finally, Intl.DateTimeFormat instances have a [[BoundFormat]] internal slot that caches the function returned by the format accessor (11.3.3).
11.5 Abstract Operations for DateTimeFormat Objects
Several DateTimeFormat algorithms use values from the following table, which provides internal slots, property names and allowable values for the components of date and time formats:
The abstract operation DateTimeStyleFormat takes arguments dateStyle ("full", "long", "medium", "short", or undefined), timeStyle ("full", "long", "medium", "short", or undefined), and styles (a DateTime Styles Record) and returns a DateTime Format Record. styles is a Record from %Intl.DateTimeFormat%.[[LocaleData]].[[<locale>]].[[styles]].[[<calendar>]] for some locale locale and calendar calendar. It returns the appropriate format Record for date time formatting based on the parameters. It performs the following steps when called:
Assert: dateStyle is not undefined or timeStyle is not undefined.
If timeStyle is not undefined, then
Assert: timeStyle is one of "full", "long", "medium", or "short".
Let timeFormat be styles.[[Time]].[[<timeStyle>]].
If dateStyle is not undefined, then
Assert: dateStyle is one of "full", "long", "medium", or "short".
Let dateFormat be styles.[[Date]].[[<dateStyle>]].
If dateStyle is not undefined and timeStyle is not undefined, then
Add to format all fields from dateFormat except [[pattern]] and [[rangePatterns]].
Add to format all fields from timeFormat except [[pattern]], [[rangePatterns]], [[pattern12]], and [[rangePatterns12]], if present.
Let connector be styles.[[Connector]].[[<dateStyle>]].
Let pattern be the string connector with the substring"{0}" replaced with timeFormat.[[pattern]] and the substring"{1}" replaced with dateFormat.[[pattern]].
Set format.[[pattern]] to pattern.
If timeFormat has a [[pattern12]] field, then
Let pattern12 be the string connector with the substring"{0}" replaced with timeFormat.[[pattern12]] and the substring"{1}" replaced with dateFormat.[[pattern]].
Set format.[[pattern12]] to pattern12.
Let dateTimeRangeFormat be styles.[[DateTimeRangeFormat]].[[<dateStyle>]].[[<timeStyle>]].
Set format.[[rangePatterns]] to dateTimeRangeFormat.[[rangePatterns]].
If dateTimeRangeFormat has a [[rangePatterns12]] field, then
Set format.[[rangePatterns12]] to dateTimeRangeFormat.[[rangePatterns12]].
The "length" property of a DateTime format function is 1𝔽.
11.5.5 FormatDateTimePattern ( dateTimeFormat, format, pattern, epochNanoseconds )
The abstract operation FormatDateTimePattern takes arguments dateTimeFormat (an Intl.DateTimeFormat), format (a DateTime Format Record or a DateTime Range Pattern Format Record), pattern (a Pattern String), and epochNanoseconds (a BigInt) and returns a List of Records with fields [[Type]] (a String) and [[Value]] (a String). It creates the corresponding parts for the epoch time epochNanoseconds according to pattern and to the effective locale and the formatting options of dateTimeFormat and format. It performs the following steps when called:
Let fv be a String value representing the day period of tm in the form given by f; the String value depends upon the implementation and the effective locale of dateTimeFormat.
Append the Record { [[Type]]: p, [[Value]]: fv } to result.
Let fv be a String value representing v in the form given by f; the String value depends upon the implementation and the effective locale of dateTimeFormat. The String value may also depend on the value of the [[InDST]] field of tm if f is "short", "long", "shortOffset", or "longOffset". If the implementation does not have such a localized representation of f, then use the String value of v itself.
Append the Record { [[Type]]: p, [[Value]]: fv } to result.
Else if p matches a Property column of the row in Table 16, then
Let fv be a String value representing v in the form given by f; the String value depends upon the implementation and the effective locale and calendar of dateTimeFormat. If p is "month", then the String value may also depend on whether format.[[day]] is present. If the implementation does not have a localized representation of f, then use the String value of v itself.
Append the Record { [[Type]]: p, [[Value]]: fv } to result.
Else if p is "ampm", then
Let v be tm.[[Hour]].
If v is greater than 11, then
Let fv be an ILD String value representing "post meridiem".
Else,
Let fv be an ILD String value representing "ante meridiem".
Append the Record { [[Type]]: "dayPeriod", [[Value]]: fv } to result.
Append the Record { [[Type]]: "yearName", [[Value]]: fv } to result.
Else,
Let unknown be an implementation-, locale-, and numbering system-dependent String based on epochNanoseconds and p.
Append the Record { [[Type]]: "unknown", [[Value]]: unknown } to result.
Return result.
Note
It is recommended that implementations use the locale and calendar dependent strings provided by the Common Locale Data Repository (available at https://cldr.unicode.org/), and use CLDR "abbreviated" strings for DateTimeFormat "short" strings, and CLDR "wide" strings for DateTimeFormat "long" strings.
11.5.6 PartitionDateTimePattern ( dateTimeFormat, x )
The abstract operation PartitionDateTimePattern takes arguments dateTimeFormat (an Intl.DateTimeFormat) and x (a Number) and returns either a normal completion containing a List of Records with fields [[Type]] (a String) and [[Value]] (a String), or a throw completion. It interprets x as a time value as specified in ECMA-262, 21.4.1.1, and creates the corresponding parts according to the effective locale and the formatting options of dateTimeFormat. It performs the following steps when called:
If dateTimeFormat.[[HourCycle]] is "h11" or "h12", then
Let pattern be format.[[pattern12]].
Else,
Let pattern be format.[[pattern]].
Let result be FormatDateTimePattern(dateTimeFormat, format, pattern, epochNanoseconds).
Return result.
11.5.7 FormatDateTime ( dateTimeFormat, x )
The abstract operation FormatDateTime takes arguments dateTimeFormat (an Intl.DateTimeFormat) and x (a Number) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:
11.5.8 FormatDateTimeToParts ( dateTimeFormat, x )
The abstract operation FormatDateTimeToParts takes arguments dateTimeFormat (an Intl.DateTimeFormat) and x (a Number) and returns either a normal completion containing an Array or a throw completion. It performs the following steps when called:
11.5.9 PartitionDateTimeRangePattern ( dateTimeFormat, x, y )
The abstract operation PartitionDateTimeRangePattern takes arguments dateTimeFormat (an Intl.DateTimeFormat), x (a Number), and y (a Number) and returns either a normal completion containing a List of Records with fields [[Type]] (a String), [[Value]] (a String), and [[Source]] (a String), or a throw completion. It interprets x and y as time values as specified in ECMA-262, 21.4.1.1, and creates the corresponding parts according to the effective locale and the formatting options of dateTimeFormat. It performs the following steps when called:
Let tm1 be ToLocalTime(xEpochNanoseconds, dateTimeFormat.[[Calendar]], dateTimeFormat.[[TimeZone]]).
Let tm2 be ToLocalTime(yEpochNanoseconds, dateTimeFormat.[[Calendar]], dateTimeFormat.[[TimeZone]]).
Let format be dateTimeFormat.[[DateTimeFormat]].
If dateTimeFormat.[[HourCycle]] is "h11" or "h12", then
Let pattern be format.[[pattern12]].
Let rangePatterns be format.[[rangePatterns12]].
Else,
Let pattern be format.[[pattern]].
Let rangePatterns be format.[[rangePatterns]].
Let selectedRangePattern be undefined.
Let relevantFieldsEqual be true.
Let checkMoreFields be true.
For each row of Table 6, except the header row, in table order, do
Let fieldName be the name given in the Field Name column of the row.
If rangePatterns has a field whose name is fieldName, let rangePattern be rangePatterns' field whose name is fieldName; else let rangePattern be undefined.
If selectedRangePattern is not undefined and rangePattern is undefined, then
NOTE: Because there is no range pattern for differences at or below this field, no further checks will be performed.
Set checkMoreFields to false.
If fieldName is not equal to [[Default]] and relevantFieldsEqual is true and checkMoreFields is true, then
Set selectedRangePattern to rangePattern.
If fieldName is [[AmPm]], then
If tm1.[[Hour]] is less than 12, let v1 be "am"; else let v1 be "pm".
If tm2.[[Hour]] is less than 12, let v2 be "am"; else let v2 be "pm".
Else if fieldName is [[DayPeriod]], then
Let v1 be a String value representing the day period of tm1; the String value depends upon the implementation and the effective locale of dateTimeFormat.
Let v2 be a String value representing the day period of tm2; the String value depends upon the implementation and the effective locale of dateTimeFormat.
Else if fieldName is [[FractionalSecondDigits]], then
If format has a [[fractionalSecondDigits]] field, then
Let fractionalSecondDigits be format.[[fractionalSecondDigits]].
Set selectedRangePattern to rangePatterns.[[Default]].
For each Record { [[Pattern]], [[Source]] } rangePatternPart of selectedRangePattern.[[PatternParts]], do
Let pattern be rangePatternPart.[[Pattern]].
Let source be rangePatternPart.[[Source]].
If source is "startRange" or "shared", then
Let z be xEpochNanoseconds.
Else,
Let z be yEpochNanoseconds.
Let resultParts be FormatDateTimePattern(dateTimeFormat, selectedRangePattern, pattern, z).
For each Record { [[Type]], [[Value]] } r of resultParts, do
Append the Record { [[Type]]: r.[[Type]], [[Value]]: r.[[Value]], [[Source]]: source } to rangeResult.
Return rangeResult.
11.5.10 FormatDateTimeRange ( dateTimeFormat, x, y )
The abstract operation FormatDateTimeRange takes arguments dateTimeFormat (an Intl.DateTimeFormat), x (a Number), and y (a Number) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:
11.5.11 FormatDateTimeRangeToParts ( dateTimeFormat, x, y )
The abstract operation FormatDateTimeRangeToParts takes arguments dateTimeFormat (an Intl.DateTimeFormat), x (a Number), and y (a Number) and returns either a normal completion containing an Array or a throw completion. It performs the following steps when called:
11.5.12 ToLocalTime ( epochNs, calendar, timeZoneIdentifier )
The implementation-defined abstract operation ToLocalTime takes arguments epochNs (a BigInt), calendar (a String), and timeZoneIdentifier (a String) and returns a ToLocalTime Record. It performs the following steps when called:
Return a ToLocalTime Record with the fields calculated from tz for the given calendar. The calculations should use best available information about the specified calendar.
11.5.13 ToLocalTime Records
Each ToLocalTime Record has the fields defined in Table 17.
Calculate true or false using the best available information about the specified calendar and timeZoneIdentifier, including current and historical information from the IANA Time Zone Database about time zone offsets from UTC and daylight saving time rules.
The DisplayNames constructor is the %Intl.DisplayNames% intrinsic object and a standard built-in property of the Intl object. Behaviour common to all service constructor properties of the Intl object is specified in 9.1.
12.1.1 Intl.DisplayNames ( locales, options )
When the Intl.DisplayNames function is called with arguments locales and options, the following steps are taken:
If NewTarget is undefined, throw a TypeError exception.
Let displayNames be ? OrdinaryCreateFromConstructor(NewTarget, "%Intl.DisplayNames.prototype%", « [[InitializedDisplayNames]], [[Locale]], [[Style]], [[Type]], [[Fallback]], [[LanguageDisplay]], [[Fields]] »).
The value of the [[AvailableLocales]] internal slot is implementation-defined within the constraints described in 9.1.
The value of the [[RelevantExtensionKeys]] internal slot is « ».
The value of the [[ResolutionOptionDescriptors]] internal slot is « ».
The value of the [[LocaleData]] internal slot is implementation-defined within the constraints described in 9.1 and the following additional constraints:
[[LocaleData]].[[<locale>]] must have a [[types]] field for all locale values locale. The value of this field must be a Record, which must have fields with the names of all display name types: "language", "region", "script", "currency", "calendar", and "dateTimeField".
The value of the field "language" must be a Record which must have fields with the names of one of the valid language displays: "dialect" and "standard".
The language display fields under display name type "language" should contain Records which must have fields with the names of one of the valid display name styles: "narrow", "short", and "long".
The value of the fields "region", "script", "currency", "calendar", and "dateTimeField" must be Records, which must have fields with the names of all display name styles: "narrow", "short", and "long".
The display name style fields under display name type "language" should contain Records with keys corresponding to language codes that can be matched by the unicode_language_idUnicode locale nonterminal. The value of these fields must be string values.
The display name style fields under display name type "region" should contain Records with keys corresponding to region codes. The value of these fields must be string values.
The display name style fields under display name type "script" should contain Records with keys corresponding to script codes. The value of these fields must be string values.
The display name style fields under display name type "currency" should contain Records with keys corresponding to currency codes. The value of these fields must be string values.
The display name style fields under display name type "calendar" should contain Records with keys corresponding to calendar identifiers that can be matched by the typeUnicode locale nonterminal. The value of these fields must be string values.
The display name style fields under display name type "dateTimeField" should contain Records with keys corresponding to codes listed in Table 19. The value of these fields must be string values.
Note
It is recommended that implementations use the locale data provided by the Common Locale Data Repository (available at https://cldr.unicode.org/).
12.3 Properties of the Intl.DisplayNames Prototype Object
The Intl.DisplayNames prototype object is itself an ordinary object. %Intl.DisplayNames.prototype% is not an Intl.DisplayNames instance and does not have an [[InitializedDisplayNames]] internal slot or any of the other internal slots of Intl.DisplayNames instance objects.
12.3.1 Intl.DisplayNames.prototype.constructor
The initial value of Intl.DisplayNames.prototype.constructor is %Intl.DisplayNames%.
[[Locale]]is a String value with the language tag of the locale whose localization is used for formatting.
[[Style]] is one of the String values "narrow", "short", or "long", identifying the display name style used.
[[Type]] is one of the String values "language", "region", "script", "currency", "calendar", or "dateTimeField", identifying the type of the display names requested.
[[Fallback]] is one of the String values "code" or "none", identifying the fallback return when the system does not have the requested display name.
[[LanguageDisplay]] is one of the String values "dialect" or "standard", identifying the language display kind. It is only used when [[Type]] has the value "language".
[[Fields]] is a Record (see 12.2.3) which must have fields with keys corresponding to codes according to [[Style]], [[Type]], and [[LanguageDisplay]].
The abstract operation CanonicalCodeForDisplayNames takes arguments type (a String) and code (a String) and returns either a normal completion containing a String or a throw completion. It verifies that code represents a well-formed code according to type and returns the case-regularized form of code. It performs the following steps when called:
If type is "language", then
If code cannot be matched by the unicode_language_idUnicode locale nonterminal, throw a RangeError exception.
If code cannot be matched by the unicode_script_subtagUnicode locale nonterminal, throw a RangeError exception.
Assert: The length of code is 4, and every code unit of code represents an ASCII letter (0x0041 through 0x005A and 0x0061 through 0x007A, both inclusive).
The abstract operation IsValidDateTimeFieldCode takes argument field (a String) and returns a Boolean. It verifies that the field argument represents a valid date time field code. It performs the following steps when called:
If field is listed in the Code column of Table 19, return true.
Return false.
Table 19: Codes For Date Time Field of DisplayNames
Code
Description
"era"
The field indicating the era, e.g. AD or BC in the Gregorian or Julian calendar.
"year"
The field indicating the year (within an era).
"quarter"
The field indicating the quarter, e.g. Q2, 2nd quarter, etc.
"month"
The field indicating the month, e.g. Sep, September, etc.
"weekOfYear"
The field indicating the week number within a year.
"weekday"
The field indicating the day of week, e.g. Tue, Tuesday, etc.
"day"
The field indicating the day in month.
"dayPeriod"
The field indicating the day period, either am, pm, etc. or noon, evening, etc..
"hour"
The field indicating the hour.
"minute"
The field indicating the minute.
"second"
The field indicating the second.
"timeZoneName"
The field indicating the time zone name, e.g. PDT, Pacific Daylight Time, etc.
13 DurationFormat Objects
13.1 The Intl.DurationFormat Constructor
The DurationFormat constructor is the %Intl.DurationFormat% intrinsic object and a standard built-in property of the Intl object. Behaviour common to all service constructor properties of the Intl object is specified in 9.1.
The value of the [[AvailableLocales]] internal slot is implementation defined within the constraints described in 9.1.
The value of the [[RelevantExtensionKeys]] internal slot is « "nu" ».
The value of the [[ResolutionOptionDescriptors]] internal slot is « { [[Key]]: "nu", [[Property]]: "numberingSystem" } ».
The value of the [[LocaleData]] internal slot is implementation-defined within the constraints described in 9.1 and the following additional constraints for all locale values locale:
[[LocaleData]].[[<locale>]] must be a Record with fields [[nu]] and [[DigitalFormat]].
[[LocaleData]].[[<locale>]].[[nu]] must be a List as specified in 16.2.3 and must not include the values "native", "traditio", or "finance".
[[LocaleData]].[[<locale>]].[[DigitalFormat]] must be a Record with keys corresponding to each numbering system available for locale. Each value associated with one of those keys must be a Record containing the following fields:
[[HourMinuteSeparator]] must be a String value that is the appropriate separator between hours and minutes for that combination of locale and numbering system when using style "numeric" or "2-digit".
[[MinuteSecondSeparator]] must be a String value that is the appropriate separator between minutes and seconds for that combination of locale and numbering system when using style "numeric" or "2-digit".
[[TwoDigitHours]] must be a Boolean value indicating whether hours are always displayed using two digits when using style "numeric".
Note
It is recommended that implementations use the locale data provided by the Common Locale Data Repository (available at http://cldr.unicode.org/).
13.3 Properties of the Intl.DurationFormat Prototype Object
The Intl.DurationFormat prototype object is itself an ordinary object. %Intl.DurationFormat.prototype% is not an Intl.DurationFormat instance and does not have an [[InitializedDurationFormat]] internal slot or any of the other internal slots of Intl.DurationFormat instance objects.
13.3.1 Intl.DurationFormat.prototype.constructor
The initial value of Intl.DurationFormat.prototype.constructor is the intrinsic object %Intl.DurationFormat%.
NOTE: v.[[Style]] will be represented with a property named p (a plural Temporal unit), then v.[[Display]] will be represented with a property whose name suffixes p with "Display".
[[HourMinuteSeparator]]is a String value identifying the separator to be used between hours and minutes when both fields are displayed and both fields are formatted using numeric styles.
[[MinuteSecondSeparator]]is a String value identifying the separator to be used between minutes and seconds when both fields are displayed and both fields are formatted using numeric styles.
[[FractionalDigits]] is either undefined or a non-negative integer identifying the number of fractional digits to be used with numeric styles.
13.5 Abstract Operations for DurationFormat Objects
13.5.1 Duration Records
A Duration Record is a Record value used to represent a Duration.
Duration Records have the fields listed in Table 22
If years is not undefined, set result.[[Years]] to ? ToIntegerIfIntegral(years).
If years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, and nanoseconds are all undefined, throw a TypeError exception.
If IsValidDuration( result.[[Years]], result.[[Months]], result.[[Weeks]], result.[[Days]], result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]]) is false, then
Throw a RangeError exception.
Return result.
13.5.4 DurationSign ( duration )
The abstract operation DurationSign takes argument duration (a Duration Record) and returns -1, 0, or 1. It returns 1 if the most significant non-zero field in the duration argument is positive, and -1 if the most significant non-zero field is negative. If all of duration's fields are zero, it returns 0. It performs the following steps when called:
For each value v of « duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]] », do
The abstract operation IsValidDuration takes arguments years (an integer), months (an integer), weeks (an integer), days (an integer), hours (an integer), minutes (an integer), seconds (an integer), milliseconds (an integer), microseconds (an integer), and nanoseconds (an integer) and returns a Boolean. It returns true if its arguments form valid input from which to construct a Duration Record, and false otherwise. It performs the following steps when called:
Let sign be 0.
For each value v of « years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds », do
Let normalizedSeconds be days × 86,400 + hours × 3600 + minutes × 60 + seconds + ℝ(𝔽(milliseconds)) × 10-3 + ℝ(𝔽(microseconds)) × 10-6 + ℝ(𝔽(nanoseconds)) × 10-9.
NOTE: The above step cannot be implemented directly using floating-point arithmetic. Multiplying by 10-3, 10-6, and 10-9 respectively may be imprecise when milliseconds, microseconds, or nanoseconds is an unsafe integer. This multiplication can be implemented in C++ with an implementation of std::remquo() with sufficient bits in the quotient. String manipulation will also give an exact result, since the multiplication is by a power of 10.
The abstract operation GetDurationUnitOptions takes arguments unit (a String), options (an Object), baseStyle (a String), stylesList (a List of Strings), digitalBase (a String), prevStyle (a String), and twoDigitHours (a Boolean) and returns either a normal completion containing a Duration Unit Options Record, or a throw completion. It extracts the relevant options for any given unit from an Object and returns them as a Record. It performs the following steps when called:
Let style be ? GetOption(options, unit, string, stylesList, undefined).
Let displayDefault be "always".
If style is undefined, then
If baseStyle is "digital", then
Set style to digitalBase.
If unit is not one of "hours", "minutes", or "seconds", set displayDefault to "auto".
Else if prevStyle is one of "fractional", "numeric" or "2-digit", then
Set style to "numeric".
If unit is not "minutes" or "seconds", set displayDefault to "auto".
13.5.6.2 ValidateDurationUnitStyle ( unit, style, display, prevStyle )
The abstract operation ValidateDurationUnitStyle takes arguments unit (a String), style (a String), display (a String), and prevStyle (a String) and returns either a normal completion containingunused or a throw completion. It performs the following steps when called:
If display is "always" and style is "fractional", throw a RangeError exception.
If prevStyle is "fractional" and style is not "fractional", throw a RangeError exception.
If prevStyle is "numeric" or "2-digit" and style is not one of "fractional", "numeric" or "2-digit", throw a RangeError exception.
Return unused.
Note
unit is not referenced in the preceding algorithm, but it is recommended that implementations use it when constructing the message of a thrown exception.
The abstract operation ComputeFractionalDigits takes arguments durationFormat (a DurationFormat Object) and duration (a Duration Record) and returns a mathematical value. It computes the sum of all values in durationFormat units with "fractional" style, expressed as a fraction of the smallest unit of durationFormat that does not use "fractional" style. It performs the following steps when called:
Let result be 0.
Let exponent be 3.
For each row of Table 24, except the header row, in table order, do
Let unitOptions be the value of durationFormat's internal slot whose name is the Internal Slot value of the current row.
Let value be the value of duration's field whose name is the Value Field value of the current row.
Set result to result + (value / 10exponent).
Set exponent to exponent + 3.
Return result.
13.5.8 NextUnitFractional ( durationFormat, unit )
The abstract operation NextUnitFractional takes arguments durationFormat (a DurationFormat Object) and unit (a String) and returns a Boolean. It returns true if the next smallest unit uses the "fractional" style. It performs the following steps when called:
If unit is "seconds" and durationFormat.[[MillisecondsOptions]].[[Style]] is "fractional", return true.
If unit is "milliseconds" and durationFormat.[[MicrosecondsOptions]].[[Style]] is "fractional", return true.
If unit is "microseconds" and durationFormat.[[NanosecondsOptions]].[[Style]] is "fractional", return true.
The abstract operation FormatNumericHours takes arguments durationFormat (a DurationFormat object), hoursValue (an integer), and signDisplayed (a Boolean) and returns a List of Records. hoursValue is an integer indicating a number of hours. It creates the parts for hoursValue according to the effective locale and the formatting options of durationFormat. It performs the following steps when called:
The abstract operation FormatNumericMinutes takes arguments durationFormat (a DurationFormat Object), minutesValue (an integer), hoursDisplayed (a Boolean), and signDisplayed (a Boolean) and returns a List of Records. minutesValue is an integer indicating a number of minutes. It creates the parts for minutesValue according to the effective locale and the formatting options of durationFormat. It performs the following steps when called:
The abstract operation FormatNumericSeconds takes arguments durationFormat (a DurationFormat Object), secondsValue (a mathematical value), minutesDisplayed (a Boolean), and signDisplayed (a Boolean) and returns a List of Records. secondsValue is a mathematical value indicating a number of seconds. It creates the parts for secondsValue according to the effective locale and the formatting options of durationFormat. It performs the following steps when called:
The abstract operation FormatNumericUnits takes arguments durationFormat (a DurationFormat Object), duration (a Duration Record), firstNumericUnit (a String), and signDisplayed (a Boolean) and returns a List of Records. It creates the parts representing the elements of duration that use "numeric" or "2-digit" style according to the effective locale and the formatting options of durationFormat. It performs the following steps when called:
Assert: firstNumericUnit is "hours", "minutes", or "seconds".
The abstract operation ListFormatParts takes arguments durationFormat (a DurationFormat Object) and partitionedPartsList (a List of Lists of Records) and returns a List. It creates a List corresponding to the parts within the Lists in partitionedPartsList according to the effective locale and the formatting options of durationFormat. It performs the following steps when called:
The abstract operation PartitionDurationFormatPattern takes arguments durationFormat (a DurationFormat) and duration (a Duration Record) and returns a List. It creates the corresponding parts for duration according to the effective locale and the formatting options of durationFormat. It performs the following steps when called:
The ListFormat constructor is the %Intl.ListFormat% intrinsic object and a standard built-in property of the Intl object. Behaviour common to all service constructor properties of the Intl object is specified in 9.1.
The value of the [[AvailableLocales]] internal slot is implementation-defined within the constraints described in 9.1.
The value of the [[RelevantExtensionKeys]] internal slot is « ».
The value of the [[ResolutionOptionDescriptors]] internal slot is « ».
Note 1
Intl.ListFormat does not have any relevant extension keys.
The value of the [[LocaleData]] internal slot is implementation-defined within the constraints described in 9.1 and the following additional constraints, for each locale value locale in %Intl.ListFormat%.[[AvailableLocales]]:
[[LocaleData]].[[<locale>]] is a Record which has three fields [[conjunction]], [[disjunction]], and [[unit]]. Each of these is a Record which must have fields with the names of three formatting styles: [[long]], [[short]], and [[narrow]].
Each of those fields is considered a ListFormat template set, which must be a List of Records with fields named: [[Pair]], [[Start]], [[Middle]], and [[End]]. Each of those fields must be a template string as specified in LDML List Format Rules. Each template string must contain the substrings "{0}" and "{1}" exactly once. The substring"{0}" should occur before the substring"{1}".
Note 2
It is recommended that implementations use the locale data provided by the Common Locale Data Repository (available at https://cldr.unicode.org/). In LDML's listPattern, conjunction corresponds to "standard", disjunction corresponds to "or", and unit corresponds to "unit".
Note 3
Among the list types, conjunction stands for "and"-based lists (e.g., "A, B, and C"), disjunction stands for "or"-based lists (e.g., "A, B, or C"), and unit stands for lists of values with units (e.g., "5 pounds, 12 ounces").
14.3 Properties of the Intl.ListFormat Prototype Object
The Intl.ListFormat prototype object is itself an ordinary object. %Intl.ListFormat.prototype% is not an Intl.ListFormat instance and does not have an [[InitializedListFormat]] internal slot or any of the other internal slots of Intl.ListFormat instance objects.
14.3.1 Intl.ListFormat.prototype.constructor
The initial value of Intl.ListFormat.prototype.constructor is %Intl.ListFormat%.
The abstract operation DeconstructPattern takes arguments pattern (a Pattern String) and placeables (a Record) and returns a List.
It deconstructs the pattern string into a List of parts.
placeables is a Record whose keys are placeables tokens used in the pattern string, and values are parts Records (as from PartitionPattern) which will be used in the result List to represent the token part.
Example:
The abstract operation CreatePartsFromList takes arguments listFormat (an Intl.ListFormat) and list (a List of Strings) and returns a List of Records with fields [[Type]] ("element" or "literal") and [[Value]] (a String). It creates the corresponding List of parts according to the effective locale and the formatting options of listFormat. It performs the following steps when called:
The index n to select across multiple templates permits the conjunction to be dependent on the context, as in Spanish, where either "y" or "e" may be selected, depending on the following word.
14.5.3 FormatList ( listFormat, list )
The abstract operation FormatList takes arguments listFormat (an Intl.ListFormat) and list (a List of Strings) and returns a String. It performs the following steps when called:
The abstract operation FormatListToParts takes arguments listFormat (an Intl.ListFormat) and list (a List of Strings) and returns an Array. It performs the following steps when called:
This algorithm raises exceptions when it encounters values that are not Strings, because there is no obvious locale-aware coercion for arbitrary values.
15 Locale Objects
15.1 The Intl.Locale Constructor
The Locale constructor is the %Intl.Locale% intrinsic object and a standard built-in property of the Intl object.
15.1.1 Intl.Locale ( tag [ , options ] )
When the Intl.Locale function is called with an argument tag and an optional argument options, the following steps are taken:
If NewTarget is undefined, throw a TypeError exception.
Let localeExtensionKeys be %Intl.Locale%.[[LocaleExtensionKeys]].
Let internalSlotsList be « [[InitializedLocale]], [[Locale]], [[Calendar]], [[Collation]], [[HourCycle]], [[NumberingSystem]] ».
The abstract operation MakeLocaleRecord takes arguments tag (a language tag), options (a Record), and localeExtensionKeys (a List of Strings) and returns a Record. It constructs and returns a Record in which each element of localeExtensionKeys defines a corresponding field with data from any Unicode locale extension sequence of tag as overridden by a corresponding field of options, and which additionally includes a [[locale]] field containing a Unicode canonicalized locale identifier resulting from incorporating those fields into tag. It performs the following steps when called:
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.2.2 Internal slots
The value of the [[LocaleExtensionKeys]] internal slot is a List that must include all elements of « "ca", "co", "hc", "nu" », must additionally include any element of « "kf", "kn" » that is also an element of %Intl.Collator%.[[RelevantExtensionKeys]], and must not include any other elements.
15.3 Properties of the Intl.Locale Prototype Object
The Intl.Locale prototype object is itself an ordinary object. %Intl.Locale.prototype% is not an Intl.Locale instance and does not have an [[InitializedLocale]] internal slot or any of the other internal slots of Intl.Locale instance objects.
15.3.1 Intl.Locale.prototype.constructor
The initial value of Intl.Locale.prototype.constructor is %Intl.Locale%.
15.3.2 get Intl.Locale.prototype.baseName
Intl.Locale.prototype.baseName is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
Intl.Locale.prototype.calendar is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
This property only exists if %Intl.Locale%.[[LocaleExtensionKeys]] contains "kf".
Intl.Locale.prototype.caseFirst is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
Intl.Locale.prototype.collation is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
Intl.Locale.prototype.hourCycle is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
Intl.Locale.prototype.language is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
Intl.Locale.prototype.numberingSystem is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
This property only exists if %Intl.Locale%.[[LocaleExtensionKeys]] contains "kn".
Intl.Locale.prototype.numeric is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
[[Locale]]is a String value with the language tag of the locale whose localization is used for formatting.
[[Calendar]] is either undefined or a String value that is a well-formed Unicode Calendar Identifier in canonical form.
[[Collation]] is either undefined or a String value that is a well-formed Unicode Collation Identifier in canonical form.
[[HourCycle]] is either undefined or a String value that is a valid Unicode Hour Cycle Identifier in canonical form.
[[NumberingSystem]] is either undefined or a String value that is a well-formed Unicode Number System Identifier in canonical form.
[[CaseFirst]] is either undefined or one of the String values "upper", "lower", or "false". This internal slot only exists if the [[LocaleExtensionKeys]] internal slot of %Intl.Locale% contains "kf".
[[Numeric]] is either undefined or a Boolean value specifying whether numeric sorting is used by the locale. This internal slot only exists if the [[LocaleExtensionKeys]] internal slot of %Intl.Locale% contains "kn".
15.5 Abstract Operations for Locale Objects
15.5.1 GetLocaleBaseName ( locale )
The abstract operation GetLocaleBaseName takes argument locale (a String) and returns a String. It performs the following steps when called:
The abstract operation GetLocaleScript takes argument locale (a String) and returns a String or undefined. It performs the following steps when called:
The abstract operation GetLocaleRegion takes argument locale (a String) and returns a String or undefined. It performs the following steps when called:
NOTE: A unicode_region_subtagsubtag is only valid immediately after an initial unicode_language_subtagsubtag, optionally with a single unicode_script_subtagsubtag between them. In that position, unicode_region_subtag cannot be confused with any other valid subtag because all their productions are disjoint.
The abstract operation GetLocaleVariants takes argument locale (a String) and returns a String or undefined. It performs the following steps when called:
NOTE: Each subtag in baseName that is preceded by "-" is either a unicode_script_subtag, unicode_region_subtag, or unicode_variant_subtag, but any substring matched by unicode_variant_subtag is strictly longer than any prefix thereof which could also be matched by one of the other productions.
Let variants be the longest suffix of baseName that starts with a "-" followed by a substring that is matched by the unicode_variant_subtagUnicode locale nonterminal. If there is no such suffix, return undefined.
The NumberFormat constructor is the %Intl.NumberFormat% intrinsic object and a standard built-in property of the Intl object. Behaviour common to all service constructor properties of the Intl object is specified in 9.1.
The abstract operation SetNumberFormatDigitOptions takes arguments intlObj (an Object), options (an Object), mnfdDefault (an integer), mxfdDefault (an integer), and notation (a String) and returns either a normal completion containingunused or a throw completion. It populates the internal slots of intlObj that affect locale-independent number rounding (see 16.5.3). It performs the following steps when called:
Let mnid be ? GetNumberOption(options, "minimumIntegerDigits,", 1, 21, 1).
Let mnfd be ? Get(options, "minimumFractionDigits").
Let mxfd be ? Get(options, "maximumFractionDigits").
Let mnsd be ? Get(options, "minimumSignificantDigits").
Let mxsd be ? Get(options, "maximumSignificantDigits").
Set intlObj.[[MinimumIntegerDigits]] to mnid.
Let roundingIncrement be ? GetNumberOption(options, "roundingIncrement", 1, 5000, 1).
If roundingIncrement is not in « 1, 2, 5, 10, 20, 25, 50, 100, 200, 250, 500, 1000, 2000, 2500, 5000 », throw a RangeError exception.
Let roundingMode be ? GetOption(options, "roundingMode", string, « "ceil", "floor", "expand", "trunc", "halfCeil", "halfFloor", "halfExpand", "halfTrunc", "halfEven" », "halfExpand").
Let roundingPriority be ? GetOption(options, "roundingPriority", string, « "auto", "morePrecision", "lessPrecision" », "auto").
Let trailingZeroDisplay be ? GetOption(options, "trailingZeroDisplay", string, « "auto", "stripIfInteger" », "auto").
NOTE: All fields required by SetNumberFormatDigitOptions have now been read from options. The remainder of this AO interprets the options and may throw exceptions.
If roundingIncrement is not 1, set mxfdDefault to mnfdDefault.
Set intlObj.[[RoundingIncrement]] to roundingIncrement.
Set intlObj.[[RoundingMode]] to roundingMode.
Set intlObj.[[TrailingZeroDisplay]] to trailingZeroDisplay.
If mnsd is undefined and mxsd is undefined, let hasSd be false. Otherwise, let hasSd be true.
If mnfd is undefined and mxsd is undefined, let hasFd be false. Otherwise, let hasFd be true.
Let needSd be true.
Let needFd be true.
If roundingPriority is "auto", then
Set needSd to hasSd.
If needSd is true, or hasFd is false and notation is "compact", then
Set needFd to false.
If needSd is true, then
If hasSd is true, then
Set intlObj.[[MinimumSignificantDigits]] to ? DefaultNumberOption(mnsd, 1, 21, 1).
Set intlObj.[[MaximumSignificantDigits]] to ? DefaultNumberOption(mxsd, intlObj.[[MinimumSignificantDigits]], 21, 21).
The abstract operation SetNumberFormatUnitOptions takes arguments intlObj (an Intl.NumberFormat) and options (an Object) and returns either a normal completion containingunused or a throw completion. It resolves the user-specified options relating to units onto intlObj. It performs the following steps when called:
Let style be ? GetOption(options, "style", string, « "decimal", "percent", "currency", "unit" », "decimal").
Set intlObj.[[Style]] to style.
Let currency be ? GetOption(options, "currency", string, empty, undefined).
If currency is undefined, then
If style is "currency", throw a TypeError exception.
The value of the [[AvailableLocales]] internal slot is implementation-defined within the constraints described in 9.1.
The value of the [[RelevantExtensionKeys]] internal slot is « "nu" ».
The value of the [[ResolutionOptionDescriptors]] internal slot is « { [[Key]]: "nu", [[Property]]: "numberingSystem" } ».
Note 1
Unicode Technical Standard #35 Part 1 Core, Section 3.6.1 Key and Type Definitions describes three locale extension keys that are relevant to number formatting: "cu" for currency, "cf" for currency format style, and "nu" for numbering system. Intl.NumberFormat, however, requires that the currency of a currency format is specified through the currency property in the options objects, and the currency format style of a currency format is specified through the currencySign property in the options objects.
The value of the [[LocaleData]] internal slot is implementation-defined within the constraints described in 9.1 and the following additional constraints:
The List that is the value of the "nu" field of any locale field of [[LocaleData]] must not include the values "native", "traditio", or "finance".
[[LocaleData]].[[<locale>]] must have a [[patterns]] field for all locale values locale. The value of this field must be a Record, which must have fields with the names of the four number format styles: "decimal", "percent", "currency", and "unit".
The two fields "currency" and "unit" noted above must be Records with at least one field, "fallback".
The "currency" may have additional fields with keys corresponding to currency codes according to 6.3.
Each field of "currency" must be a Record with fields corresponding to the possible currencyDisplay values: "code", "symbol", "narrowSymbol", and "name".
Each of those fields must contain a Record with fields corresponding to the possible currencySign values: "standard" or "accounting". The "unit" field (of [[LocaleData]].[[<locale>]]) may have additional fields beyond the required field "fallback" with keys corresponding to core measurement unit identifiers corresponding to 6.6.
Each field of "unit" must be a Record with fields corresponding to the possible unitDisplay values: "narrow", "short", and "long".
All of the leaf fields so far described for the patterns tree ("decimal", "percent", great-grandchildren of "currency", and grandchildren of "unit") must be Records with the keys "positivePattern", "zeroPattern", and "negativePattern".
The value of the aforementioned fields (the sign-dependent pattern fields) must be string values that must contain the substring"{number}".
"positivePattern" must contain the substring"{plusSign}" but not "{minusSign}"; "negativePattern" must contain the substring"{minusSign}" but not "{plusSign}"; and "zeroPattern" must not contain either "{plusSign}" or "{minusSign}".
Additionally, the values within the "percent" field must also contain the substring"{percentSign}"; the values within the "currency" field must also contain one or more of the following substrings: "{currencyCode}", "{currencyPrefix}", or "{currencySuffix}"; and the values within the "unit" field must also contain one or more of the following substrings: "{unitPrefix}" or "{unitSuffix}".
The pattern strings, when interpreted as a sequence of UTF-16 encoded code points as described in ECMA-262, 6.1.4, must not contain any code points in the General Category "Number, decimal digit" as specified by the Unicode Standard.
[[LocaleData]].[[<locale>]] must also have a [[notationSubPatterns]] field for all locale values locale. The value of this field must be a Record, which must have two fields: [[scientific]] and [[compact]]. The [[scientific]] field must be a string value containing the substrings "{number}", "{scientificSeparator}", and "{scientificExponent}". The [[compact]] field must be a Record with two fields: "short" and "long". Each of these fields must be a Record with integer keys corresponding to all discrete magnitudes the implementation supports for compact notation. Each of these fields must be a string value which may contain the substring"{number}". Strings descended from "short" must contain the substring"{compactSymbol}", and strings descended from "long" must contain the substring"{compactName}".
Note 2
It is recommended that implementations use the locale data provided by the Common Locale Data Repository (available at https://cldr.unicode.org/).
16.3 Properties of the Intl.NumberFormat Prototype Object
The Intl.NumberFormat prototype object is itself an ordinary object. %Intl.NumberFormat.prototype% is not an Intl.NumberFormat instance and does not have an [[InitializedNumberFormat]] internal slot or any of the other internal slots of Intl.NumberFormat instance objects.
16.3.1 Intl.NumberFormat.prototype.constructor
The initial value of Intl.NumberFormat.prototype.constructor is %Intl.NumberFormat%.
Table 26: Resolved Options of NumberFormat Instances
Internal Slot
Property
Conversion
[[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 is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
Let nf be the this value.
If the implementation supports the normative optional constructor mode of 4.3 Note 1, then
Let F be a new built-in function object as defined in Number Format Functions (16.5.2).
Set F.[[NumberFormat]] to nf.
Set nf.[[BoundFormat]] to F.
Return nf.[[BoundFormat]].
Note
The returned function is bound to nf so that it can be passed directly to Array.prototype.map or other functions.
This is considered a historical artefact, as part of a convention which is no longer followed for new features, but is preserved to maintain compatibility with existing programs.
16.3.4 Intl.NumberFormat.prototype.formatRange ( start, end )
When the formatRange method is called with arguments start and end, the following steps are taken:
[[Locale]]is a String value with the language tag of the locale whose localization is used for formatting.
[[LocaleData]] is a Record representing the data available to the implementation for formatting. It is the value of an entry in %Intl.NumberFormat%.[[LocaleData]] associated with either the value of [[Locale]] or a prefix thereof.
[[Style]] is one of the String values "decimal", "currency", "percent", or "unit", identifying the type of quantity being measured.
[[Currency]]is a String value with the currency code identifying the currency to be used if formatting with the "currency" unit type. It is only used when [[Style]] has the value "currency".
[[CurrencyDisplay]] is one of the String values "code", "symbol", "narrowSymbol", or "name", specifying whether to display the currency as an ISO 4217 alphabetic currency code, a localized currency symbol, or a localized currency name if formatting with the "currency" style. It is only used when [[Style]] has the value "currency".
[[CurrencySign]] is one of the String values "standard" or "accounting", specifying whether to render negative numbers in accounting format, often signified by parenthesis. It is only used when [[Style]] has the value "currency" and when [[SignDisplay]] is not "never".
[[Unit]] is a core unit identifier. It is only used when [[Style]] has the value "unit".
[[UnitDisplay]] is one of the String values "short", "narrow", or "long", specifying whether to display the unit as a symbol, narrow symbol, or localized long name if formatting with the "unit" style. It is only used when [[Style]] has the value "unit".
[[MinimumIntegerDigits]] is a non-negative integer indicating the minimum integer digits to be used. Numbers will be padded with leading zeroes if necessary.
[[MinimumFractionDigits]] and [[MaximumFractionDigits]] are non-negative integers indicating the minimum and maximum fraction digits to be used. Numbers will be rounded or padded with trailing zeroes if necessary. These properties are only used when [[RoundingType]] is fraction-digits, more-precision, or less-precision.
[[MinimumSignificantDigits]] and [[MaximumSignificantDigits]] are positive integers indicating the minimum and maximum fraction digits to be shown. If present, the formatter uses however many fraction digits are required to display the specified number of significant digits. These properties are only used when [[RoundingType]] is significant-digits, more-precision, or less-precision.
[[UseGrouping]]is a Boolean or String value indicating the conditions under which a grouping separator should be used. The positions of grouping separators, and whether to display grouping separators for a formatted number, is implementation-defined. A value "always" hints the implementation to display grouping separators if possible; "min2", if there are at least 2 digits in a group; "auto", if the locale prefers to use grouping separators for the formatted number. A value false disables grouping separators.
[[RoundingType]] is one of the values fraction-digits, significant-digits, more-precision, or less-precision, indicating which rounding strategy to use. If fraction-digits, formatted numbers are rounded according to [[MinimumFractionDigits]] and [[MaximumFractionDigits]], as described above. If significant-digits, formatted numbers are rounded according to [[MinimumSignificantDigits]] and [[MaximumSignificantDigits]] as described above. If more-precision or less-precision, all four of those settings are used, with specific rules for disambiguating when to use one set versus the other. [[RoundingType]] is derived from the "roundingPriority" option.
[[ComputedRoundingPriority]] is one of the String values "auto", "morePrecision", or "lessPrecision". It is only used in 16.3.2 to convert [[RoundingType]] back to a valid "roundingPriority" option.
[[Notation]] is one of the String values "standard", "scientific", "engineering", or "compact", specifying whether the formatted number should be displayed without scaling, scaled to the units place with the power of ten in scientific notation, scaled to the nearest thousand with the power of ten in scientific notation, or scaled to the nearest ILD compact decimal notation power of ten with the corresponding compact decimal notation affix.
[[CompactDisplay]] is one of the String values "short" or "long", specifying whether to display compact notation affixes in short form ("5K") or long form ("5 thousand") if formatting with the "compact" notation. It is only used when [[Notation]] has the value "compact".
[[SignDisplay]] is one of the String values "auto", "always", "never", "exceptZero", or "negative", specifying when to include a sign (with non-"auto" options respectively corresponding with inclusion always, never, only for non-zero numbers, or only for non-zero negative numbers).
In scientific notation, this slot affects the sign display of the mantissa but not the exponent.
[[RoundingIncrement]] is an integer that evenly divides 10, 100, 1000, or 10000 into tenths, fifths, quarters, or halves. It indicates the increment at which rounding should take place relative to the calculated rounding magnitude. For example, if [[MaximumFractionDigits]] is 2 and [[RoundingIncrement]] is 5, then formatted numbers are rounded to the nearest 0.05 ("nickel rounding").
[[RoundingMode]] is a rounding mode, one of the String values in the Identifier column of Table 27.
[[TrailingZeroDisplay]] is one of the String values "auto" or "stripIfInteger", indicating whether to strip trailing zeros if the formatted number is an integer (i.e., has no non-zero fraction digit).
Table 27: Rounding modes in Intl.NumberFormat
Identifier
Description
Examples: Round to 0 fraction digits
-1.5
0.4
0.5
0.6
1.5
"ceil"
Toward positive infinity
⬆️ [-1]
⬆️ [1]
⬆️ [1]
⬆️ [1]
⬆️ [2]
"floor"
Toward negative infinity
⬇️ [-2]
⬇️ [0]
⬇️ [0]
⬇️ [0]
⬇️ [1]
"expand"
Away from zero
⬇️ [-2]
⬆️ [1]
⬆️ [1]
⬆️ [1]
⬆️ [2]
"trunc"
Toward zero
⬆️ [-1]
⬇️ [0]
⬇️ [0]
⬇️ [0]
⬇️ [1]
"halfCeil"
Ties toward positive infinity
⬆️ [-1]
⬇️ [0]
⬆️ [1]
⬆️ [1]
⬆️ [2]
"halfFloor"
Ties toward negative infinity
⬇️ [-2]
⬇️ [0]
⬇️ [0]
⬆️ [1]
⬇️ [1]
"halfExpand"
Ties away from zero
⬇️ [-2]
⬇️ [0]
⬆️ [1]
⬆️ [1]
⬆️ [2]
"halfTrunc"
Ties toward zero
⬆️ [-1]
⬇️ [0]
⬇️ [0]
⬆️ [1]
⬇️ [1]
"halfEven"
Ties toward an even rounding increment multiple
⬇️ [-2]
⬇️ [0]
⬇️ [0]
⬆️ [1]
⬆️ [2]
Note
The examples are illustrative of the unique behaviour of each option. ⬆️ means "resolves toward positive infinity"; ⬇️ means "resolves toward negative infinity".
Finally, Intl.NumberFormat instances have a [[BoundFormat]] internal slot that caches the function returned by the format accessor (16.3.3).
16.5 Abstract Operations for NumberFormat Objects
16.5.1 CurrencyDigits ( currency )
The implementation-defined abstract operation CurrencyDigits takes argument currency (a String) and returns a non-negative integer. It performs the following steps when called:
Return a non-negative integer indicating the number of fractional digits used when formatting quantities of the currency corresponding to currency. If there is no available information on the number of digits to be used, return 2.
16.5.2 Number Format Functions
A Number format function is an anonymous built-in function that has a [[NumberFormat]] internal slot.
When a Number format function F is called with optional argument value, the following steps are taken:
Let nf be F.[[NumberFormat]].
Assert: nfis an Object and nf has an [[InitializedNumberFormat]] internal slot.
The "length" property of a Number format function is 1𝔽.
16.5.3 FormatNumericToString ( intlObject, x )
The abstract operation FormatNumericToString takes arguments intlObject (an Object) and x (a mathematical value or negative-zero) and returns a Record with fields [[RoundedNumber]] (a mathematical value or negative-zero) and [[FormattedString]] (a String). It rounds x to an Intl mathematical value according to the internal slots of intlObject. The [[RoundedNumber]] field contains the rounded result value and the [[FormattedString]] field contains a String value representation of that result formatted according to the internal slots of intlObject. It performs the following steps when called:
Assert: intlObject has [[RoundingMode]], [[RoundingType]], [[MinimumSignificantDigits]], [[MaximumSignificantDigits]], [[MinimumIntegerDigits]], [[MinimumFractionDigits]], [[MaximumFractionDigits]], [[RoundingIncrement]], and [[TrailingZeroDisplay]] internal slots.
If intlObject.[[RoundingType]] is significant-digits, then
Let result be ToRawPrecision(x, intlObject.[[MinimumSignificantDigits]], intlObject.[[MaximumSignificantDigits]], unsignedRoundingMode).
Else if intlObject.[[RoundingType]] is fraction-digits, then
Let result be ToRawFixed(x, intlObject.[[MinimumFractionDigits]], intlObject.[[MaximumFractionDigits]], intlObject.[[RoundingIncrement]], unsignedRoundingMode).
Else,
Let sResult be ToRawPrecision(x, intlObject.[[MinimumSignificantDigits]], intlObject.[[MaximumSignificantDigits]], unsignedRoundingMode).
Let fResult be ToRawFixed(x, intlObject.[[MinimumFractionDigits]], intlObject.[[MaximumFractionDigits]], intlObject.[[RoundingIncrement]], unsignedRoundingMode).
If fResult.[[RoundingMagnitude]] < sResult.[[RoundingMagnitude]], let fixedIsMorePrecise be true; else let fixedIsMorePrecise be false.
If intlObject.[[RoundingType]] is more-precision and fixedIsMorePrecise is true, then
Let result be fResult.
Else if intlObject.[[RoundingType]] is less-precision and fixedIsMorePrecise is false, then
Let result be fResult.
Else,
Let result be sResult.
Set x to result.[[RoundedNumber]].
Let string be result.[[FormattedString]].
If intlObject.[[TrailingZeroDisplay]] is "stripIfInteger" and xmodulo 1 = 0, then
If x is 0, set x to negative-zero. Otherwise, set x to -x.
Return the Record { [[RoundedNumber]]: x, [[FormattedString]]: string }.
16.5.4 PartitionNumberPattern ( numberFormat, x )
The abstract operation PartitionNumberPattern takes arguments numberFormat (an object initialized as a NumberFormat) and x (an Intl mathematical value) and returns a List of Records with fields [[Type]] (a String) and [[Value]] (a String). It creates the parts representing the mathematical value ofx according to the effective locale and the formatting options of numberFormat. It performs the following steps when called:
Let exponent be 0.
If x is not-a-number, then
Let n be an ILD String value indicating the NaN value.
Else if x is positive-infinity, then
Let n be an ILD String value indicating positive infinity.
Else if x is negative-infinity, then
Let n be an ILD String value indicating negative infinity.
Let plusSignSymbol be the ILND String representing the plus sign.
Append the Record { [[Type]]: "plusSign", [[Value]]: plusSignSymbol } to result.
Else if p is "minusSign", then
Let minusSignSymbol be the ILND String representing the minus sign.
Append the Record { [[Type]]: "minusSign", [[Value]]: minusSignSymbol } to result.
Else if p is "percentSign" and numberFormat.[[Style]] is "percent", then
Let percentSignSymbol be the ILND String representing the percent sign.
Append the Record { [[Type]]: "percentSign", [[Value]]: percentSignSymbol } to result.
Else if p is "unitPrefix" and numberFormat.[[Style]] is "unit", then
Let unit be numberFormat.[[Unit]].
Let unitDisplay be numberFormat.[[UnitDisplay]].
Let mu be an ILD String value representing unit before x in unitDisplay form, which may depend on x in languages having different plural forms.
Append the Record { [[Type]]: "unit", [[Value]]: mu } to result.
Else if p is "unitSuffix" and numberFormat.[[Style]] is "unit", then
Let unit be numberFormat.[[Unit]].
Let unitDisplay be numberFormat.[[UnitDisplay]].
Let mu be an ILD String value representing unit after x in unitDisplay form, which may depend on x in languages having different plural forms.
Append the Record { [[Type]]: "unit", [[Value]]: mu } to result.
Else if p is "currencyCode" and numberFormat.[[Style]] is "currency", then
Let currency be numberFormat.[[Currency]].
Let cd be currency.
Append the Record { [[Type]]: "currency", [[Value]]: cd } to result.
Else if p is "currencyPrefix" and numberFormat.[[Style]] is "currency", then
Let currency be numberFormat.[[Currency]].
Let currencyDisplay be numberFormat.[[CurrencyDisplay]].
Let cd be an ILD String value representing currency before x in currencyDisplay form, which may depend on x in languages having different plural forms.
Append the Record { [[Type]]: "currency", [[Value]]: cd } to result.
Else if p is "currencySuffix" and numberFormat.[[Style]] is "currency", then
Let currency be numberFormat.[[Currency]].
Let currencyDisplay be numberFormat.[[CurrencyDisplay]].
Let cd be an ILD String value representing currency after x in currencyDisplay form, which may depend on x in languages having different plural forms. If the implementation does not have such a representation of currency, use currency itself.
Append the Record { [[Type]]: "currency", [[Value]]: cd } to result.
Append the Record { [[Type]]: "unknown", [[Value]]: unknown } to result.
Return result.
16.5.5 PartitionNotationSubPattern ( numberFormat, x, n, exponent )
The abstract operation PartitionNotationSubPattern takes arguments numberFormat (an Intl.NumberFormat), x (an Intl mathematical value), n (a String), and exponent (an integer) and returns a List of Records with fields [[Type]] (a String) and [[Value]] (a String).
x is an Intl mathematical value after rounding is applied and n is an intermediate formatted string.
It creates the corresponding parts for the number and notation according to the effective locale and the formatting options of numberFormat.
It performs the following steps when called:
If decimalSepIndex is not not-found and decimalSepIndex > 0, then
Let integer be the substring of n from 0 to decimalSepIndex.
Let fraction be the substring of n from decimalSepIndex + 1.
Else,
Let integer be n.
Let fraction be undefined.
If the numberFormat.[[UseGrouping]] is false, then
Append the Record { [[Type]]: "integer", [[Value]]: integer } to result.
Else,
Let groupSepSymbol be the ILND String representing the grouping separator.
Let groups be a List whose elements are, in left to right order, the substrings defined by ILND set of locations within the integer, which may depend on the value of numberFormat.[[UseGrouping]].
Assert: The number of elements in groupsList is greater than 0.
Append the Record { [[Type]]: "group", [[Value]]: groupSepSymbol } to result.
If fraction is not undefined, then
Let decimalSepSymbol be the ILND String representing the decimal separator.
Append the Record { [[Type]]: "decimal", [[Value]]: decimalSepSymbol } to result.
Append the Record { [[Type]]: "fraction", [[Value]]: fraction } to result.
Else if p is "compactSymbol", then
Let compactSymbol be an ILD string representing exponent in short form, which may depend on x in languages having different plural forms. The implementation must be able to provide this string, or else the pattern would not have a "{compactSymbol}" placeholder.
Append the Record { [[Type]]: "compact", [[Value]]: compactSymbol } to result.
Else if p is "compactName", then
Let compactName be an ILD string representing exponent in long form, which may depend on x in languages having different plural forms. The implementation must be able to provide this string, or else the pattern would not have a "{compactName}" placeholder.
Append the Record { [[Type]]: "compact", [[Value]]: compactName } to result.
Else if p is "scientificSeparator", then
Let scientificSeparator be the ILND String representing the exponent separator.
Append the Record { [[Type]]: "exponentSeparator", [[Value]]: scientificSeparator } to result.
Else if p is "scientificExponent", then
If exponent < 0, then
Let minusSignSymbol be the ILND String representing the minus sign.
Append the Record { [[Type]]: "exponentMinusSign", [[Value]]: minusSignSymbol } to result.
Let exponent be -exponent.
Let exponentResult be ToRawFixed(exponent, 0, 0, 1, undefined).
Append the Record { [[Type]]: "exponentInteger", [[Value]]: exponentResult.[[FormattedString]] } to result.
The computations rely on ILD and ILND String values and locations within numeric strings that depend on the effective locale of numberFormat, or upon the effective locale and numbering system of numberFormat. The ILD and ILND String values mentioned, other than those for currency names, must not contain any code points in the General Category "Number, decimal digit" as specified by the Unicode Standard.
Note 2
It is recommended that implementations use the locale provided by the Common Locale Data Repository (available at https://cldr.unicode.org/).
16.5.6 FormatNumeric ( numberFormat, x )
The abstract operation FormatNumeric takes arguments numberFormat (an Intl.NumberFormat) and x (an Intl mathematical value) and returns a String. It performs the following steps when called:
The abstract operation FormatNumericToParts takes arguments numberFormat (an Intl.NumberFormat) and x (an Intl mathematical value) and returns an Array. It performs the following steps when called:
The abstract operation ToRawPrecision takes arguments x (a non-negative mathematical value), minPrecision (an integer in the inclusive interval from 1 to 21), maxPrecision (an integer in the inclusive interval from 1 to 21), and unsignedRoundingMode (a specification type from the Unsigned Rounding Mode column of Table 29, or undefined) and returns a Record with fields [[FormattedString]] (a String), [[RoundedNumber]] (a mathematical value), [[IntegerDigitsCount]] (an integer), and [[RoundingMagnitude]] (an integer).
It involves solving the following equation, which returns a valid mathematical value given integer inputs:
ToRawPrecisionFn(n, e, p) = n × 10e–p+1
where 10p–1 ≤ n < 10p
It performs the following steps when called:
Let p be maxPrecision.
If x = 0, then
Let m be the String consisting of p occurrences of the code unit 0x0030 (DIGIT ZERO).
The abstract operation ToRawFixed takes arguments x (a non-negative mathematical value), minFraction (an integer in the inclusive interval from 0 to 100), maxFraction (an integer in the inclusive interval from 0 to 100), roundingIncrement (an integer), and unsignedRoundingMode (a specification type from the Unsigned Rounding Mode column of Table 29, or undefined) and returns a Record with fields [[FormattedString]] (a String), [[RoundedNumber]] (a mathematical value), [[IntegerDigitsCount]] (an integer), and [[RoundingMagnitude]] (an integer).
It involves solving the following equation, which returns a valid mathematical value given integer inputs:
16.5.11 GetNumberFormatPattern ( numberFormat, x )
The abstract operation GetNumberFormatPattern takes arguments numberFormat (an Intl.NumberFormat) and x (an Intl mathematical value) and returns a String.
It considers the resolved unit-related options in the number format object along with the final scaled and rounded number being formatted (an Intl mathematical value) and returns a pattern, a String value as described in 16.2.3.
It performs the following steps when called:
Let resolvedLocaleData be numberFormat.[[LocaleData]].
The abstract operation GetNotationSubPattern takes arguments numberFormat (an Intl.NumberFormat) and exponent (an integer) and returns a String.
It considers the resolved notation and exponent, and returns a String value for the notation sub pattern as described in 16.2.3.
It performs the following steps when called:
Let resolvedLocaleData be numberFormat.[[LocaleData]].
Let notationSubPatterns be resolvedLocaleData.[[notationSubPatterns]].
Let compactDisplay be numberFormat.[[CompactDisplay]].
Let compactPatterns be notationSubPatterns.[[compact]].[[<compactDisplay>]].
Return compactPatterns.[[<exponent>]].
Else,
Return "{number}".
16.5.13 ComputeExponent ( numberFormat, x )
The abstract operation ComputeExponent takes arguments numberFormat (an Intl.NumberFormat) and x (a mathematical value) and returns an integer.
It computes an exponent (power of ten) by which to scale x according to the number formatting settings.
It handles cases such as 999 rounding up to 1000, requiring a different exponent.
It performs the following steps when called:
If x = 0, then
Return 0.
If x < 0, then
Let x = -x.
Let magnitude be the base 10 logarithm of x rounded down to the nearest integer.
The abstract operation ComputeExponentForMagnitude takes arguments numberFormat (an Intl.NumberFormat) and magnitude (an integer) and returns an integer.
It computes an exponent by which to scale a number of the given magnitude (power of ten of the most significant digit) according to the locale and the desired notation (scientific, engineering, or compact).
It performs the following steps when called:
Let notation be numberFormat.[[Notation]].
If notation is "standard", then
Return 0.
Else if notation is "scientific", then
Return magnitude.
Else if notation is "engineering", then
Let thousands be the greatest integer that is not greater than magnitude / 3.
The abstract operation ToIntlMathematicalValue takes argument value (an ECMAScript language value) and returns either a normal completion containing an Intl mathematical value or a throw completion.
It returns value converted to an Intl mathematical value, which is a mathematical value together with positive-infinity, negative-infinity, not-a-number, and negative-zero.
This abstract operation is similar to 7.1.3, but a mathematical value can be returned instead of a Number or BigInt, so that exact decimal values can be represented.
It performs the following steps when called:
The abstract operation GetUnsignedRoundingMode takes arguments roundingMode (a rounding mode) and sign (negative or positive) and returns a specification type from the Unsigned Rounding Mode column of Table 29. It returns the rounding mode that should be applied to the absolute value of a number to produce the same result as if roundingMode were applied to the signed value of the number (negative if sign is negative, or positive otherwise). It performs the following steps when called:
Return the specification type in the Unsigned Rounding Mode column of Table 29 for the row where the value in the Identifier column is roundingMode and the value in the Sign column is sign.
The abstract operation ApplyUnsignedRoundingMode takes arguments x (a mathematical value), r1 (a mathematical value), r2 (a mathematical value), and unsignedRoundingMode (a specification type from the Unsigned Rounding Mode column of Table 29, or undefined) and returns a mathematical value. It considers x, bracketed below by r1 and above by r2, and returns either r1 or r2 according to unsignedRoundingMode. It performs the following steps when called:
16.5.19 PartitionNumberRangePattern ( numberFormat, x, y )
The abstract operation PartitionNumberRangePattern takes arguments numberFormat (an Intl.NumberFormat), x (an Intl mathematical value), and y (an Intl mathematical value) and returns either a normal completion containing a List of Records with fields [[Type]] (a String), [[Value]] (a String), and [[Source]] (a String), or a throw completion. It creates the parts for a localized number range according to x, y, and the formatting options of numberFormat. It performs the following steps when called:
If x is not-a-number or y is not-a-number, throw a RangeError exception.
16.5.20 FormatApproximately ( numberFormat, result )
The abstract operation FormatApproximately takes arguments numberFormat (an Intl.NumberFormat) and result (a List of Records with fields [[Type]] (a String) and [[Value]] (a String)) and returns a List of Records with fields [[Type]] (a String) and [[Value]] (a String). It modifies result, which must be a List of Record values as described in PartitionNumberPattern, by adding a new Record for the approximately sign, which may depend on numberFormat. It performs the following steps when called:
Let approximatelySign be an ILND String value used to signify that a number is approximate.
If approximatelySign is not empty, insert the Record { [[Type]]: "approximatelySign", [[Value]]: approximatelySign } at an ILND index in result. For example, if numberFormat has [[Locale]]"en-US" and [[NumberingSystem]]"latn" and [[Style]]"decimal", the new Record might be inserted before the first element of result.
Return result.
16.5.21 CollapseNumberRange ( numberFormat, result )
The implementation-defined abstract operation CollapseNumberRange takes arguments numberFormat (an Intl.NumberFormat) and result (a List of Records with fields [[Type]] (a String), [[Value]] (a String), and [[Source]] (a String)) and returns a List of Records with fields [[Type]] (a String), [[Value]] (a String), and [[Source]] (a String). It modifies result (which must be a List of Records as constructed within PartitionNumberRangePattern) according to the effective locale and the formatting options of numberFormat by removing redundant information, resolving internal inconsistency, replacing characters when necessary, and inserting spacing when necessary. It then returns the resulting List. The algorithm is ILND, but must not introduce ambiguity that would cause the result of Intl.NumberFormat.prototype.formatRange ( start, end ) with arguments List « start1, end1 » to equal the result with arguments List « start2, end2 » if the results for those same arguments Lists would not be equal with a trivial implementation of CollapseNumberRange that always returns result unmodified.
For example, an implementation may remove the Record representing a currency symbol after a range separator to convert a resultsList representing "$3–$5" into one representing "$3–5".
An implementation may also modify Record[[Value]] fields for grammatical correctness; for example, converting a resultsList representing "0.5 miles–1 mile" into one representing "0.5–1 miles".
Returning result unmodified is guaranteed to be a correct implementation of CollapseNumberRange.
The PluralRules constructor is the %Intl.PluralRules% intrinsic object and a standard built-in property of the Intl object. Behaviour common to all service constructor properties of the Intl object is specified in 9.1.
The value of the [[LocaleData]] internal slot is implementation-defined within the constraints described in 9.1.
Note 2
It is recommended that implementations use the locale data provided by the Common Locale Data Repository (available at https://cldr.unicode.org/).
17.3 Properties of the Intl.PluralRules Prototype Object
The Intl.PluralRules prototype object is itself an ordinary object. %Intl.PluralRules.prototype% is not an Intl.PluralRules instance and does not have an [[InitializedPluralRules]] internal slot or any of the other internal slots of Intl.PluralRules instance objects.
17.3.1 Intl.PluralRules.prototype.constructor
The initial value of Intl.PluralRules.prototype.constructor is %Intl.PluralRules%.
Let pluralCategories be a List of Strings containing all possible results of PluralRuleSelect for the selected locale pr.[[Locale]], sorted according to the following order: "zero", "one", "two", "few", "many", "other".
For each row of Table 30, except the header row, in table order, do
[[Locale]]is a String value with the language tag of the locale whose localization is used by the plural rules.
[[Type]] is one of the String values "cardinal" or "ordinal", identifying the plural rules used.
[[MinimumIntegerDigits]] is a non-negative integer indicating the minimum integer digits to be used.
[[MinimumFractionDigits]] and [[MaximumFractionDigits]] are non-negative integers indicating the minimum and maximum fraction digits to be used. Numbers will be rounded or padded with trailing zeroes if necessary.
[[MinimumSignificantDigits]] and [[MaximumSignificantDigits]] are positive integers indicating the minimum and maximum fraction digits to be used. Either none or both of these properties are present; if they are, they override minimum and maximum integer and fraction digits.
[[RoundingType]] is one of the values fraction-digits, significant-digits, more-precision, or less-precision, indicating which rounding strategy to use, as discussed in 16.4.
[[ComputedRoundingPriority]] is one of the String values "auto", "morePrecision", or "lessPrecision". It is only used in 17.3.2 to convert [[RoundingType]] back to a valid "roundingPriority" option.
[[RoundingIncrement]] is an integer that evenly divides 10, 100, 1000, or 10000 into tenths, fifths, quarters, or halves. It indicates the increment at which rounding should take place relative to the calculated rounding magnitude. For example, if [[MaximumFractionDigits]] is 2 and [[RoundingIncrement]] is 5, then formatted numbers are rounded to the nearest 0.05 ("nickel rounding").
[[RoundingMode]] identifies the rounding mode to use.
[[TrailingZeroDisplay]] is one of the String values "auto" or "stripIfInteger", indicating whether to strip trailing zeros if the formatted number is an integer (i.e., has no non-zero fraction digit).
17.5 Abstract Operations for PluralRules Objects
17.5.1 PluralRuleSelect ( locale, type, s )
The implementation-defined abstract operation PluralRuleSelect takes arguments locale (a language tag), type ("cardinal" or "ordinal"), and s (a decimal String) and returns "zero", "one", "two", "few", "many", or "other". The returned String characterizes the plural category of s according to the effective locale and the options of pluralRules.
17.5.2 ResolvePlural ( pluralRules, n )
The abstract operation ResolvePlural takes arguments pluralRules (an Intl.PluralRules) and n (a Number) and returns a Record with fields [[PluralCategory]] ("zero", "one", "two", "few", "many", or "other") and [[FormattedString]] (a String). The returned Record contains two string-valued fields describing n according to the effective locale and the options of pluralRules: [[PluralCategory]] characterizing its plural category, and [[FormattedString]] containing its formatted representation. It performs the following steps when called:
The implementation-defined abstract operation PluralRuleSelectRange takes arguments locale (a String), type ("cardinal" or "ordinal"), xp ("zero", "one", "two", "few", "many", or "other"), and yp ("zero", "one", "two", "few", "many", or "other") and returns "zero", "one", "two", "few", "many", or "other". It performs an implementation-dependent algorithm to map the plural category String values xp and yp, respectively characterizing the start and end of a range, to a resolved String value for the plural form of the range as a whole denoted by type for the corresponding locale, or the String value "other".
17.5.4 ResolvePluralRange ( pluralRules, x, y )
The abstract operation ResolvePluralRange takes arguments pluralRules (an Intl.PluralRules), x (a Number), and y (a Number) and returns either a normal completion containing either "zero", "one", "two", "few", "many", or "other", or a throw completion. The returned String value represents the plural form of the range starting from x and ending at y according to the effective locale and the options of pluralRules. It performs the following steps when called:
If x is NaN or y is NaN, throw a RangeError exception.
The RelativeTimeFormat constructor is the %Intl.RelativeTimeFormat% intrinsic object and a standard built-in property of the Intl object. Behaviour common to all service constructor properties of the Intl object is specified in 9.1.
The value of the [[LocaleData]] internal slot is implementation-defined within the constraints described in 9.1 and the following additional constraints, for all locale values locale:
[[LocaleData]].[[<locale>]] has fields "second", "minute", "hour", "day", "week", "month", "quarter", and "year". Additional fields may exist with the previous names concatenated with the strings "-narrow" or "-short". The values corresponding to these fields are Records which contain these two categories of fields:
"future" and "past" fields, which are Records with a field for each of the plural categories relevant for locale. The value corresponding to those fields is a pattern which may contain "{0}" to be replaced by a formatted number.
Optionally, additional fields whose key is the result of ToString of a Number, and whose values are literal Strings which are not treated as templates.
The List that is the value of the "nu" field of any locale field of [[LocaleData]] must not include the values "native", "traditio", or "finance".
Note 2
It is recommended that implementations use the locale data provided by the Common Locale Data Repository (available at https://cldr.unicode.org/).
18.3 Properties of the Intl.RelativeTimeFormat Prototype Object
The Intl.RelativeTimeFormat prototype object is itself an ordinary object. %Intl.RelativeTimeFormat.prototype% is not an Intl.RelativeTimeFormat instance and does not have an [[InitializedRelativeTimeFormat]] internal slot or any of the other internal slots of Intl.RelativeTimeFormat instance objects.
[[Locale]]is a String value with the language tag of the locale whose localization is used for formatting.
[[LocaleData]] is a Record representing the data available to the implementation for formatting. It is the value of an entry in %Intl.RelativeTimeFormat%.[[LocaleData]] associated with either the value of [[Locale]] or a prefix thereof.
[[Style]] is one of the String values "long", "short", or "narrow", identifying the relative time format style used.
[[Numeric]] is one of the String values "always" or "auto", identifying whether numerical descriptions are always used, or used only when no more specific version is available (e.g., "1 day ago" vs "yesterday").
[[NumberFormat]] is an Intl.NumberFormat object used for formatting.
[[PluralRules]] is an Intl.PluralRules object used for formatting.
18.5 Abstract Operations for RelativeTimeFormat Objects
18.5.1 SingularRelativeTimeUnit ( unit )
The abstract operation SingularRelativeTimeUnit takes argument unit (a String) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:
If unit is "seconds", return "second".
If unit is "minutes", return "minute".
If unit is "hours", return "hour".
If unit is "days", return "day".
If unit is "weeks", return "week".
If unit is "months", return "month".
If unit is "quarters", return "quarter".
If unit is "years", return "year".
If unit is not one of "second", "minute", "hour", "day", "week", "month", "quarter", or "year", throw a RangeError exception.
Return unit.
18.5.2 PartitionRelativeTimePattern ( relativeTimeFormat, value, unit )
The abstract operation PartitionRelativeTimePattern takes arguments relativeTimeFormat (an Intl.RelativeTimeFormat), value (a Number), and unit (a String) and returns either a normal completion containing a List of Records with fields [[Type]] (a String), [[Value]] (a String), and [[Unit]] (a String or empty), or a throw completion. The returned List represents value according to the effective locale and the formatting options of relativeTimeFormat. It performs the following steps when called:
If value is NaN, +∞𝔽, or -∞𝔽, throw a RangeError exception.
The abstract operation MakePartsList takes arguments pattern (a Pattern String), unit (a String), and parts (a List of Records representing a formatted Number) and returns a List of Records with fields [[Type]] (a String), [[Value]] (a String), and [[Unit]] (a String or empty). It performs the following steps when called:
will return a List of Records like
«
{ [[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 )
The abstract operation FormatRelativeTime takes arguments relativeTimeFormat (an Intl.RelativeTimeFormat), value (a Number), and unit (a String) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:
18.5.5 FormatRelativeTimeToParts ( relativeTimeFormat, value, unit )
The abstract operation FormatRelativeTimeToParts takes arguments relativeTimeFormat (an Intl.RelativeTimeFormat), value (a Number), and unit (a String) and returns either a normal completion containing an Array or a throw completion. It performs the following steps when called:
The Segmenter constructor is the %Intl.Segmenter% intrinsic object and a standard built-in property of the Intl object. Behaviour common to all service constructor properties of the Intl object is specified in 9.1.
The value of the [[AvailableLocales]] internal slot is implementation-defined within the constraints described in 9.1.
The value of the [[RelevantExtensionKeys]] internal slot is « ».
The value of the [[ResolutionOptionDescriptors]] internal slot is « ».
Note
Intl.Segmenter does not have any relevant extension keys.
The value of the [[LocaleData]] internal slot is implementation-defined within the constraints described in 9.1.
19.3 Properties of the Intl.Segmenter Prototype Object
The Intl.Segmenter prototype object is itself an ordinary object. %Intl.Segmenter.prototype% is not an Intl.Segmenter instance and does not have an [[InitializedSegmenter]] internal slot or any of the other internal slots of Intl.Segmenter instance objects.
19.3.1 Intl.Segmenter.prototype.constructor
The initial value of Intl.Segmenter.prototype.constructor is %Intl.Segmenter%.
The Intl.Segmenter.prototype.segment method is called on an Intl.Segmenter instance with argument string to create a Segments instance for the string using the locale and options of the Intl.Segmenter instance. The following steps are taken:
[[Locale]]is a String value with the language tag of the locale whose localization is used for segmentation.
[[SegmenterGranularity]] is one of the String values "grapheme", "word", or "sentence", identifying the kind of text element to segment.
19.5 Segments Objects
A Segments instance is an object that represents the segments of a specific string, subject to the locale and options of its constructing Intl.Segmenter instance.
19.5.1 CreateSegmentsObject ( segmenter, string )
The abstract operation CreateSegmentsObject takes arguments segmenter (an Intl.Segmenter) and string (a String) and returns a Segments instance. The Segments instance references segmenter and string. It performs the following steps when called:
Let internalSlotsList be « [[SegmentsSegmenter]], [[SegmentsString]] ».
19.5.2.1 %IntlSegmentsPrototype%.containing ( index )
The containing method is called on a Segments instance with argument index to return a Segment Data object describing the segment in the string including the code unit at the specified index according to the locale and options of the Segments instance's constructing Intl.Segmenter instance. The following steps are taken:
The %Symbol.iterator% method is called on a Segments instance to create a Segment Iterator over its string using the locale and options of its constructing Intl.Segmenter instance. The following steps are taken:
The abstract operation CreateSegmentIterator takes arguments segmenter (an Intl.Segmenter) and string (a String) and returns a Segment Iterator. The Segment Iterator iterates over string using the locale and options of segmenter. It performs the following steps when called:
Let internalSlotsList be « [[IteratingSegmenter]], [[IteratedString]], [[IteratedStringNextSegmentCodeUnitIndex]] ».
has a [[Prototype]] internal slot whose value is the intrinsic object %Iterator.prototype%.
has the following properties:
19.6.2.1 %IntlSegmentIteratorPrototype%.next ( )
The next method is called on a Segment Iterator instance to advance it forward one segment and return an IteratorResult object either describing the new segment or declaring iteration done. The following steps are taken:
The abstract operation CreateSegmentDataObject takes arguments segmenter (an Intl.Segmenter), string (a String), startIndex (a non-negative integer), and endIndex (a non-negative integer) and returns a Segment Data object. The Segment Data object describes the segment within string from segmenter that is bounded by the indices startIndex and endIndex. It performs the following steps when called:
Whether a segment is "word-like" is implementation-dependent, and implementations are recommended to use locale-sensitive tailorings. In general, segments consisting solely of spaces and/or punctuation (such as those terminated with "WORD_NONE" boundaries by ICU [International Components for Unicode, documented at https://unicode-org.github.io/icu-docs/]) are not considered to be "word-like".
19.8 Abstract Operations for Segmenter Objects
19.8.1 FindBoundary ( segmenter, string, startIndex, direction )
The abstract operation FindBoundary takes arguments segmenter (an Intl.Segmenter), string (a String), startIndex (a non-negative integer), and direction (before or after) and returns a non-negative integer. It finds a segmentation boundary between two code units in string in the specified direction from the code unit at index startIndex according to the locale and options of segmenter and returns the immediately following code unit index. It performs the following steps when called:
Let granularity be segmenter.[[SegmenterGranularity]].
If direction is before, then
Search string for the last segmentation boundary that is preceded by at most startIndex code units from the beginning, using locale locale and text element granularity granularity.
If a boundary is found, return the count of code units in string preceding it.
Search string for the first segmentation boundary that follows the code unit at index startIndex, using locale locale and text element granularity granularity.
If a boundary is found, return the count of code units in string preceding it.
Return len.
Note
Boundary determination is implementation-dependent, but general default algorithms are specified in Unicode Standard Annex #29. It is recommended that implementations use locale-sensitive tailorings such as those provided by the Common Locale Data Repository (available at https://cldr.unicode.org).
20 Locale Sensitive Functions of the ECMAScript Language Specification
ECMA-262 describes several locale-sensitive functions. An ECMAScript implementation that implements this specification shall implement these functions as described here.
Note
The Collator, NumberFormat, or DateTimeFormat objects created in the algorithms in this clause are only used within these algorithms. They are never directly accessed by ECMAScript code and need not actually exist within an implementation.
The localeCompare method itself is not directly suitable as an argument to Array.prototype.sort because the latter requires a function of two arguments.
Note 2
The localeCompare function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
The toLocaleLowerCase function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
20.1.2.1 TransformCase ( S, locales, targetCase )
The abstract operation TransformCase takes arguments S (a String), locales (an ECMAScript language value), and targetCase (lower or upper). It interprets S as a sequence of UTF-16 encoded code points, as described in ECMA-262, 6.1.4, and returns the result of ILD transformation into targetCase as a new String value. It performs the following steps when called:
Let availableLocales be an Available Locales List which includes the language tags for which the Unicode Character Database contains language-sensitive case mappings. If the implementation supports additional locale-sensitive case mappings, availableLocales should also include their corresponding language tags.
Let newCodePoints be a List whose elements are the result of a lowercase transformation of codePoints according to an implementation-derived algorithm using locale or the Unicode Default Case Conversion algorithm.
Let newCodePoints be a List whose elements are the result of an uppercase transformation of codePoints according to an implementation-derived algorithm using locale or the Unicode Default Case Conversion algorithm.
Code point mappings may be derived according to a tailored version of the Default Case Conversion Algorithms of the Unicode Standard. Implementations may use locale-sensitive tailoring defined in the file SpecialCasing.txt of the Unicode Character Database and/or CLDR and/or any other custom tailoring. Regardless of tailoring, a conforming implementation's case transformation algorithm must always yield the same result given the same input code points, locale, and target case.
Note
The case mapping of some code points may produce multiple code points, and therefore the result may not be the same length as the input. Because both toLocaleUpperCase and toLocaleLowerCase have context-sensitive behaviour, the functions are not symmetrical. In other words, s.toLocaleUpperCase().toLocaleLowerCase() is not necessarily equal to s.toLocaleLowerCase() and s.toLocaleLowerCase().toLocaleUpperCase() is not necessarily equal to s.toLocaleUpperCase().
The toLocaleUpperCase function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
20.2 Properties of the Number Prototype Object
The following definition(s) refer to the abstract operation thisNumberValue as defined in ECMA-262, 21.1.3.
The elements of the array are converted to Strings using their toLocaleString methods, and these Strings are then concatenated, separated by occurrences of an implementation-defined locale-sensitive separator String. This function is analogous to toString except that it is intended to yield a locale-sensitive result corresponding with conventions of the host environment's current locale.
Note 3
The toLocaleString function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method.
Annex A (informative) Implementation Dependent Behaviour
The following aspects of this specification are implementation dependent:
In all functionality:
Additional values for some properties of options arguments (2)
The set of supported date-time formats per locale beyond a core set, including the representations used for each component and the associated patterns (11.2.3)
Localized weekday names, era names, month names, day period names, am/pm indicators, and time zone names (11.5.5)
The calendric calculations used for calendars other than "gregory" (11.5.12)
The set of all known registered Zone and Link names of the IANA Time Zone Database and the information about their offsets from UTC and their daylight saving time rules (21.4.1.19)
The set of supported "nu" key values (numbering systems) per locale (13.2.3)
The digital formatting configuration (use of two-digit hours with style "numeric" and separators for numeric hours, minutes, and seconds) per locale (13.2.3)
Support for the Unicode extensions keys "kf", "kn" and the parallel options properties "caseFirst", "numeric" (15.1.1)
In NumberFormat:
The set of supported "nu" key values (numbering systems) per locale (16.2.3)
The patterns used for formatting values as decimal, percent, currency, or unit values per locale, with or without the sign, with or without accounting format for currencies, and in standard, compact, or scientific notation (16.5.6)
The number of fractional digits used when formatting currency values (16.5.6)
Localized representations of NaN and Infinity (16.5.6)
The implementation of numbering systems not listed in Table 28 (16.5.6)
Localized decimal and grouping separators (16.5.6)
Classification of segments as "word-like" (19.7.1)
Annex B (informative) Additions and Changes That Introduce Incompatibilities with Prior Editions
10.1, 16.1, 11.1 In ECMA-402, 1st Edition, constructors could be used to create Intl objects from arbitrary objects. This is no longer possible in 2nd Edition.
11.3.3 In ECMA-402, 1st Edition, the "length" property of the function objectF was set to +0𝔽. In 2nd Edition, "length" is set to 1𝔽.
11.3.7 In ECMA-402, 7th Edition, the %Symbol.toStringTag% property of Intl.DateTimeFormat.prototype was set to "Object". In 8th Edition, %Symbol.toStringTag% is set to "Intl.DateTimeFormat".
16.3.7 In ECMA-402, 7th Edition, the %Symbol.toStringTag% property of Intl.NumberFormat.prototype was set to "Object". In 8th Edition, %Symbol.toStringTag% is set to "Intl.NumberFormat".
17.3.5 In ECMA-402, 7th Edition, the %Symbol.toStringTag% property of Intl.PluralRules.prototype was set to "Object". In 8th Edition, %Symbol.toStringTag% is set to "Intl.PluralRules".
16.1 In ECMA-402, 8th Edition, the NumberFormat constructor used to throw an error when style is "currency" and maximumFractionDigits was set to a value lower than the default fractional digits for that currency. This behaviour was corrected in the 9th edition, and it no longer throws an error.
Annex C (informative) Colophon
This specification is authored on GitHub in a plaintext source format called Ecmarkup. Ecmarkup is an HTML and Markdown dialect that provides a framework and toolset for authoring ECMAScript specifications in plaintext and processing the specification into a full-featured HTML rendering that follows the editorial conventions for this document. Ecmarkup builds on and integrates a number of other formats and technologies including Grammarkdown for defining syntax and Ecmarkdown for authoring algorithm steps. PDF renderings of this specification are produced by printing the HTML rendering to a PDF.
Prior editions of this specification were authored using Word—the Ecmarkup source text that formed the basis of this edition was produced by converting the ECMAScript 2015 Word document to Ecmarkup using an automated conversion tool.
This draft document may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to Ecma International, except as needed for the purpose of developing any document or deliverable produced by Ecma International.
This disclaimer is valid only prior to final version of this document. After approval all rights on the standard are reserved by Ecma International.
The limited permissions are granted through the standardization phase and will not be revoked by Ecma International or its successors or assigns during this time.
This document and the information contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
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:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
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.
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.