ECMAScript 2026 국제화 API 명세서(ECMA-402 제13판)는 ECMA-262를 보완하는 주요 언어 민감 기능을 제공합니다. 이 기능들은 Internationalization Components for Unicode (ICU) 라이브러리 (https://unicode-org.github.io/icu-docs/), .NET
프레임워크, Java 플랫폼 등에서 잘 확립된 국제화 API로부터 선택되었습니다.
제1판 API는 2010년 9월 Ecma TC39가 Nebojša Ćirić와 Jungshik Shin의 제안에 따라 설립한 임시 그룹에서 개발되었습니다.
제2판 API는 2015년 6월 총회에서 ECMAScript 6판을 보완하는 내용으로 채택되었습니다.
제3판 API는 Ecma TC39의 새로운 연간 릴리스 주기와 오픈 개발 프로세스 하에 최초로 공개되었습니다. ECMA-402 소스 문서로부터 평문 소스 문서를 생성하여 GitHub에서
추가 개발의 기반으로 삼았습니다. 해당 표준 개발 기간 동안 수십 건의 풀 리퀘스트와 이슈가 제출되었고, 이는 여러 버그 수정, 편집 및 기타 개선 사항을 반영합니다. 또한
Ecmarkup, Ecmarkdown, Grammarkdown 등 개발을 지원하는 다양한 소프트웨어 도구가 만들어졌습니다.
수많은 기관을 대표하는 많은 개인들이 Ecma TC39 내에서 본 판과 이전 판의 개발에 매우 중요한 기여를 했습니다. 또한 TC39의 ECMAScript 활동을 지원하는 활발한 커뮤니티가
형성되었습니다. 이 커뮤니티는 여러 초안 검토, 다양한 버그 리포트 제출, 구현 실험, 테스트 스위트 기여, ECMAScript 국제화에 대한 전 세계 개발자 커뮤니티 교육 등 다양한
활동을 했습니다. 이 노력에 기여한 모든 개인과 기관을 식별하고 인정하는 것은 불가능합니다.
Norbert Lindenberg
ECMA-402, 제1판 프로젝트 에디터
Rick Waldron
ECMA-402, 제2판 프로젝트 에디터
Caridy Patiño
ECMA-402, 제3, 4, 5판 프로젝트 에디터
Caridy Patiño, Daniel Ehrenberg, Leo Balter
ECMA-402, 제6판 프로젝트 에디터
Leo Balter, Valerie Young, Isaac Durazo
ECMA-402, 제7판 프로젝트 에디터
Leo Balter, Richard Gibson
ECMA-402, 제8판 프로젝트 에디터
Leo Balter, Richard Gibson, Ujjwal Sharma
ECMA-402, 제9판 프로젝트 에디터
Richard Gibson, Ujjwal Sharma
ECMA-402, 제10판 프로젝트 에디터
Richard Gibson, Ujjwal Sharma
ECMA-402, 제11판 프로젝트 에디터
Ben Allen, Richard Gibson, Ujjwal Sharma
ECMA-402, 제12판 프로젝트 에디터
Ben Allen, Richard Gibson, Ujjwal Sharma
ECMA-402, 제13판 프로젝트 에디터
1 범위
이 표준은 다양한 언어와 국가에서 사용되는 언어 및 문화적 관습에 맞게 프로그램을 적응시킬 수 있는 ECMAScript 객체의 애플리케이션 프로그래밍 인터페이스를 정의합니다.
2 적합성
이 명세서의 적합 구현은 ECMA-262에 부합해야
하며, 이 명세서에 기술된 모든 객체, 속성, 함수, 프로그램 의미론을 제공하고 지원해야 합니다. 이 명세서의 어떤 내용도 ECMA-262에서 금지한 동작을 허용할 의도가 아니며, 그런 충돌은 ECMA-262의 제약을 무시한 것이 아니라 편집 오류로 간주해야
합니다.
적합 구현은 이 명세서에 기술된 내용 외에 추가적인 객체, 속성, 함수도 제공할 수 있습니다. 특히, 적합 구현은 이 명세서에 기술되지 않은 속성과 해당 속성의 값을 제공할 수 있습니다.
단, 이 명세서에 정의된 함수에는 선택적 인수를 추가할 수 없습니다.
적합 구현은 추가적인 값을 허용할 수 있으며, 다음 options 인수의 속성에 대해 구현 정의 동작을 하거나
RangeError를 던지지 않을 수 있습니다:
모든 생성자와
supportedLocalesOf 메서드의 options 속성 "localeMatcher".
NumberFormat 생성자의 options 속성
"minimumIntegerDigits",
"minimumFractionDigits", "maximumFractionDigits",
"minimumSignificantDigits", "maximumSignificantDigits"에 대해, 추가
값이 명시된 제한보다 큰 정수
값으로 해석되는 경우.
PluralRules 생성자의 options 속성
"minimumIntegerDigits",
"minimumFractionDigits", "maximumFractionDigits",
"minimumSignificantDigits"에 대해, 추가 값이 명시된 제한보다 큰 정수 값으로 해석되는 경우.
이 명세서의 해당 섹션은 위 참고 문헌에 따라 최선의 노력으로 갱신되나, 반드시 최신 표준을 반영한다고 보장하지는 않습니다.
4 개요
이 섹션은 비규범적입니다.
4.1 국제화, 지역화, 세계화
소프트웨어의 국제화란, 여러 언어를 사용하는 사용자와 다양한 문화적 기대를 가진 사용자의 요구를 지원하거나 쉽게 적응할 수 있도록 설계하여, 이들 사이의 전 세계적 소통을 가능하게
하는 것을 의미합니다. 지역화는 실제로 특정 언어와 문화에 맞게 소프트웨어를 적응시키는 과정입니다. 소프트웨어의 세계화는 일반적으로 국제화와 지역화의 결합으로 이해됩니다. 세계화는
가장 낮은 수준에서 모든 언어를 지원하는 텍스트 표현을 사용하고, 언어·국가·시간대·기타 관련 매개변수를 식별하기 위한 표준 식별자를 사용하는 것에서 시작합니다. 이어서 사용자가
이해할 수 있는 사용자 인터페이스 언어와 데이터 표현을 사용하고, 마지막으로 제품별로 사용자의 언어·문화·환경에 맞게 적응이 필요할 수 있습니다.
ECMA-262는 텍스트 표현에 유니코드를
사용하고 일부 언어 민감 함수만 제공함으로써 기반을 마련하지만, 이러한 함수의 동작을 애플리케이션에서 세밀하게 제어할 수는 없습니다. 이 명세서는 그 기반 위에 사용자 정의 가능한
언어 민감 기능 집합을 제공합니다. API는 국제화되지 않은 애플리케이션에도 유용한데, 한 언어와 한 지역만을 대상으로 하더라도 그 언어와 지역을 제대로 지원해야 하기 때문입니다.
물론, 이 API는 여러 언어와 지역을 동시에 지원해야 하는 서버 환경 등에서 다양한 언어와 지역을 지원하는 애플리케이션에도 활용될 수 있습니다.
4.2 API 개요
이 명세서는 ECMA-262를 보완하는 주요 언어
민감 기능을 제공하도록 설계되었으며, 전체 또는 일부를 구현체에 추가할 수 있습니다. 이 명세서는 ECMAScript 코드에서 관찰 가능한 새로운 언어 값(예: [[FallbackSymbol]] 내부 슬롯의 값과 %Intl%에서 프로퍼티 접근을 통해 도달 가능한 값
집합)을 도입하고, ECMA-262에 정의된
일부 함수의 정의도 아래에 설명된 대로 보완합니다. 두 범주 모두 ECMA-262에서 정의된 값과 인터페이스에 허용된 동작을 금지하지 않으므로, 어떤 구현체든 이 명세서를
도입할 수 있습니다.
이 명세서는 대부분의 애플리케이션에 필요한 여러 핵심 언어 민감 기능을 제공합니다: 로케일 선택 및 검사, 문자열 비교(정렬) 및 대소문자 변환, 복수형 규칙, 텍스트 분할,
숫자·절대/상대 날짜·시간·기간·목록 포매팅. ECMA-262는 이러한 기본 기능을 위한 함수를 제공합니다(Array.prototype의
toLocaleString, String.prototype의 localeCompare,
toLocaleLowerCase, toLocaleUpperCase, Number.prototype의
toLocaleString, Date.prototype의 toLocaleString,
toLocaleDateString, toLocaleTimeString 등), 그러나 실제 동작은 대부분 구현 정의에 맡깁니다. 이
명세서는 추가 기능, 언어 및 동작 세부 제어, 필수 기능의 보다 완전한 명세를 제공합니다.
애플리케이션은 API를 두 가지 방식으로 사용할 수 있습니다:
서비스
생성자를 직접 사용하여 객체를 생성하고, 선호하는 언어 목록과 동작을 구성하는 옵션을 지정합니다. 객체는 주
기능(compare, select, format 등)을 반복적으로 호출할 수 있도록 제공하며,
resolvedOptions 함수를 통해 객체의 정확한 설정을 확인할 수 있습니다.
위에서 언급한 ECMA-262의 함수를
간접적으로 사용합니다. 정렬 및 포매팅 함수는 이 명세서에서 Collator, NumberFormat, DateTimeFormat 생성자와 동일한
인수를 받고, compare 또는 format 메서드와 동일한 결과를 내도록 재명세됩니다. 대소문자 변환 함수 역시 선호 언어 목록을 받을 수 있도록 재명세됩니다.
ECMA 402 v1에서는 Intl 생성자를 기존 객체에 적용하여 해당 객체에 내부
슬롯을 추가해 클래스 인스턴스로 변환하는 동작 모드를 지원했습니다. ECMA 402 v2에서는 기존 객체에 내부 슬롯을 추가하지 않도록 이 기능이 제거되었습니다. ECMA
402 v3에서는 "규범적 선택사항"으로 기능이 복원되어, 생성자가 호출될 때 어떤 객체에도 기반 Intl 인스턴스를 체이닝하는 모드를 지원합니다. 자세한 내용은 이슈 57을 참고하세요.
4.4 구현 종속성
국제화의 특성상, 이 명세서는 여러 세부 사항을 구현 종속적으로 남겨 둘 수밖에 없습니다:
구현체가 충분히 현지화하여 지원하는 로케일의 집합:
언어학자들은 수천 개의 인간 언어를 기술했으며, IANA 언어 서브태그 레지스트리에는 로케일 식별자의 기반이 되는 7000개 이상의 주요 언어
서브태그가 포함되어
있습니다. Common Locale Data Repository와 같은 대규모 로케일 데이터 모음도 모든 언어 및 지역/방언 변형 중 극히 일부만을 포함합니다. 리소스가
제한된 기기를 대상으로 하는 구현체는 더 좁은 부분집합만 지원할 수 있습니다.
포맷 패턴 등 현지화의 정확한 형태: 많은 경우 로케일 의존적 관습이 표준화되어 있지 않아, 여러 형태가 공존하거나 시간이 지나며 변할 수 있습니다. 다양한
국제화 라이브러리들이 서로 다른 형태를 구현했을 수 있으며, 그 중 어느 것도 틀렸다고 할 수 없습니다. 기존 라이브러리 위에 이 API를 구현할 수 있도록, 이러한 변형을
허용해야 합니다.
유니코드의 부분집합: 정렬 등 일부 연산은 전체 유니코드 문자 집합의 문자를 포함할 수 있는 문자열을 대상으로 동작합니다. 그러나 유니코드 표준과
ECMAScript 표준 모두 구현체가 유니코드 문자 집합의 부분집합만을 지원하도록 허용합니다. 또한 로케일 관습은 일반적으로 전체 유니코드 문자 집합에 대한 원하는 동작을
명세하지 않고, 해당 로케일에 관련된 문자만을 명세합니다. 유니코드 정렬 알고리즘은 전체 유니코드 문자 집합의 기본 정렬 순서와 로컬 관습을 위한 맞춤 기능을 결합하지만,
부분집합 및 맞춤 적용에 따라 동작에서 차이가 발생할 수 있습니다.
브라우저 구현에서는 특정 origin에서 보이는 로케일, 통화, 달력, 숫자 체계 등 나열 가능한 항목의 초기 집합이 동일한 사용자 에이전트 문자열(엔진 및 플랫폼 버전)을 공유하는 모든 사용자에게
동일해야 합니다. 또한, 이러한 집합의 동적 변경은 사용자가 서로 구별될 수 있도록 만들어서는 안 됩니다. 이 제약은 국제화에 내재된 핑거프린팅 위험을 줄이기 위해 부과되며, 향후
개정에서 완화될 수 있습니다. 이 제약의 결과로, 브라우저 구현에서 온디맨드 로케일 설치를 허용하는 경우, 특정 origin에서 새로운 로케일 설치가 필요할 수 있는 첫 요청이
들어오면 해당 로케일이 이미 설치되어 있는지 여부를 노출해서는 안 됩니다.
이 명세서 전체에서, 구현 및 로케일 종속 동작을 ILD로, 구현·로케일·숫자 체계 종속 동작을 ILND로 지칭합니다.
4.4.1 구현 간 호환성
ECMA 402는 함수에서 사용하는 데이터의 스키마를 기술합니다. 내부 데이터는 구현 종속적이며, 시간이 지남에 따라 바뀌고 구현마다 다를 수 있습니다. 이러한 차이는
프로그래머에게 노출되며, 특정 출력에 의존하는 프로그램도 만들 수 있습니다. 그러나 이 명세서는 구현 간에도 잘 작성된 프로그램이 동작할 수 있도록 합리적인 제약을
기술하려고 노력합니다. 구현체들은 언어 데이터의 일관성을 높이기 위한 노력을 계속할 것을 권장합니다.
ECMA-262에 기술된 바와 같이, 알고리즘은
ECMAScript 구성요소의 요구 의미론을 정확하게 명시하기 위해 사용되나, 특정 구현 기술의 사용을 암시하려는 것은 아닙니다. 내부 슬롯은 객체 값의 의미론을 정의하는 데
사용되지만 API의 일부는 아니며, 순전히 설명 목적으로 정의됩니다. API의 구현은 여기 기술된 방식대로 내부 슬롯을 생성하고 동작하는 것처럼 동작해야 합니다.
Record
명세 타입의 확장으로, “[[<name>]]” 표기는 변수 name이 지정하는 String 값의 필드를 나타냅니다. 예를 들어 변수
s의 값이 "a"이면, [[<s>]]는 [[a]] 필드를
나타냅니다.
이 명세서는 규범적 선택사항 블록을 사용하여 ECMA
262의 부록 B의
의미를 표시합니다. 즉, 규범적 선택사항 섹션은 ECMAScript 호스트가 웹 브라우저일 때는 필수입니다. 웹 브라우저가 아닌 경우에는 해당
섹션의 내용이 규범적이지만 선택사항입니다.
이 절에서는 로케일, 통화, 시간대, 측정 단위, 숫자 체계, 정렬 방식, 달력, 그리고 패턴 문자열을 식별하기 위해 이 명세서에서 사용하는 String 값들을 설명한다.
6.1 대소문자 구분과 대소문자 매핑
로케일, 통화, 스크립트, 시간대를 식별하는 데 사용되는 String 값은 ASCII 대소문자 비구분 방식으로 해석되며, 코드 유닛 0x0041부터 0x005A까지(유니코드 문자
LATIN CAPITAL LETTER A부터 LATIN CAPITAL LETTER Z에 해당)와 이에 대응하는 코드 유닛 0x0061부터 0x007A까지(유니코드 문자 LATIN
SMALL LETTER A부터 LATIN SMALL LETTER Z에 해당)를 포함 범위 내에서 서로 동등하게 취급한다. 그 외의 대소문자 폴딩 동등성은 적용되지 않는다.
참고
예를 들어, "ß" (U+00DF)는 "SS" (U+0053, U+0053)와 일치하거나 그로
매핑되어서는 안 된다. "ı" (U+0131) 역시 "I" (U+0049)와 일치하거나 그로 매핑되어서는
안 된다.
String 값 S의 ASCII-uppercase는 S에서 나타나는 모든 ASCII 소문자 코드
유닛(0x0061부터 0x007A까지, 포함)을 해당하는 ASCII 대문자 코드 유닛(0x0041부터 0x005A까지, 포함)으로 치환하고, 다른 모든 코드 유닛은 보존하여
얻어지는 String 값이다.
String 값 S의 ASCII-lowercase는 S에서 나타나는 모든 ASCII 대문자 코드
유닛(0x0041부터 0x005A까지, 포함)을 해당하는 ASCII 소문자 코드 유닛(0x0061부터 0x007A까지, 포함)으로 치환하고, 다른 모든 코드 유닛은 보존하여
얻어지는 String 값이다.
String 값 A는, A의 ASCII-uppercase가 B의 ASCII-uppercase와 정확히 동일한 코드 유닛
시퀀스인 경우, String 값 B에 대한 ASCII 대소문자 비구분 일치이다. 유니코드 코드 포인트 시퀀스
A는, B가 CodePointsToString(A)에
대한 ASCII 대소문자 비구분 일치인 경우 B와 ASCII 대소문자 비구분 일치이다.
로케일 식별자는, "-" (U+002D HYPHEN-MINUS) 문자로 구분된 대소문자 비구분의 유니코드 Basic Latin 영숫자 서브태그로 구성되며, 한 글자짜리
서브태그는 "싱글턴 서브태그"라고
한다.
Unicode Technical Standard #35 Part 1 Core,
Section 3.6 Unicode BCP 47 U Extension의 서브태그 시퀀스가 광범위하게 사용되며,
"유니코드 로케일 확장 시퀀스"는 언어 태그의 부분 문자열 중에서
unicode_locale_extensions 유니코드 로케일 논터미널에 의해 매칭될 수 있고 "-x-…" 개인용
서브태그 시퀀스의 일부가 아닌 가장 긴 부분 문자열을 설명한다.
이는 "-u-"로 시작하며, 싱글턴 서브태그가 아닌 즉시 뒤따르는 모든 서브태그와 그 앞의
"-" 구분자를 포함한다.
예를 들어, "en-US-u-fw-mon-x-u-ex-foobar"의 유니코드 로케일 확장
시퀀스는 "-u-fw-mon"이다.
모든 구조적으로 유효한 언어 태그는 이 명세서에서 정의된 API와
함께 사용하는 데 적합하지만, 구현체가 이를 검증하기 위해 유니코드 공통 로케일 데이터 저장소(CLDR)
데이터를 사용해야 하는 것은 아니다.
구현체가 충분한 현지화로 지원하는 로케일(즉, 언어 태그)의 집합은 구현 정의이다.
Intl 생성자는 요청된 언어 태그를 각
구현체가 지원하는 로케일로 매핑한다.
6.2.1 IsStructurallyValidLanguageTag ( locale )
추상 연산 IsStructurallyValidLanguageTag는 인수 locale (String)을 받아 Boolean을 반환한다. 이는
locale이 구문상 잘 형성된 언어 태그인지 판단한다. locale이 의미 있는 의미론을
전달하는지, 또는 별칭 서브태그와 그 선호 교체 서브태그를 구별하는지, 정규 대소문자나 서브태그 순서를 요구하는지는
고려하지 않는다.
호출 시 다음 단계를 수행한다:
normalized에 0x0041부터 0x005A(유니코드 문자 LATIN CAPITAL LETTER A부터 LATIN CAPITAL
LETTER Z에 해당) 범위를 벗어나는 코드 유닛이 하나라도 있으면, false를 반환한다.
true를 반환한다.
6.4 AvailableCanonicalCurrencies ( )
구현
정의 추상 연산 AvailableCanonicalCurrencies는 인수를 받지 않으며 List
형태의 String들을 반환한다. 반환되는 List는
사전식 코드 유닛 순서에
따라 정렬되며, 고유하고, 형식이 올바르고, 대문자로 정규화된 3글자 ISO 4217 통화 코드를 포함한다. 이는 구현체가 Intl.DisplayNames 및
Intl.NumberFormat 객체의 기능을 제공하는 통화를 식별한다.
역사적 이유로, "UTC"는 주 시간대 식별자여야 한다.
"Etc/UTC", "Etc/GMT", "GMT" 및 그들로 해석되는
모든 Link 이름은 "UTC"로 해석되는 비주 시간대 식별자여야 한다.
파일 zone.tab의 “TZ” 열에 있는 모든 Link 이름은 주 시간대 식별자여야 한다.
예를 들어, "Europe/Prague"와 "Europe/Bratislava"는 모두 주 시간대 식별자여야 한다.
이 요구사항은 각 ISO 3166-1 Alpha-2 국가 코드당
최소 한 개의 주 시간대 식별자를
보장하며, 한 국가의 시간대 규칙에 대한 미래 변경이 다른 국가의 시간대를 사용하는 ECMAScript 프로그램에 영향을 미치지 않도록 한다(해당 국가들의 영토 경계도
변경된 경우는 제외).
파일 zone.tab의 “TZ” 열에 나열되지 않았고, 하나의 ISO 3166-1 Alpha-2 국가 코드의 영토 내에
완전히 포함된 지리적 영역을 나타내는 Link 이름은, 동일한 국가 코드의 영토 내에 완전히 포함된 지리적 영역을 나타내는 주 식별자로 해석되어야 한다.
예를 들어, "Atlantic/Jan_Mayen"은 "Arctic/Longyearbyen"으로 해석되어야
한다.
참고
IANA 시간대 데이터베이스는 어떤 사용 가능한 명명된 시간대
식별자가 주가 되는지에 영향을 미치는 빌드 옵션을 제공한다.
기본 빌드 옵션은 서로 다른 국가의 시간대를 병합하며, 예를 들어 "Atlantic/Reykjavik"은 Zone
"Africa/Abidjan"에 대한 Link로 빌드된다.
지리적으로나 정치적으로 구분되는 지역은 IANA 시간대 데이터베이스의 미래 버전에서 상이한 시간대 규칙을 도입할 가능성이 높다.
위의 예외들은 이러한 미래 호환성 문제를 완화하는 데 도움이 된다.
유니코드 공통 로케일 데이터 저장소(CLDR)는 어떤 사용 가능한 명명된 시간대
식별자가 주인지 비주인지 결정할 때 위의 예외 대부분을 구현한다.
구현 간 일관성을 위해 CLDR 데이터 사용이 권장되지만 필수는 아니다.
CLDR 기반이 아닌 구현도 timezone.xml의
CLDR 식별자 데이터를 사용할 수 있다.
구현은 또한 PACKRATDATA=backzone PACKRATLIST=zone.tab과 같은 빌드 옵션을 사용하고 위 요구사항 준수를
보장하기 위한 사후 처리를 수행하는 등, IANA 시간대 데이터베이스를 직접 빌드할 수 있다.
IANA 시간대 데이터베이스는 보통 연간 5~10회 업데이트된다.
이러한 업데이트는 새로운 Zone 또는 Link 이름을 추가하거나, Zone을 Link로 변경하거나, 어떤 Zone과 연관된 UTC 오프셋 및 전환을 변경할 수 있다.
구현은 IANA 시간대 데이터베이스 업데이트를 가능한 한 빨리 포함하는 것이 권장된다.
이러한 신속한 조치는 ECMAScript 프로그램이 시간대 민감 계산을 정확히 수행하고, 외부 입력이나 호스트 환경이 제공하는 새로 추가된
사용 가능한 명명된 시간대 식별자를
사용할 수 있도록 보장한다.
IANA 시간대 데이터베이스 유지 관리자는 안정성을 위해 노력하지만, 드물게(연평균 1회 미만) 기존 Zone이 새로운 Zone으로 대체될 수 있다.
예를 들어, 2022년에 "Europe/Kiev"는 새 Zone "Europe/Kyiv"로 해석되는 Link로
더 이상 사용되지 않도록(deprecated) 되었다.
더 이상 사용되지 않게 된 Link는 이름이 변경된 시간대
식별자라고 부르고, 새로 추가된 Zone은 대체
시간대 식별자라고 부른다.
이러한 드문 변경으로 인한 혼란을 줄이기 위해, 구현은 처음에는 각 대체 시간대 식별자를 기존의 이름이 변경된 시간대 식별자로 해석되는 비주 시간대 식별자로 추가해야
한다.
이는 ECMAScript 프로그램이 두 식별자 모두를 인식하도록 허용하지만, 아직 해당 식별자를 인식하지 못하는 다른 시스템에 대체 시간대 식별자를 전송할 가능성을 낮춘다.
이름 변경 대기 기간 이후, 구현은 새 Zone을 주
시간대 식별자로 승격시키는 동시에, 이름이 변경된 시간대 식별자를 비주로 강등시켜야 한다.
다른 시스템이 업데이트될 수 있도록 충분한 시간을 제공하기 위해, 권장되는 이름 변경 대기 기간은 2년이다.
다만, 반드시 정확하거나 동적인 값일 필요는 없다.
대신, 구현은 시간대 데이터 업데이트를 위한 정상적인 릴리스 과정의 일부로, 대기 기간 이후에 대체 시간대 식별자를 주로 승격시켜야 한다.
대기 기간은 오직 기존 Zone을 대체하기 위해 새로운 Zone이 추가된 경우에만 적용되어야 한다.
기존 Zone과 Link가 서로 바뀐 경우에는 이름 변경이 일어난 것이 아니므로 대기 기간이 필요 없다.
위의 Link를 주 시간대
식별자로 해석하는 알고리즘은 International Components for Unicode (ICU)의 icu::TimeZone::getIanaID()
동작과, 유니코드 공통 로케일 데이터 저장소(CLDR)에서 시간대 식별자
데이터를 유지 관리하는 절차에 대응하도록 의도되었다.
이 알고리즘은 IANA 시간대 데이터베이스의 zone.tab과 backzone 파일의 데이터를 사용하여, ISO
3166-1 Alpha-2 국가 코드의 경계를 넘지 않으면서 Link를 주 시간대
식별자로 해석한다.
Link의 국가 코드가 zone.tab에 한 줄만 있다면, 그 줄이 주 시간대
식별자를 결정한다.
하지만 그 국가 코드가 zone.tab에 여러 줄이라면, 올바른 주 시간대
식별자를 식별하기 위해 backzone의 과거 매핑을 사용해야 한다.
예를 들어, IANA 시간대 데이터베이스의 기본 빌드 옵션이 "Pacific/Truk"(국가 코드 "FM")을 "Pacific/Port_Moresby"(국가
코드 "PG")의 Link로 식별하는 경우, zone.tab의 “country-code” 열에서 "FM"에 해당하는 줄들을 확인해야
한다.
해당 줄이 하나뿐이면, 그 줄의 “TZ” 열이 "Pacific/Truk"에 연관된 주 시간대
식별자를 결정한다.
하지만 zone.tab에 "FM" 줄이 여러 개라면, backzone을 확인해야 하며, "Link
Pacific/Chuuk Pacific/Truk" 같은 줄이 있다면 "Pacific/Chuuk"을 주 시간대
식별자로 사용하게 된다.
zone.tab이 선호되는 매핑 데이터 소스임에 유의하라. 그 이유는 backzone 매핑이 드물게 ISO
3166-1 Alpha-2 국가 코드의 경계를 넘을 수 있기 때문이다.
예를 들어, "Atlantic/Jan_Mayen"(국가 코드 "SJ")은 backzone에서 "Europe/Oslo"(국가 코드
"NO")로 매핑된다.
IANA 시간대 데이터베이스 2024a 릴리스 기준으로, 이것이 발생하는 유일한 사례이다.
추상 연산 AvailablePrimaryTimeZoneIdentifiers는 인수를 받지 않으며 List
형태의 String들을 반환한다.
반환되는 List는
IANA 시간대 데이터베이스에서 지원되는 Zone 및 Link 이름의 정렬된 List이다.
호출 시 다음 단계를 수행한다:
추상 연산 StringSplitToList는 인수 S (String)와 separator (String)를 받아 List
형태의 String들을 반환한다.
반환되는 List는
separator를 포함하지 않으면서, separator의 발생 바로 앞/뒤에 위치하는, S의 서로 겹치지 않는
모든 부분 문자열을 포함한다.
그러한 각 부분 문자열은 인접한 separator 사이, S 맨 앞의
separator 앞, 또는 S 맨 끝의 separator 뒤에 위치하는 빈 String일 수 있으나, 그 외의
경우에는 빈 String이 아니다.
호출 시 다음 단계를 수행한다:
추상 연산 IsWellFormedUnitIdentifier는 인수 unitIdentifier (String)를 받아 Boolean을 반환한다. 이는
unitIdentifier 인수가, 승인된 단일 단위이거나 두 개의 승인된 단일 단위를 나눗셈으로 구성한 복합 단위인, 형식이 올바른 코어 단위 식별자를 나타내는지 검증한다. 호출 시 다음
단계를 수행한다:
구현 정의 추상 연산
AvailableCanonicalNumberingSystems는 인수를 받지 않으며 List
형태의 String들을 반환한다. 반환되는 List는
사전식 코드 유닛
순서에 따라 정렬되며,
구현체가 Intl.DateTimeFormat, Intl.NumberFormat, Intl.RelativeTimeFormat 객체의 기능을 제공하는 숫자 체계를 식별하는,
고유하고 정규화된 숫자 체계 식별자를 포함한다.
List에는
표 28의 모든 행(헤더 행 제외)의 Numbering
System 값이 포함되어야 한다.
구현 정의 추상 연산
AvailableCanonicalCollations는 인수를 받지 않으며 List
형태의 String들을 반환한다. 반환되는 List는
사전식 코드 유닛
순서에 따라 정렬되며,
구현체가 Intl.Collator 객체의 기능을 제공하는 정렬 방식을 식별하는, 고유하고 정규화된 정렬 방식 유형을 포함한다.
구현 정의 추상 연산
AvailableCalendars는 인수를 받지 않으며 List
형태의 String들을 반환한다. 반환되는 List는
사전식 코드 유닛
순서에 따라 정렬되며,
구현체가 Intl.DateTimeFormat 객체의 기능을 제공하는 달력을 식별하는, 정규형(6.9)의 고유한 달력 유형을
포함한다. 별칭(예: "islamicc"와 "islamic-civil" 중 하나만이 아니라 둘 다 또는
둘 다 없음)도 포함한다. List에는
"iso8601"가 포함되어야 한다.
6.10 패턴 문자열 유형
패턴 문자열은, String
값으로서,
"{key}" 형태의 부분 문자열을 0개 이상 포함할 수 있으며, 여기서 key는 ASCII 단어
문자로만 이루어진, 비어 있지 않은 임의의 시퀀스일 수 있다.
추상 패턴 문자열의 구문은 구현 세부사항이며 ECMA-402의 사용자에게 노출되지 않는다.
7 표준 내장 ECMAScript 객체에 대한 요구 사항
이 문서에서 별도로 명시하지 않는 한, 이 표준에서 설명하는 객체, 함수, 생성자는 ECMAScript 표준 내장
객체에 대해 지정된 일반적인 요구 사항 및 제한 사항의 적용을 받는다.
서비스 생성자는
구현체의 실제 기능과 locales 및 options 인수로 표현되는 요청을 협상하기 위해 공통 패턴을 사용한다. 이러한 공통 동작은 기능을
설명하는 내부 슬롯, 이 내부 슬롯을 사용하는 추상
연산, 그리고 아래에 정의된 특수 데이터 타입의 관점에서 여기서 설명한다.
해결 옵션
서술자는 [[Key]] (문자열, 보통 [[RelevantExtensionKeys]]List의 요소)와
[[Property]] (문자열) 필드를 가지는 Record이며,
선택적으로 [[Type]] (boolean 또는
string)과 [[Values]] (empty 또는
List 형태의
ECMAScript 언어 값)을
포함할 수 있다. 이는 객체 생성 중 로케일 해결에 관련된 옵션을 읽는 방법을 설명한다.
[[AvailableLocales]]는 사용 가능한 로케일 목록이다.
여기에는 DefaultLocale가 반환하는 값이 포함되어야 한다. 또한, 둘 이상의
서브태그를 가진 각
요소에 대해, 동일한 언어 서브태그와 그 이후의 동일한 서브태그들의 엄격한 부분집합(즉, 하나 이상 생략)을 갖는 더 덜
구체적인 언어
태그도 포함되어야 하며, 이는 ResolveLocale의 잠재적 폴백으로 사용된다. 특히, 언어 서브태그, 스크립트
서브태그, 지역
서브태그를 모두
가진 각 요소에는 동일한 언어 서브태그와 지역 서브태그만 포함하고 스크립트 서브태그는 누락된 또 다른
요소가 동반되어야 한다. 예:
[[AvailableLocales]]에 "de-DE"가 포함되어 있다면,
"de"도 포함되어야 한다(이는 "de-AT",
"de-CH" 같은 요청 로케일을 만족시키는 데 선택될 수 있다).
[[AvailableLocales]]에 "az-Latn-AZ"가 포함되어
있다면, "az-AZ"도 포함되어야 한다("az-Cyrl"을 사용할 수 없는 경우
"az-Cyrl-AZ" 같은 요청을 만족시키는 데 선택될 수 있다).
[[ResolutionOptionDescriptors]]는 객체 생성 중 옵션을 읽는 데 사용되는 List
형태의 해결 옵션 서술자들이다.
[[SortLocaleData]] 및 [[SearchLocaleData]](Intl.Collator용)와 [[LocaleData]](그 외 모든 서비스 생성자용)는 Record들이다.
각 서비스
생성자에 특화된 필드들 외에, 이러한 각 Record에는
[[AvailableLocales]]에 포함된 각 로케일에 대한 필드가 있다. 그러한 각 로케일 이름 필드의 값은
Record이며,
[[RelevantExtensionKeys]]의 각 요소가 해당 값으로 구현체가 해당 로케일에서 지원하는 타입 값을 나타내는
비어 있지 않은 문자열 List인
필드 이름을 지정한다. 이때 첫 번째 요소는 해당 로케일에서 그 키의 기본값을 제공한다.
참고
예를 들어, DateTimeFormat의 구현체는 그 [[AvailableLocales]] 내부 슬롯에 언어 태그"fa-IR"를 포함할 수 있으며, 11.2.3에 따라
[[RelevantExtensionKeys]] 내부 슬롯에 키 "ca",
"hc", "nu"를 포함해야 한다.
해당 로케일의 기본 달력은 보통 "persian"이지만, 구현체는 "gregory",
"islamic", "islamic-civil"도 지원할 수 있다.
따라서 DateTimeFormat의 [[LocaleData]] 내부 슬롯의 Record에는
값이 { [[ca]]: « "persian",
"gregory", "islamic", "islamic-civil"
», [[hc]]: « … », [[nu]]: « … » }와 같은
[[fa-IR]] 필드가 포함되며, 그 외 다른 로케일 이름 필드들도 동일한 값 형태를 갖되 각 List의
요소는 다를 수 있다.
추상 연산 LookupMatchingLocaleByPrefix는 인수 availableLocales (사용 가능한 로케일
목록)과 requestedLocales (언어 우선순위
목록)을 받아, [[locale]] (유니코드 정규화 로케일
식별자)와 [[extension]] (유니코드 로케일 확장 시퀀스 또는
empty) 필드를 가진 Record나
undefined를 반환한다.
이는 BCP 47의 RFC 4647 섹션 3.4에 정의된 조회
알고리즘을 사용하여, 유니코드 로케일 확장 시퀀스를 무시하고
requestedLocales를 만족시키는 availableLocales의 최적 요소를 결정한다.
기본이 아닌 일치가 발견되면, availableLocales에서 일치하는 언어 태그를 [[locale]] 필드에 담고, requestedLocales의 해당 요소의 유니코드 로케일 확장 시퀀스(요청된 언어 태그에
그러한 시퀀스가 없다면 empty)를 [[extension]] 필드에 담은
Record를
반환한다. 호출 시 다음 단계를 수행한다:
구현 정의 추상 연산
LookupMatchingLocaleByBestFit는 인수 availableLocales (사용 가능한 로케일
목록)과 requestedLocales (언어 우선순위
목록)을 받아, [[locale]] (유니코드 정규화 로케일
식별자)와 [[extension]] (유니코드 로케일 확장 시퀀스 또는
empty) 필드를 가진 Record나
undefined를 반환한다.
이는 유니코드 로케일 확장 시퀀스를 무시하고
requestedLocales를 만족시키는 availableLocales의 최적 요소를 결정한다. 알고리즘은 구현에 따라 달라질 수
있으나, 일반적인 요청 로케일 사용자에게 LookupMatchingLocaleByPrefix
알고리즘이 산출하는 결과만큼은 최소한 만족스럽다고 여겨질 만한 결과를 산출해야 한다. 기본이 아닌 일치가 발견되면, availableLocales에서
일치하는 언어
태그를 [[locale]]에, requestedLocales의 해당
요소의 유니코드 로케일 확장 시퀀스(요청된 언어 태그에
그러한 시퀀스가 없다면 empty)를 [[extension]]에 담은 Record를
반환한다.
9.2.5 UnicodeExtensionComponents ( extension )
추상 연산 UnicodeExtensionComponents는 인수 extension (유니코드 로케일 확장 시퀀스)을 받아, [[Attributes]]와 [[Keywords]] 필드를 가진 Record를
반환한다.
이 연산은 extension을 고유한 속성들의 List와
고유 키를 가진 키워드들의 List로
분해한다. 동일한 속성이나 키워드 키가 두 번째 이후에 반복해서 나타나는 경우는 무시된다. 호출 시 다음 단계를 수행한다:
추상 연산 InsertUnicodeExtensionAndCanonicalize는 인수 locale (언어 태그),
attributes (문자열들의 List),
keywords (Record들의
List)을
받아 유니코드 정규화 로케일
식별자를 반환한다.
이 연산은 attributes와 keywords를 locale에 유니코드 로케일 확장 시퀀스로써 삽입하고, 정규화된
결과를 반환한다. 호출 시 다음 단계를 수행한다:
추상 연산 ResolveLocale은 인수 availableLocales (사용 가능한 로케일 목록),
requestedLocales (언어 우선순위 목록), options (Record),
relevantExtensionKeys (문자열들의 List),
localeData (Record)를
받아 Record를
반환한다.
이는 BCP 47의 RFC 4647 섹션 3에 정의된
"lookup"을 수행하며, options.[[localeMatcher]]에 의해 지정된 대로
LookupMatchingLocaleByBestFit
또는 LookupMatchingLocaleByPrefix
알고리즘을 사용하여, 유니코드 로케일 확장 시퀀스를 무시하고
requestedLocales를 만족시키는 availableLocales의 최적 요소를 결정한다. 그리고 일치 결과에 더해
localeData의 대응 데이터와 relevantExtensionKeys의 각 요소에 대한 해석된 값을 포함하는 표현을
반환한다(기본적으로 일치한 로케일의 데이터가 사용되고, 요청된 유니코드 로케일 확장 시퀀스가
있으면 그 데이터가 우선하며, options에 해당 값이 있으면 다시 그것으로 대체된다).
또한, requestedLocales에서 일치한 요소가 유니코드 로케일 확장 시퀀스를
포함한다면, 반환되는 Record의
[[Locale]] 필드의 언어 태그에 그 시퀀스를 복사하되,
relevantExtensionKeys에 포함되지 않은 key 값을 가진 keyword유니코드 로케일
논터미널이나, options의 다른 값으로 대체되는 type 값은 생략한다. 호출 시
다음 단계를 수행한다:
추상 연산 ResolveOptions는 인수 constructor (서비스 생성자), localeData
(Record),
locales (ECMAScript 언어
값), options (ECMAScript 언어
값)과 선택 인수 specialBehaviours (enum들의
List),
modifyResolutionOptions (매개변수 하나를 가지는 Abstract Closure)를
받아, 정상
완료로[[Options]] (Object), [[ResolvedLocale]] (Record),
[[ResolutionOptions]] (Record)
필드를 가진 Record를
포함하거나, throw
완료를 반환한다. 이 연산은 constructor를 위한 입력을 읽고 이를 로케일로 해석한다. 호출 시 다음
단계를 수행한다:
추상 연산 GetOptionsObject는 인수 options (ECMAScript 언어
값)을 받아, 정상
완료로 Object를 포함하거나 throw
완료를 반환한다.
이는 GetOption과
함께 사용하기에 적합한 Object를 반환하며, options 자체 또는 기본 빈 Object가 된다.
options가 undefined도 Object도 아니면 TypeError를 던진다.
호출 시 다음 단계를 수행한다:
추상 연산 CoerceOptionsToObject는 인수 options (ECMAScript 언어
값)을 받아, 정상
완료로 Object를 포함하거나 throw
완료를 반환한다.
이는 GetOption과
함께 사용하기에 적합한 Object로 options를 강제 변환하며, 기본값은 빈 Object이다.
이 연산은 null이 아닌 원시 값을 객체로 강제하므로, 새로운 기능에서는 GetOptionsObject를 사용하는 것이 권장된다.
호출 시 다음 단계를 수행한다:
추상 연산 GetOption은 인수 options (Object), property (프로퍼티
키), type (boolean 또는
string), values (empty 또는 List
형태의 ECMAScript 언어
값), default (required 또는 ECMAScript 언어
값)을 받아, 정상
완료로ECMAScript 언어
값을 포함하거나 throw
완료를 반환한다.
이는 options의 지정된 프로퍼티 값을 추출하여 요구된 type으로 변환하고, values가
empty가 아니라면 허용 여부를 확인하며, 값이 undefined이면
default로 대체한다. 호출 시 다음 단계를 수행한다:
추상 연산 GetBooleanOrStringNumberFormatOption은 인수 options (Object), property
(프로퍼티
키), stringValues (문자열들의 List),
fallback (ECMAScript 언어
값)을 받아, 정상
완료로 Boolean, String 또는 fallback 중 하나를 포함하거나, throw
완료를 반환한다.
이는 제공된 options 객체에서 property라는 이름의 프로퍼티 값을 추출한다. 그 값이
undefined이면 fallback을 반환하고, true이면
true를 반환하며, ToBoolean 결과가
false이면 false를 반환한다. 그 외의 경우 String으로 강제 변환한 값을
stringValues가 허용하면 그 결과를 반환한다. 호출 시 다음 단계를 수행한다:
추상 연산 DefaultNumberOption은 인수 value (ECMAScript 언어
값), minimum (정수), maximum
(정수),
fallback (정수 또는
undefined)을 받아, 정상
완료로정수 또는
undefined를 포함하거나 throw
완료를 반환한다.
이는 value를 정수로 변환하고 허용 범위 내인지 확인하며 필요 시
fallback 값을 채운다. 호출 시 다음 단계를 수행한다:
추상 연산 GetNumberOption은 인수 options (Object), property (String),
minimum (정수), maximum
(정수),
fallback (정수 또는
undefined)을 받아, 정상
완료로정수 또는
undefined를 포함하거나 throw
완료를 반환한다.
이는 제공된 options 객체에서 property라는 이름의 프로퍼티 값을 추출하여 정수로 변환하고, 허용 범위
내인지 확인하며, 필요 시 fallback을 채운다. 호출 시 다음 단계를 수행한다:
추상 연산 PartitionPattern은 인수 pattern (패턴 문자열)을 받아, [[Type]] (String)과 [[Value]] (String 또는
undefined) 필드를 가진 Record들의
List를
반환한다.
[[Type]]이 "literal"인 경우에 한해 [[Value]] 필드는 String 값이며, 그 외에는 undefined이다.
호출 시 다음 단계를 수행한다:
[[AvailableLocales]] 내부 슬롯의 값은 구현
정의이며, 9.1에 설명된 제약 내에 있어야 한다. [[RelevantExtensionKeys]] 내부 슬롯의 값은 List로서,
요소 "co"를 반드시 포함해야 하며, "kf"와 "kn" 중 임의의
것을 포함할 수 있고, 그 외의 다른 요소는 포함해서는 안 된다.
참고
Unicode Technical
Standard #35 Part 1 Core, Section 3.6.1 Key and Type Definitions는 정렬(collation)과 관련된
열 개의 로케일 확장 키를 설명한다: 정렬기 사용 및 특화를 위한 "co", 대체 처리(alternate handling)를 위한
"ka", 역방향 2차 가중치를 위한 "kb", 대소문자 수준을 위한
"kc", 대소문자 우선(case first)을 위한 "kf", 히라가나 4차를 위한
"kh", 정규화를 위한 "kk", 숫자 비교를 위한 "kn",
재정렬을 위한 "kr", 강도를 위한 "ks", 그리고 variable top을 위한
"vt". 그러나 Collator에서는 사용을 options 객체의 "usage" 속성으로, 대체
처리를 options 객체의 "ignorePunctuation" 속성으로, 그리고 대소문자 수준 및 강도를 options 객체의
"sensitivity" 속성으로 지정해야 한다. 언어 태그의 "co"
키는 정렬기 특화에 대해서만 지원되며, "kb", "kh",
"kk", "kr", "vt" 키는 국제화 API의 이
버전에서는 허용되지 않는다. 나머지 키에 대한 지원은 구현에 따라 달라진다.
구현 정의 추상 연산
CompareStrings는 인수 collator (Intl.Collator), x (String), y
(String)를 받아 Number(단,
NaN은 아님)를 반환한다.
반환된 Number는 구현 정의된 로케일 민감
비교에 따라 x와 y를 비교한 결과를 나타낸다.
결과는 유효한 로케일 및 정렬 옵션에 따른 문자열 값의 정렬 순서에 대응하도록 의도되며,
x가 y보다 앞서면 음수, 뒤면 양수, 그 밖의 모든 경우(상대적 순서가 없음)에는 0이 된다.
문자열 값은 ECMA-262의
6.1.4에
따라 UTF-16 코드 유닛 시퀀스로 해석되어야 하며, 문자열 내의 서러게이트 쌍(0xD800~0xDBFF
범위의 코드 유닛 뒤에 0xDC00~0xDFFF 범위의 코드 유닛)는 해당 코드 포인트로 해석해야 한다.
아래에 설명된 동작은 문자열의 정렬 요소 시퀀스(특히 “기본 문자”)의 로케일 민감 식별에 의존하며, 서로 다른 기본 문자는 항상 같지 않다고 비교된다(따라서 그것들을
포함하는 문자열 역시 같지 않다고 비교됨). 동일 기본 문자의 대소문자, 발음 구별 부호 등의 차이에 따른 비교 결과는 collator.[[Sensitivity]]에 따라 다음과 같이 달라진다:
표 4: Collator 민감도의 효과
[[Sensitivity]]
설명
"a" vs. "á"
"a" vs. "A"
"base"
동일한 기본 문자를 가진 문자는 대소문자 및/또는 발음 구별 부호의 차이와 무관하게 서로 같지 않다고 비교되지 않는다.
같음
같음
"accent"
동일한 기본 문자를 가진 문자는 대소문자 차이와 무관하게, 악센트 및/또는 다른 발음 구별 부호가 다를 때만 같지 않다고
비교된다.
같지 않음
같음
"case"
동일한 기본 문자를 가진 문자는 발음 구별 부호의 차이와 무관하게, 대소문자가 다를 때만 같지 않다고 비교된다.
같음
같지 않음
"variant"
동일한 기본 문자를 가진 문자는 대소문자, 발음 구별 부호 및/또는 잠재적 다른 차이가 있을 때 같지 않다고 비교된다.
같지 않음
같지 않음
참고 1
입력 코드 포인트에서 기본 문자로의 매핑은 임의의 축약, 확장, 충돌을 포함할 수 있으며, 일부 발음 구별 부호가 있는 문자에 대한 특별 처리를 포함할 수
있다. 예를 들어, 스웨덴어에서 "ö"는 "o"와 다른 기본 문자이고, "v"와 "w"는 동일한 기본 문자로 간주된다. 슬로바키아어에서는 "ch"가 하나의
기본 문자이며, 영어에서는 "æ"가 "a"로 시작해 "e"로 끝나는 기본 문자 시퀀스이다.
collator.[[IgnorePunctuation]]이
true이면, 문장 부호는 무시된다(예: 문장 부호만 다른 문자열은 같다고 비교됨).
실제 반환 값은 추가 정보를 인코딩할 수 있도록 구현 정의일 수 있으나,
특정 collator에 대해 x와 y의 함수로서 고려했을 때, 모든 문자열 집합에 대해 전순서를 정의하는
일관된 비교자여야 한다.
또한, 유니코드 표준에 따른 정준 동등성을 인지하고 준수해야 하며, 구별 가능하지만 정준적으로 동등한 문자열을 비교할 때
+0𝔽을 반환해야 한다.
11.1.1.1 ChainDateTimeFormat ( dateTimeFormat,
newTarget, this )
추상 연산 ChainDateTimeFormat은 인수 dateTimeFormat (Intl.DateTimeFormat),
newTarget (ECMAScript 언어
값), this (ECMAScript 언어
값)를 받아, 정상
완료로 Object를 포함하거나 throw
완료를 반환한다. 호출 시 다음 단계를 수행한다:
추상 연산 CreateDateTimeFormat은 인수 newTarget (생성자), locales
(ECMAScript 언어
값), options (ECMAScript 언어
값), required (date,
time, any), defaults
(date, time, all)을 받아,
정상
완료로 DateTimeFormat 객체를 포함하거나 throw
완료를 반환한다. 호출 시 다음 단계를 수행한다:
[[LocaleData]] 내부 슬롯의 값은 구현 정의이며,
9.1에 설명된 제약과 다음의 추가 제약을 모두 만족해야 하며, 모든 로케일 값
locale에 대해 다음을 만족해야 한다:
[[LocaleData]].[[<locale>]].[[nu]]는 List여야
하며,
"native", "traditio", "finance" 값을
포함하지 않아야 한다.
[[LocaleData]].[[<locale>]].[[hc]]는 « null, "h11",
"h12", "h23", "h24" »여야 한다.
[[LocaleData]].[[<locale>]].[[hourCycle]]는 "h11", "h12",
"h23", "h24" 중 하나의 문자열 값이어야 한다.
[[LocaleData]].[[<locale>]].[[hourCycle12]]는 "h11" 또는
"h12" 중 하나의 문자열 값이어야 한다.
[[LocaleData]].[[<locale>]].[[hourCycle24]]는 "h23" 또는
"h24" 중 하나의 문자열 값이어야 한다.
[[LocaleData]].[[<locale>]]에는 [[formats]] 필드가 있어야 한다. 이 [[formats]] 필드의
값은 각 달력 값 calendar마다 [[<calendar>]] 필드를 가지는 Record여야
한다.
각 [[<calendar>]] 필드의 값은 DateTime Format
Records의 List여야
한다.
그러한 List
안의 여러 Record는
대응 값이 적어도 한 필드에서 서로 다르기만 하면 동일한 필드 부분집합을 사용할 수 있다. 각 로케일마다 다음 부분집합이 제공되어야 한다:
[[LocaleData]].[[<locale>]]에는 [[styles]] 필드가 있어야 한다. 이 [[styles]] 필드의 값은
각 달력 값 calendar마다 [[<calendar>]] 필드를 가지는 Record여야
한다.
각 [[<calendar>]] 필드의 값은 DateTime Styles
Record여야 한다.
레코드의 각 날짜 및 시간 서식 구성 요소 필드에 대해, 부분 문자열이
포함된다. 이 부분 문자열은 "{"로 시작하고 필드 이름이 뒤따르며,
"}"로 끝난다. 레코드에 [[year]] 필드가
있는 경우 문자열에는 "{yearName}" 및
"{relatedYear}" 부분 문자열이 포함될 수 있다.
[[HourCycle]]String
값이며, 12시간 형식("h11", "h12") 또는 24시간
형식("h23", "h24") 중 어느 쪽을 사용할지 나타낸다.
"h11"과 "h23"은 0시부터 11, 23까지, "h12"와
"h24"는 1시부터 12, 24까지 사용한다. [[HourCycle]]은 [[DateTimeFormat]]에 [[hour]] 필드가 있을 때만 사용된다.
[[DateStyle]], [[TimeStyle]]은 각각
undefined이거나, "full", "long",
"medium", "short" 값 중 하나인 String 값이다.
추상 연산 DateTimeStyleFormat은 인수 dateStyle
("full", "long", "medium",
"short" 또는 undefined), timeStyle
("full", "long", "medium",
"short" 또는 undefined), styles (DateTime Styles Record)를 받아
DateTime Format Record를 반환한다.
styles는 어떤 로케일 locale과 달력 calendar에 대해 %Intl.DateTimeFormat%.[[LocaleData]].[[<locale>]].[[styles]].[[<calendar>]]의 Record이다.
이 연산은 매개변수에 기반해 날짜-시간 서식에 적절한 Record를
반환한다.
호출 시 다음 단계를 수행한다:
Assert:
dateStyle이 undefined가 아니거나 timeStyle이
undefined가 아니다.
timeStyle이 undefined가 아니면,
Assert:
timeStyle은 "full",
"long", "medium",
"short" 중 하나이다.
timeFormat을 styles.[[Time]].[[<timeStyle>]]로 둔다.
dateStyle이 undefined가 아니면,
Assert:
dateStyle은 "full",
"long", "medium",
"short" 중 하나이다.
dateFormat을 styles.[[Date]].[[<dateStyle>]]로 둔다.
dateStyle이 undefined가 아니고 timeStyle도
undefined가 아니면,
11.5.5 FormatDateTimePattern ( dateTimeFormat,
format, pattern, epochNanoseconds )
추상 연산 FormatDateTimePattern은 인수 dateTimeFormat (Intl.DateTimeFormat),
format (DateTime Format Record
또는 DateTime Range Pattern Format
Record), pattern (Pattern String),
epochNanoseconds (BigInt)을 받아, 필드 [[Type]] (String)과
[[Value]] (String)을 가진 List를
반환한다. 이 연산은 pattern과 dateTimeFormat 및 format의 유효
로케일과 서식 옵션에 따라 epoch 시간
epochNanoseconds에 대한 해당 파트를 생성한다. 호출 시 다음 단계를 수행한다:
fv를 f에 지정된 형태로 v를 나타내는 String 값으로 둔다. 이
값은 구현 및 dateTimeFormat의 유효 로케일에 따라 달라진다. f가
"short", "long",
"shortOffset", "longOffset"인 경우, 이
값은 tm의 [[InDST]] 값에 의존할 수도 있다. 구현에
f에 대한 지역화 표현이 없으면 v 자체의 String 값을 사용한다.
result에 Record
{ [[Type]]: p, [[Value]]: fv }를 추가한다.
fv를 f에 지정된 형태로 v를 나타내는 String
값으로 둔다. 이 값은 구현 및 dateTimeFormat의 유효 로케일과 달력에 따라
달라진다. p가 "month"이면, 이 값은
format.[[day]]의 존재 여부에도 의존할
수 있다. 구현에 지역화된 표현이 없으면 v 자체의 String 값을 사용한다.
result에 Record
{ [[Type]]: p, [[Value]]: fv }를 추가한다.
result에 Record
{ [[Type]]: "yearName", [[Value]]: fv }를 추가한다.
그 밖에는,
unknown을 epochNanoseconds와 p에 기반한
구현/로케일/숫자 체계 의존 String으로 둔다.
result에 Record
{ [[Type]]: "unknown", [[Value]]: unknown }를 추가한다.
result를 반환한다.
참고
구현에서는 Common Locale Data Repository(https://cldr.unicode.org/)가 제공하는 로케일 및 달력 의존 문자열을
사용하고, DateTimeFormat의 "short" 문자열에는 CLDR의
"abbreviated" 문자열을, "long" 문자열에는 CLDR의
"wide" 문자열을 사용하는 것이 권장된다.
11.5.6 PartitionDateTimePattern ( dateTimeFormat,
x )
추상 연산 PartitionDateTimePattern은 인수 dateTimeFormat (Intl.DateTimeFormat)과 x
(Number)를 받아, 정상
완료로List
(각 원소는 [[Type]] (String), [[Value]] (String)
필드를 가짐)을 포함하거나, throw
완료를 반환한다.
x는 ECMA-262, 21.4.1.1에
규정된 time
value로 해석되며,
dateTimeFormat의 유효 로케일과 서식 옵션에 따라 해당 파트를 생성한다. 호출 시 다음 단계를 수행한다:
11.5.9 PartitionDateTimeRangePattern ( dateTimeFormat,
x, y )
추상 연산 PartitionDateTimeRangePattern은 인수 dateTimeFormat
(Intl.DateTimeFormat), x (Number), y (Number)를 받아, 정상
완료로[[Type]] (String), [[Value]] (String), [[Source]] (String) 필드를 가진 List를
포함하거나,
throw
완료를 반환한다.
x와 y는 ECMA-262, 21.4.1.1에
규정된 time
values로 해석되며,
dateTimeFormat의 유효 로케일과 서식 옵션에 따라 해당 파트를 생성한다. 호출 시 다음 단계를 수행한다:
11.5.10 FormatDateTimeRange ( dateTimeFormat,
x, y )
추상 연산 FormatDateTimeRange는 인수 dateTimeFormat (Intl.DateTimeFormat), x
(Number), y (Number)를 받아, 정상
완료로
String을 포함하거나, throw
완료를 반환한다.
호출 시 다음 단계를 수행한다:
11.5.11 FormatDateTimeRangeToParts ( dateTimeFormat,
x, y )
추상 연산 FormatDateTimeRangeToParts는 인수 dateTimeFormat (Intl.DateTimeFormat),
x (Number), y (Number)를 받아, 정상
완료로
Array를 포함하거나, throw
완료를 반환한다.
호출 시 다음 단계를 수행한다:
[[AvailableLocales]] 내부 슬롯의 값은 구현
정의이며,
9.1에 설명된 제약 내에 있어야 한다.
[[RelevantExtensionKeys]] 내부 슬롯의 값은 « »이다.
[[ResolutionOptionDescriptors]] 내부 슬롯의 값은 « »이다.
[[LocaleData]] 내부 슬롯의 값은 구현 정의이며,
9.1에 설명된 제약과 다음의 추가 제약을 모두 만족해야 한다:
[[LocaleData]].[[<locale>]]에는 모든 로케일 값
locale에 대해 [[types]] 필드가 있어야 한다. 이 필드의 값은 Record여야
하며, 모든 표시 이름 타입의 이름을 가진 필드를 포함해야 한다:
"language", "region", "script",
"currency", "calendar",
"dateTimeField".
"language" 필드의 값은 Record여야
하며, 유효한 언어 표시 중 하나의 이름을 가진 필드를 포함해야 한다:
"dialect" 및 "standard".
표시 이름 타입 "language" 아래의 언어 표시 필드는 유효한 표시 이름 스타일 중 하나의 이름을 가진 필드를 포함하는
Records여야
한다:
"narrow", "short", "long".
"region", "script",
"currency", "calendar",
"dateTimeField" 필드의 값은 Records여야
하며,
모든 표시 이름 스타일의 이름을 가진 필드를 포함해야 한다:
"narrow", "short", "long".
표시 이름 타입 "language" 아래의 표시 이름 스타일 필드는 unicode_language_id가
매칭될 수 있는 언어 코드에 대응하는 키를 가진 Records를
포함해야 한다. 이 필드들의 값은 문자열이어야 한다.
표시 이름 타입 "region" 아래의 표시 이름 스타일 필드는 지역 코드에 대응하는 키를 가진 Records를
포함해야 한다. 이 필드들의 값은 문자열이어야 한다.
표시 이름 타입 "script" 아래의 표시 이름 스타일 필드는 스크립트 코드에 대응하는 키를 가진 Records를
포함해야 한다. 이 필드들의 값은 문자열이어야 한다.
표시 이름 타입 "currency" 아래의 표시 이름 스타일 필드는 통화 코드에 대응하는 키를 가진 Records를
포함해야 한다. 이 필드들의 값은 문자열이어야 한다.
표시 이름 타입 "calendar" 아래의 표시 이름 스타일 필드는 typeUnicode 로케일
비단말에 매칭될 수 있는 달력 식별자에 대응하는 키를 가진 Records를
포함해야 한다. 이 필드들의 값은 문자열이어야 한다.
표시 이름 타입 "dateTimeField" 아래의 표시 이름 스타일 필드는 Records를
포함해야 하며, 키는 표 19에 나열된 코드에 대응해야 한다. 이 필드들의
값은 문자열이어야 한다.
참고
구현에서는 가능하면 Common Locale Data Repository(https://cldr.unicode.org/)에서 제공하는 로케일 데이터를 사용하는 것이
권장된다.
추상 연산 CanonicalCodeForDisplayNames는 인수 type (String)과 code (String)을 받아,
정상
완료로
String을 포함하거나 throw
완료를 반환한다.
이 연산은 type에 따라 code가 올바른 형식의 코드임을 검증하고, code의 케이스 정규화 형태를 반환한다.
호출 시 다음 단계를 수행한다:
추상 연산 ToIntegerIfIntegral은 인수 argument (ECMAScript 언어
값)을 받아,
정상
완료로integer를
포함하거나,
throw
완료를 반환한다.
이 연산은 argument를 그 Number 값을 나타내는 integer로 변환하거나, 그 값이
정수가 아닌 경우
RangeError를 던진다.
호출 시 다음 단계를 수행한다:
추상 연산 DurationSign은 인수 duration (Duration
Record)을 받아 -1, 0, 또는 1을 반환한다. duration의 가장 의미 있는
0이 아닌 필드가 양수면 1, 음수면 -1을 반환한다. 모든 필드가 0이면 0을 반환한다. 호출 시 다음 단계를 수행한다:
« duration.[[Years]],
duration.[[Months]], duration.[[Weeks]], duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]] »의 각 값 v에 대해, 다음을 수행한다:
참고: 위 단계는 부동소수점 산술을 직접 사용해 구현할 수 없다. milliseconds, microseconds,
nanoseconds가 안전하지 않은 integer인 경우
10-3, 10-6, 10-9를 각각 곱하는 것은 부정확할 수 있다.
이 곱셈은 충분한 몫 비트를 갖는 std::remquo() 구현을 사용한 C++에서 구현할 수 있다.
또한 10의 거듭제곱을 곱하는 것이므로 문자열 조작으로도 정확한 결과를 얻을 수 있다.
추상 연산 GetDurationUnitOptions는 인수 unit (String),
options (Object), baseStyle (String), stylesList (Strings의
List),
digitalBase (String), prevStyle (String), twoDigitHours
(Boolean)을 받아
정상
완료로Duration Unit Options Record를
포함하거나
throw
완료를 반환한다.
주어진 객체에서 임의의 unit에 대한 관련 옵션을 추출하여
Record로
반환한다.
호출 시 다음 단계를 수행한다:
style을 ? GetOption(options,
unit, string, stylesList,
undefined)로 둔다.
13.5.6.2 ValidateDurationUnitStyle ( unit,
style, display, prevStyle )
추상 연산 ValidateDurationUnitStyle은 인수 unit (String),
style (String), display (String), prevStyle (String)을 받아,
정상
완료로unused를 반환하거나 throw
완료를 반환한다.
호출 시 다음 단계를 수행한다:
추상 연산 ComputeFractionalDigits는 인수 durationFormat (DurationFormat 객체)과
duration (Duration Record)을 받아
수학적
값을 반환한다.
이 연산은 durationFormat에서 "fractional" 스타일을 사용하는 모든 단위의 값을,
"fractional" 스타일을 사용하지 않는 가장 작은 단위의 분수로 표현하여 합산한다.
호출 시 다음 단계를 수행한다:
value를 현재 행의 Value Field 이름을 가진
duration의 필드 값으로 둔다.
result를 result + (value /
10exponent)로 설정한다.
exponent를 exponent + 3으로 설정한다.
result를 반환한다.
13.5.8 NextUnitFractional ( durationFormat,
unit )
추상 연산 NextUnitFractional은 인수 durationFormat (DurationFormat 객체)과
unit (String)을 받아 Boolean을 반환한다. 다음으로 작은 단위가
"fractional" 스타일을 사용하면 true를 반환한다.
호출 시 다음 단계를 수행한다:
추상 연산 FormatNumericHours는 인수 durationFormat (DurationFormat 객체),
hoursValue (integer),
signDisplayed (Boolean)을 받아
Records의
List를
반환한다.
hoursValue는 시 수를 나타내는 integer이다.
이 연산은 유효 로케일과 durationFormat의 서식 옵션에 따라 hoursValue에 대한 파트를 생성한다.
호출 시 다음 단계를 수행한다:
추상 연산 FormatNumericMinutes는 인수 durationFormat (DurationFormat 객체),
minutesValue (integer),
hoursDisplayed (Boolean), signDisplayed (Boolean)을 받아
Records의
List를
반환한다.
minutesValue는 분 수를 나타내는 integer이다.
유효 로케일과 durationFormat의 서식 옵션에 따라 minutesValue에 대한 파트를 생성한다.
호출 시 다음 단계를 수행한다:
추상 연산 FormatNumericSeconds는 인수 durationFormat (DurationFormat 객체),
secondsValue (수학적 값),
minutesDisplayed (Boolean), signDisplayed (Boolean)을 받아
Records의
List를
반환한다.
secondsValue는 초 수를 나타내는 수학적 값이다.
유효 로케일과 durationFormat의 서식 옵션에 따라 secondsValue에 대한 파트를 생성한다.
호출 시 다음 단계를 수행한다:
추상 연산 FormatNumericUnits는 인수 durationFormat (DurationFormat 객체),
duration (Duration Record),
firstNumericUnit (String), signDisplayed (Boolean)을 받아
Records의
List를
반환한다.
이 연산은 유효 로케일과 durationFormat의 서식 옵션에 따라,
"numeric" 또는 "2-digit" 스타일을 사용하는
duration의 요소들을 나타내는 파트를 생성한다. 호출 시 다음 단계를 수행한다:
Assert:
firstNumericUnit은 "hours", "minutes",
또는 "seconds"이다.
추상 연산 ListFormatParts는 인수 durationFormat (DurationFormat 객체)과
partitionedPartsList (Lists의
List로
구성된,
Records의
List)을
받아
List를
반환한다.
이 연산은 유효 로케일과 durationFormat의 서식 옵션에 따라,
partitionedPartsList 내 Lists의
파트에 대응하는 List를
생성한다.
추상 연산 PartitionDurationFormatPattern은 인수 durationFormat (DurationFormat)과
duration (Duration Record)을 받아
List를
반환한다.
유효 로케일과 durationFormat의 서식 옵션에 따라 duration에 대응하는 파트를 생성한다.
호출 시 다음 단계를 수행한다:
[[AvailableLocales]] 내부 슬롯의 값은 구현
정의이며,
9.1에 설명된 제약 내에 있어야 한다.
[[RelevantExtensionKeys]] 내부 슬롯의 값은 « »이다.
[[ResolutionOptionDescriptors]] 내부 슬롯의 값은 « »이다.
참고 1
Intl.ListFormat은 관련 확장 키를 가지지 않는다.
[[LocaleData]] 내부 슬롯의 값은 구현 정의이며,
9.1에 설명된 제약과 다음의 추가 제약을 각 로케일 값
locale에 대해 만족해야 한다. %Intl.ListFormat%.[[AvailableLocales]]에 포함된 각 로케일에 대해:
[[LocaleData]].[[<locale>]]는 세 개의 필드 [[conjunction]], [[disjunction]], [[unit]]를 가진 Record이다.
이들 각각은 세 가지 서식 스타일 이름 [[long]], [[short]],
[[narrow]]의 필드를 가져야 하는 Record이어야
한다.
이 필드 각각은 ListFormat 템플릿 집합으로 간주되며, [[Pair]], [[Start]],
[[Middle]], [[End]]라는 이름의 필드를 가진 Records의
List여야
한다. 각 필드는 LDML List
Format Rules에 규정된 템플릿 문자열이어야 한다. 각 템플릿 문자열은 "{0}"과
"{1}" 부분 문자열을 정확히 한 번씩 포함해야 한다. 부분 문자열"{0}"은 부분 문자열"{1}"보다 앞에 나와야 한다.
참고 2
구현에서는 Common Locale Data Repository(https://cldr.unicode.org/)에서 제공하는 로케일 데이터를 사용하는 것이 권장된다.
LDML의
listPattern에서,
conjunction은 "standard"에, disjunction은 "or"에, unit은
"unit"에 대응한다.
참고 3
목록 타입 중에서 conjunction은 "and" 기반 목록(예: "A, B, and C")을,
disjunction은 "or" 기반 목록(예: "A, B, or C")을,
unit은 단위가 있는 값의 목록(예: "5 pounds, 12 ounces")을 의미한다.
추상 연산 CreatePartsFromList는 인수 listFormat (Intl.ListFormat)과 list (Strings의
List)를
받아
List를
반환한다.
이 List는 Records로
구성되고
[[Type]] ("element" 또는
"literal")과
[[Value]] (String) 필드를 갖는다. 이 연산은 유효 로케일과 listFormat의 서식 옵션에
따라
해당 파트들의 List를
생성한다.
호출 시 다음 단계를 수행한다:
SameValue(r.[[kn]], "true")가
true이거나 r.[[kn]]이 빈
문자열이면,
locale.[[Numeric]]을
true로 설정한다.
그 밖에는,
locale.[[Numeric]]을
false로 설정한다.
locale.[[NumberingSystem]]을 r.[[nu]]로 설정한다.
locale를 반환한다.
15.1.2 UpdateLanguageId ( tag, options )
추상 연산 UpdateLanguageId는 인수 tag (Unicode 정규화된 로케일 식별자)와
options (Object)을 받아, language tag를 포함하는
정상
완료나
throw
완료를 반환한다.
이 연산은 tag의 unicode_language_idsubtags를
options의 해당 프로퍼티로부터 업데이트하고, 구조적으로 유효하나 비정규화된 결과를 반환한다. 호출 시 다음 단계를 수행한다:
추상 연산 MakeLocaleRecord는 인수 tag (language tag),
options (Record),
localeExtensionKeys (Strings의 List)를
받아
Record를
반환한다.
이 연산은 tag의 Unicode 로케일 확장 시퀀스에서 데이터를 가져오되
options의 해당 필드로 이를 재정의하여, localeExtensionKeys의 각 요소가 해당 필드를 정의하는
Record를
구성하고 반환한다.
또한 그 필드들을 tag에 반영하여 얻은 [[locale]] 필드(이는 Unicode 정규화된 로케일
식별자)를 포함해야 한다.
호출 시 다음 단계를 수행한다:
[[LocaleExtensionKeys]] 내부 슬롯의 값은 List이며,
반드시 « "ca", "co", "hc",
"nu" »의 모든 요소를 포함해야 한다.
또한 %Intl.Collator%.[[RelevantExtensionKeys]]에도 존재하는 « "kf",
"kn" »의 임의의 요소를 추가로 포함해야 하며,
그 외의 다른 요소는 포함해서는 안 된다.
참고: unicode_region_subtagsubtag는
초기 unicode_language_subtagsubtag 바로 뒤에서만 유효하며,
그 사이에 단 하나의 unicode_script_subtagsubtag가 있을 수 있다.
이 위치에서 unicode_region_subtag는 다른 유효한 subtag들과 혼동될 수 없는데, 그 생산 규칙들이
서로 소(disjoint)하기 때문이다.
참고: baseName에서 "-"로 시작하는 각 subtag는
unicode_script_subtag, unicode_region_subtag, 또는
unicode_variant_subtag 중 하나이지만,
unicode_variant_subtag에 매칭되는 어떤 substring도
다른 생산 규칙으로 매칭될 수 있는 그 어떤 접두사보다 항상 더 길다.
variants를 baseName의 접미사 중, "-"로 시작하고
이어지는 substring가 unicode_variant_subtagUnicode 로케일
비단말에 매칭되는 가장 긴 접미사로 둔다.
그러한 접미사가 없으면 undefined를 반환한다.
추상 연산 SetNumberFormatDigitOptions는 인수 intlObj (Object), options (Object),
mnfdDefault (integer), mxfdDefault
(integer),
notation
(String)을 받아 정상
완료로
unused 또는 throw
완료를 반환한다.
이 연산은 intlObj의 로케일 독립적 숫자 반올림에 영향을 주는 내부 슬롯을 채운다(16.5.3 참조). 호출 시 다음 단계를 수행한다:
mnid를 ? GetNumberOption(options,
"minimumIntegerDigits,", 1, 21, 1)로 둔다.
mnfd를 ? Get(options,
"minimumFractionDigits")로 둔다.
mxfd를 ? Get(options,
"maximumFractionDigits")로 둔다.
mnsd를 ? Get(options,
"minimumSignificantDigits")로 둔다.
mxsd를 ? Get(options,
"maximumSignificantDigits")로 둔다.
intlObj.[[MinimumIntegerDigits]]를
mnid로 설정한다.
roundingIncrement를 ? GetNumberOption(options,
"roundingIncrement", 1, 5000, 1)로 둔다.
추상 연산 SetNumberFormatUnitOptions는 인수 intlObj (Intl.NumberFormat), options
(Object)를 받아,
정상
완료로
unused 또는 throw
완료를 반환한다.
이 연산은 단위 관련 사용자 지정 옵션을 intlObj에 반영한다. 호출 시 다음 단계를 수행한다:
[[LocaleData]] 내부 슬롯의 값은 구현 정의이며,
9.1에 설명된 제약과 다음 추가 제약 내에 있어야 한다:
"nu" 필드의 값인 List는
"native", "traditio", "finance" 값을
포함해서는 안 된다.
[[LocaleData]].[[<locale>]]는 모든 로케일 값
locale에 대해 [[patterns]] 필드를 가져야 한다. 이 필드의 값은 Record여야
하며,
네 가지 숫자 서식 스타일 이름("decimal", "percent",
"currency", "unit")의 필드를 가져야 한다.
위의 "currency"와 "unit" 두 필드는
Records여야
하며,
최소한 "fallback" 필드를 반드시 포함해야 한다.
"currency"는 6.3에 따라 통화 코드에 해당하는 추가 필드를 가질 수 있다.
"currency"의 각 필드는 Record여야
하며,
currencyDisplay 가능한 값("code", "symbol",
"narrowSymbol", "name")의 필드를 가져야 한다.
이들 각각은 Record여야
하며,
currencySign 가능한 값("standard", "accounting")의 필드를 가져야
한다.
"unit" 필드는 "fallback" 필드 외에도
6.6에 따라
core 측정 단위 식별자에 해당하는 추가 필드를 가질 수 있다.
"unit"의 각 필드는 Record여야
하며,
unitDisplay 가능한 값("narrow", "short",
"long")의 필드를 가져야 한다.
지금까지 설명된 패턴 트리의 각 리프 필드("decimal", "percent",
"currency"의 증손자, "unit"의 손자)는
Records여야
하며,
"positivePattern", "zeroPattern",
"negativePattern" 키를 가져야 한다.
위에서 언급한 필드(부호 의존 패턴 필드)의 값은 반드시 문자열이어야 하며, 부분 문자열"{number}"를 포함해야 한다.
"positivePattern"은 부분 문자열"{plusSign}"을 반드시 포함하고 "{minusSign}"은 포함하지 않아야 한다;
"negativePattern"은 부분 문자열"{minusSign}"을 반드시 포함하고 "{plusSign}"은 포함하지 않아야 한다;
"zeroPattern"은 "{plusSign}"과
"{minusSign}" 모두 포함해서는 안 된다.
추가로, "percent" 필드 내 값은 부분 문자열"{percentSign}"을 반드시 포함해야 하고,
"currency" 필드 내 값은 "{currencyCode}",
"{currencyPrefix}", "{currencySuffix}" 중 하나 이상을 반드시
포함해야 하며,
"unit" 필드 내 값은 "{unitPrefix}" 또는
"{unitSuffix}" 중 하나 이상을 반드시 포함해야 한다.
패턴 문자열은 ECMA-262,
6.1.4에서
설명된 대로 UTF-16 인코딩 코드 포인트의 시퀀스로 해석할 때,
Unicode Standard의 General Category "Number, decimal digit"에 해당하는 코드 포인트를 포함해서는 안 된다.
[[LocaleData]].[[<locale>]]는 모든 로케일 값
locale에 대해 [[notationSubPatterns]] 필드를 가져야 한다.
이 필드의 값은 Record여야
하며,
[[scientific]]와 [[compact]] 필드를 가져야 한다.
[[scientific]] 필드는 "{number}",
"{scientificSeparator}", "{scientificExponent}" 부분
문자열을 포함하는 문자열이어야 한다.
[[compact]] 필드는 Record여야
하며,
"short"와 "long" 필드를 가져야 한다. 이들 각각은 integer 키를 가진
모든 지원되는 compact notation 크기에 대한 Record여야
한다.
각각의 값은 부분
문자열"{number}"를 포함할 수 있다.
"short"에서 유래한 문자열은 부분 문자열"{compactSymbol}"을 포함해야 하며, "long"에서 유래한 문자열은
부분
문자열"{compactName}"을 포함해야 한다.
참고 2
구현에서는 Common Locale Data Repository(https://cldr.unicode.org/)에서 제공하는 로케일 데이터를 사용하는 것이 권장된다.
[[Style]]은 "decimal",
"currency", "percent", "unit" 중 하나의 문자열
값이며,
측정되는 양의 타입을 식별한다.
[[Currency]]String
값으로, "currency" 단위 타입으로 서식화할 때 사용할 통화를 식별하는 통화 코드이다. [[Style]]이 "currency"일 때만 사용된다.
[[CurrencyDisplay]]는 "code",
"symbol", "narrowSymbol", "name" 중 하나의
문자열 값이며, "currency" 스타일로 서식화할 때 통화를 ISO 4217 알파벳 통화 코드, 로케일화된 통화 기호, 또는 로케일화된
통화 이름으로 표시할지 지정한다. [[Style]]이 "currency"일 때만 사용된다.
[[CurrencySign]]는 "standard" 또는
"accounting" 중 하나의 문자열 값이며, 음수를 회계 방식(종종 괄호로 표시)으로 렌더링할지 여부를 지정한다. [[Style]]이 "currency"이고 [[SignDisplay]]가 "never"가 아닐 때만 사용된다.
[[UnitDisplay]]는 "short",
"narrow", "long" 중 하나의 문자열 값이며, "unit"
스타일로 서식화할 때 단위를 심볼, 좁은 심볼, 또는 로케일화된 긴 이름으로 표시할지 지정한다. [[Style]]이
"unit"일 때만 사용된다.
[[MinimumIntegerDigits]]는 사용할 최소 정수 자릿수를 나타내는 0 이상의 정수이다. 필요하면 숫자
앞에 0을 채운다.
[[MinimumFractionDigits]]와 [[MaximumFractionDigits]]는 사용할 최소/최대 소수 자릿수를 나타내는 0 이상의 정수이다. 필요하면 숫자는
반올림되거나 소수점 뒤에 0을 채운다. 이 속성은 [[RoundingType]]이
fraction-digits, more-precision,
less-precision일 때만 사용된다.
[[MinimumSignificantDigits]]와 [[MaximumSignificantDigits]]는 보여줄 최소/최대 유효 자릿수를 나타내는 양수 정수이다. 지정된 유효 자릿수를
표시하는 데 필요한 만큼의 소수 자릿수를 사용한다. 이 속성은 [[RoundingType]]이
significant-digits, more-precision,
less-precision일 때만 사용된다.
[[UseGrouping]]Boolean
또는 문자열 값이며, 그룹 구분 기호를 사용할 조건을 나타낸다. 그룹 구분 기호의 위치와 표시 여부는 구현
정의이다.
"always" 값은 가능하면 그룹 구분 기호를 표시하도록 구현에 힌트를 주고, "min2"는 그룹 내
자릿수가 2개 이상일 때 표시, "auto"는 로케일이 그룹 구분 기호를 선호할 때 표시한다. false
값은 그룹 구분 기호를 사용하지 않는다.
[[RoundingType]]은 fraction-digits,
significant-digits,
more-precision, less-precision 중 하나의 값이며, 어떤 반올림
전략을 사용할지 나타낸다. fraction-digits인 경우, 서식화된 숫자는 [[MinimumFractionDigits]] 및 [[MaximumFractionDigits]] 값에 따라 반올림된다.
significant-digits인 경우, [[MinimumSignificantDigits]] 및 [[MaximumSignificantDigits]] 값에 따라 반올림된다.
more-precision 또는 less-precision인 경우, 네 값 모두 사용하며
언제 어떤 값을 쓸지 구체 규칙을 따른다. [[RoundingType]]은
"roundingPriority" 옵션에서 파생된다.
[[ComputedRoundingPriority]]는 "auto",
"morePrecision", "lessPrecision" 중 하나의 문자열 값이다. 이는
16.3.2에서 [[RoundingType]]을 다시 유효한 "roundingPriority" 옵션으로 변환하는
데만 사용된다.
[[Notation]]은 "standard",
"scientific", "engineering", "compact"
중 하나의 문자열 값으로, 서식화된 숫자를 스케일링 없이, 과학적 표기법으로 십의 제곱수로, 엔지니어링 표기법으로 천 단위로 십의 제곱수로, 또는 ILD compact decimal notation 십의
제곱수로 compact decimal notation 접미사와 함께 표시할지 지정한다.
[[CompactDisplay]]는 "short" 또는
"long" 중 하나의 문자열 값으로, "compact" 표기법으로 서식화할 때 compact
notation 접미사를 짧게("5K") 또는 길게("5천") 표시할지 지정한다. [[Notation]]이
"compact"일 때만 사용된다.
[[SignDisplay]]는 "auto",
"always", "never", "exceptZero",
"negative" 중 하나의 문자열 값으로, 부호를 언제 포함할지 지정한다(각 옵션은 항상, 절대 안 함, 0이 아닐 때만, 음수이면서
0이 아닐 때만 포함됨에 대응). 과학적 표기법에서는 이 슬롯이 맨티사의 부호 표시에는 영향을 주지만 지수에는 영향을 주지 않는다.
[[RoundingIncrement]]는 10, 100, 1000 또는 10000을 10분의 1, 5분의 1, 4분의 1,
2분의 1로 정수로 나눌 수 있는 정수이다. 이는 반올림을 계산된 반올림 크기에서 얼마 단위로
할지 지정한다. 예를 들어, [[MaximumFractionDigits]]가 2이고 [[RoundingIncrement]]가 5면, 숫자는 소수점 두 자리에서 0.05 단위로 반올림된다("nickel
rounding").
[[RoundingMode]]는 반올림 모드이며,
표
27의 Identifier 열에 나오는 문자열 값 중 하나이다.
[[TrailingZeroDisplay]]는 "auto" 또는
"stripIfInteger" 중 하나의 문자열 값으로, 서식화된 숫자가 정수(즉, 0이 아닌 소수 자릿수가 없음)일 때 끝의 0을
제거할지 여부를 지정한다.
표 27: Intl.NumberFormat의 반올림 모드
Identifier
설명
예시: 소수 자릿수 0으로 반올림
-1.5
0.4
0.5
0.6
1.5
"ceil"
양의 무한대 방향으로
⬆️ [-1]
⬆️ [1]
⬆️ [1]
⬆️ [1]
⬆️ [2]
"floor"
음의 무한대 방향으로
⬇️ [-2]
⬇️ [0]
⬇️ [0]
⬇️ [0]
⬇️ [1]
"expand"
0에서 멀어지는 방향으로
⬇️ [-2]
⬆️ [1]
⬆️ [1]
⬆️ [1]
⬆️ [2]
"trunc"
0 방향으로
⬆️ [-1]
⬇️ [0]
⬇️ [0]
⬇️ [0]
⬇️ [1]
"halfCeil"
동점은 양의 무한대 방향으로
⬆️ [-1]
⬇️ [0]
⬆️ [1]
⬆️ [1]
⬆️ [2]
"halfFloor"
동점은 음의 무한대 방향으로
⬇️ [-2]
⬇️ [0]
⬇️ [0]
⬆️ [1]
⬇️ [1]
"halfExpand"
동점은 0에서 멀어지는 방향으로
⬇️ [-2]
⬇️ [0]
⬆️ [1]
⬆️ [1]
⬆️ [2]
"halfTrunc"
동점은 0 방향으로
⬆️ [-1]
⬇️ [0]
⬇️ [0]
⬆️ [1]
⬇️ [1]
"halfEven"
동점은 반올림 증분 배수 중 짝수 쪽으로
⬇️ [-2]
⬇️ [0]
⬇️ [0]
⬆️ [1]
⬆️ [2]
참고
예시는 각 옵션의 독특한 동작을 보여주기 위한 것이다. ⬆️는 "양의 무한대로"를 의미하고, ⬇️는 "음의
무한대로"를 의미한다.
마지막으로, Intl.NumberFormat 인스턴스는 format 접근자(16.3.3)가 반환하는 함수를
캐싱하는 [[BoundFormat]] 내부 슬롯을 가진다.
16.5 NumberFormat 객체를 위한 추상 연산
16.5.1 CurrencyDigits ( currency )
구현 정의
추상 연산 CurrencyDigits는 인수 currency (문자열)를 받아 음이 아닌 정수를 반환한다. 호출 시 다음 단계를 수행한다:
추상 연산 FormatNumericToString은 인수 intlObject (객체)와 x (수학적
값 또는
negative-zero)를 받아, [[RoundedNumber]] (수학적
값 또는
negative-zero)와 [[FormattedString]] (문자열) 필드를 가진
Record를
반환한다. x를 intlObject의 내부 슬롯에 따라 Intl 수학적 값으로 반올림한다. [[RoundedNumber]] 필드는 반올림된 값, [[FormattedString]] 필드는 해당 값을 intlObject의 내부 슬롯에 따라 서식화한 문자열
표현을 담는다. 호출 시 다음 단계를 수행한다:
Assert:
intlObject는 [[RoundingMode]], [[RoundingType]], [[MinimumSignificantDigits]], [[MaximumSignificantDigits]], [[MinimumIntegerDigits]], [[MinimumFractionDigits]], [[MaximumFractionDigits]], [[RoundingIncrement]], [[TrailingZeroDisplay]] 내부 슬롯을 가진다.
Record
{ [[RoundedNumber]]: x, [[FormattedString]]: string }를 반환한다.
16.5.4 PartitionNumberPattern ( numberFormat,
x )
추상 연산 PartitionNumberPattern은 인수 numberFormat (초기화된 NumberFormat 객체)과 x
(Intl
수학적 값)를 받아,
x의 수학적 값을 유효 로케일과
numberFormat의 서식 옵션에 따라 나타내는 [[Type]] (문자열) 및 [[Value]] (문자열) 필드를 가진 List를
반환한다. 호출 시 다음 단계를 수행한다:
result에 Record
{ [[Type]]: "unknown", [[Value]]: unknown }를 추가한다.
result를 반환한다.
16.5.5 PartitionNotationSubPattern ( numberFormat,
x, n, exponent )
추상 연산 PartitionNotationSubPattern은 인수 numberFormat (Intl.NumberFormat), x
(Intl
수학적 값), n (문자열), exponent (정수)를 받아 List를
반환한다.
이 List는 Records로
구성되고
[[Type]] (문자열), [[Value]] (문자열) 필드를 갖는다.
x는 반올림이 적용된 Intl 수학적 값이며, n은 중간 서식 문자열이다.
이 연산은 유효 로케일과 numberFormat의 서식 옵션에 따라 숫자 및 표기법에 대한 파트를 생성한다.
호출 시 다음 단계를 수행한다:
Record
{ [[Type]]:
"decimal", [[Value]]:
decimalSepSymbol }를 result에
추가한다.
Record
{ [[Type]]:
"fraction", [[Value]]:
fraction }를 result에 추가한다.
그 밖에 p가 "compactSymbol"이면,
compactSymbol을 ILD
문자열 값으로, exponent의 짧은 형태를 나타낸다. 복수형이 다른 언어에서는
x에 따라 달라질 수 있다. 구현체는 반드시 이 값을 제공해야 하며, 그렇지 않으면 패턴에
"{compactSymbol}" 플레이스홀더가 존재하지 않는다.
Record
{ [[Type]]:
"compact", [[Value]]:
compactSymbol }를 result에 추가한다.
그 밖에 p가 "compactName"이면,
compactName을 ILD
문자열 값으로, exponent의 긴 형태를 나타낸다. 복수형이 다른 언어에서는
x에 따라 달라질 수 있다. 구현체는 반드시 이 값을 제공해야 하며, 그렇지 않으면 패턴에
"{compactName}" 플레이스홀더가 존재하지 않는다.
Record
{ [[Type]]:
"compact", [[Value]]: compactName }
를 result에 추가한다.
그 밖에 p가 "scientificSeparator"이면,
scientificSeparator를 ILND
문자열 값으로, 지수 구분 기호를 나타낸다.
Record
{ [[Type]]:
"exponentSeparator", [[Value]]:
scientificSeparator }를 result에 추가한다.
계산은 ILD 및 ILND 문자열 값과
numberFormat의 유효 로케일 또는 유효 로케일 및 숫자 체계에 따라 달라지는 숫자 문자열 내 위치에 의존한다.
언급된 ILD와
ILND 문자열 값(통화명 제외)은 Unicode
Standard의 General Category "Number, decimal digit"에 해당하는 코드 포인트를 포함해서는 안 된다.
추상 연산 ToRawPrecision은 인수 x (음이 아닌 수학적
값), minPrecision (정수, 1~21 범위),
maxPrecision (정수, 1~21 범위),
unsignedRoundingMode (표29의 Unsigned Rounding Mode 열 값 또는 undefined)를
받아 Record를 반환한다. 이 Record는
[[FormattedString]] (문자열), [[RoundedNumber]]
(수학적 값), [[IntegerDigitsCount]] (정수), [[RoundingMagnitude]] (정수) 필드를 가진다.
다음 식을 풀어 유효한 수학적 값을 반환한다 (정수 입력):
ToRawPrecisionFn(n, e, p) = n ×
10e–p+1
여기서 10p–1 ≤ n < 10p
호출 시 다음 단계를 수행한다:
p를 maxPrecision으로 둔다.
x = 0이면,
m을 p번 0x0030(DIGIT ZERO) 코드 유닛으로 이루어진 문자열로 둔다.
e를 0으로 둔다.
xFinal을 0으로 둔다.
그 밖에는,
n1, e1를 각각 정수로, r1을 수학적 값으로 둔다. r1 =
ToRawPrecisionFn(n1,
e1, p)이며, r1 ≤ x이고 r1이 최대가
되도록 한다.
n2, e2를 각각 정수로, r2를 수학적 값으로 둔다. r2 =
ToRawPrecisionFn(n2,
e2, p)이며, r2 ≥ x이고 r2가 최소가
되도록 한다.
xFinal을 ApplyUnsignedRoundingMode(x,
r1, r2, unsignedRoundingMode)로 둔다.
xFinal이 r1이면,
n을 n1로 둔다.
e를 e1로 둔다.
그 밖에는,
n을 n2로 둔다.
e를 e2로 둔다.
m을 n의 10진수 표현의 각 자릿수(앞의 0 없음)로 이루어진 문자열로 둔다.
e ≥ (p - 1)이면,
m을 문자열
연결(m, e - p + 1번 0x0030(DIGIT
ZERO))로 설정한다.
int를 e + 1로 둔다.
그 밖에 e ≥ 0이면,
m을 문자열
연결(m의 앞 e + 1 코드 유닛, 0x002E(FULL STOP),
m의 나머지 p - (e + 1) 코드 유닛)로 설정한다.
추상 연산 ToRawFixed는 인수 x (음이 아닌 수학적 값),
minFraction (정수, 0~100 범위),
maxFraction (정수, 0~100 범위),
roundingIncrement (정수),
unsignedRoundingMode (표29의 Unsigned Rounding Mode 열 값 또는 undefined)를
받아 Record를 반환한다. 이 Record는
[[FormattedString]] (문자열), [[RoundedNumber]]
(수학적 값), [[IntegerDigitsCount]] (정수), [[RoundingMagnitude]] (정수) 필드를 가진다.
다음 식을 풀어 유효한 수학적 값을 반환한다 (정수 입력):
ToRawFixedFn(n, f) = n × 10–f
호출 시 다음 단계를 수행한다:
f를 maxFraction으로 둔다.
n1을 정수, r1을
수학적 값으로 둔다. r1 = ToRawFixedFn(n1,
f)이며, n1moduloroundingIncrement = 0, r1 ≤
x이고 r1이 최대가 되도록 한다.
n2을 정수, r2을
수학적 값으로 둔다. r2 = ToRawFixedFn(n2,
f)이며, n2moduloroundingIncrement = 0, r2 ≥
x이고 r2가 최소가 되도록 한다.
xFinal을 ApplyUnsignedRoundingMode(x,
r1, r2, unsignedRoundingMode)로 둔다.
xFinal이 r1이면 n을 n1로, 아니면 n을
n2로 둔다.
n = 0이면 m을 "0"로, 아니면 m을
n의 10진수 표현 각 자릿수(앞의 0 없음) 문자열로 둔다.
f ≠ 0이면,
k를 m의 길이로 둔다.
k ≤ f이면,
z를 f + 1 - k번 0x0030(DIGIT ZERO) 코드
유닛으로 이루어진 문자열로 둔다.
m을 문자열
연결(z, m)로 설정한다.
k를 f + 1로 둔다.
a를 m의 앞 k - f 코드 유닛, b를
나머지 f 코드 유닛으로 둔다.
m을 문자열
연결(a, ".", b)로 설정한다.
int를 a의 길이로 둔다.
그 밖에는,
int를 m의 길이로 둔다.
cut를 maxFraction - minFraction로 둔다.
cut > 0이고 m의 마지막 코드 유닛이 0x0030(DIGIT ZERO)인 동안 반복한다,
마지막 코드 유닛을 m에서 제거한다.
cut을 cut - 1로 설정한다.
m의 마지막 코드 유닛이 0x002E(FULL STOP)이면,
마지막 코드 유닛을 m에서 제거한다.
Record
{ [[FormattedString]]: m, [[RoundedNumber]]: xFinal, [[IntegerDigitsCount]]: int, [[RoundingMagnitude]]: –f }를 반환한다.
규범적 선택 사양
16.5.10 UnwrapNumberFormat ( nf )
추상 연산 UnwrapNumberFormat은 인수 nf (ECMAScript 언어 값)를 받아 정상 완료로 ECMAScript 언어 값를 반환하거나 throw 완료를 반환한다.
입력 객체의 NumberFormat 인스턴스를 반환하는데, 이는 값 자체이거나 %Intl.NumberFormat%가 생성자의
규범적 선택 사양(4.3 참고 1)에 따라 연결한 값이다.
호출 시 다음 단계를 수행한다:
nf가 객체가 아니면,
TypeError 예외를 던진다.
nf가 [[InitializedNumberFormat]] 내부 슬롯을 가지지 않고,
? OrdinaryHasInstance(%Intl.NumberFormat%,
nf)가 true이면,
? Get(nf,
%Intl%.[[FallbackSymbol]])를 반환한다.
nf를 반환한다.
16.5.11 GetNumberFormatPattern ( numberFormat,
x )
추상 연산 GetNumberFormatPattern은 인수 numberFormat (Intl.NumberFormat)과 x
(Intl 수학적 값)를 받아 문자열을 반환한다.
이 연산은 numberFormat 객체의 최종 단위 관련 옵션들과 서식화되는 최종 스케일 및 반올림된 숫자(Intl 수학적 값)를 고려하여, 16.2.3에서 설명된 패턴(문자열
값)을 반환한다.
호출 시 다음 단계를 수행한다:
resolvedLocaleData를 numberFormat.[[LocaleData]]로 둔다.
patterns를 resolvedLocaleData.[[patterns]]로 둔다.
Assert: patterns는 Record이다 (16.2.3 참조).
style을 numberFormat.[[Style]]로 둔다.
style이 "percent"이면,
patterns를 patterns.[[percent]]로
설정한다.
그 밖에 style이 "unit"이면,
unit을 numberFormat.[[Unit]]로 둔다.
unitDisplay를 numberFormat.[[UnitDisplay]]로 둔다.
patterns를 patterns.[[unit]]로
설정한다.
patterns에 [[<unit>]] 필드가 없으면,
unit을 "fallback"로 설정한다.
patterns를 patterns.[[<unit>]]로 설정한다.
patterns를 patterns.[[<unitDisplay>]]로
설정한다.
그 밖에 style이 "currency"이면,
currency를 numberFormat.[[Currency]]로 둔다.
currencyDisplay를 numberFormat.[[CurrencyDisplay]]로 둔다.
추상 연산 GetNotationSubPattern은 인수 numberFormat (Intl.NumberFormat)과 exponent
(정수)를 받아 문자열을 반환한다.
이 연산은 해석된 notation과 exponent를 고려하여, 16.2.3에서 설명된 notation
sub pattern용 문자열 값을 반환한다.
호출 시 다음 단계를 수행한다:
resolvedLocaleData를 numberFormat.[[LocaleData]]로 둔다.
notationSubPatterns를 resolvedLocaleData.[[notationSubPatterns]]로 둔다.
compactDisplay를 numberFormat.[[CompactDisplay]]로 둔다.
compactPatterns를 notationSubPatterns.[[compact]].[[<compactDisplay>]]로 둔다.
compactPatterns.[[<exponent>]]를 반환한다.
그 밖에는,
"{number}"를 반환한다.
16.5.13 ComputeExponent ( numberFormat, x )
추상 연산 ComputeExponent는 인수 numberFormat (Intl.NumberFormat)과 x (수학적 값)를 받아 정수를
반환한다.
이 연산은 numberFormat 설정에 따라 x를 스케일링할 때 사용할 지수(십의 거듭제곱)를 계산한다.
999가 반올림되어 1000이 되는 경우 등, 다른 지수가 필요한 경우도 처리한다.
호출 시 다음 단계를 수행한다:
x = 0이면,
0을 반환한다.
x < 0이면,
x = -x로 설정한다.
magnitude를 x의 10을 밑으로 한 로그의 소수점 버림값(정수)으로 둔다.
exponent를 ComputeExponentForMagnitude(numberFormat,
magnitude)로 둔다.
x를 x × 10-exponent로 설정한다.
formatNumberResult를 FormatNumericToString(numberFormat,
x)로 둔다.
formatNumberResult.[[RoundedNumber]] = 0이면,
exponent를 반환한다.
newMagnitude를 formatNumberResult.[[RoundedNumber]]의 10을 밑으로 한 로그의 소수점 버림값(정수)으로 둔다.
추상 연산 ComputeExponentForMagnitude는 인수 numberFormat (Intl.NumberFormat)과
magnitude (정수)를 받아 정수를 반환한다.
이 연산은 로케일과 지정된 표기법(과학적, 엔지니어링, compact)에 따라, 가장 높은 자릿수의 십의 거듭제곱(magnitude)을 가진 숫자를
스케일링할 때 쓸 지수를 계산한다.
호출 시 다음 단계를 수행한다:
notation을 numberFormat.[[Notation]]로 둔다.
notation이 "standard"이면,
0을 반환한다.
그 밖에 notation이 "scientific"이면,
magnitude를 반환한다.
그 밖에 notation이 "engineering"이면,
thousands를 magnitude / 3을 넘지 않는 최대 정수로 둔다.
thousands × 3을 반환한다.
그 밖에는,
Assert: notation이
"compact"임.
exponent를 현재 로케일의 compact 표기법에서 주어진 magnitude에 대해 스케일하는 데
사용할 ILD정수로 둔다.
추상 연산 ToIntlMathematicalValue는 인수 value (ECMAScript 언어 값)를 받아 정상 완료로 Intl 수학적 값 또는 throw 완료를 반환한다.
이 연산은 value를 Intl 수학적 값으로 변환하여
반환한다. 이 값은 수학적 값과
positive-infinity,
negative-infinity, not-a-number,
negative-zero를 포함한다.
이 추상 연산은 7.1.3과 유사하지만, Number나 BigInt 대신 수학적 값을 반환할 수 있어서 정확한 소수 값을 표현할 수 있다.
호출 시 다음 단계를 수행한다:
추상 연산 GetUnsignedRoundingMode는 인수 roundingMode (반올림 모드)와 sign (negative 또는
positive)를 받아 표29의 Unsigned Rounding Mode 열의 명세 타입을 반환한다. 이 연산은 절대값에 적용할
반올림 모드를 반환하여, roundingMode가 부호값에 적용될 때와 동일한 결과를 얻을 수 있게 한다
(음수면 negative, 아니면 양수). 호출 시 다음 단계를 수행한다:
roundingMode 값이 Identifier 열, sign 값이 Sign 열인 행의 Unsigned Rounding
Mode 열의 명세 타입을 표29에서 반환한다.
추상 연산 ApplyUnsignedRoundingMode는 인수 x (수학적
값), r1 (수학적 값),
r2 (수학적 값),
unsignedRoundingMode (표29의 Unsigned Rounding Mode 열의 명세 타입 또는
undefined)를 받아 수학적 값를 반환한다.
x는 r1과 r2 사이에 있고, unsignedRoundingMode에 따라
r1 또는 r2를 반환한다. 호출 시 다음 단계를 수행한다:
16.5.19 PartitionNumberRangePattern ( numberFormat,
x, y )
추상 연산 PartitionNumberRangePattern은 인수 numberFormat (Intl.NumberFormat), x
(Intl 수학적 값), y
(Intl 수학적 값)를 받아 정상 완료로 List (필드: [[Type]] 문자열, [[Value]] 문자열, [[Source]] 문자열) 또는 throw 완료를 반환한다. 이 연산은
x, y, numberFormat의 서식 옵션에 따라 지역화된 숫자 범위 파트를 생성한다. 호출 시 다음 단계를
수행한다:
16.5.20 FormatApproximately ( numberFormat,
result )
추상 연산 FormatApproximately는 인수 numberFormat (Intl.NumberFormat), result
(List로서 각 원소는 [[Type]]과 [[Value]] 문자열 필드를 가진 Record)를 받아 List를 반환한다. 이 연산은 PartitionNumberPattern에서 기술된
Record 리스트
result를 수정하여, 약자 기호용 Record를 추가한다(이 기호는
numberFormat에 따라 달라질 수 있다). 호출 시 다음 단계를 수행한다:
approximatelySign을 ILND 문자열 값으로, 약자임을 표시한다.
approximatelySign이 비어 있지 않으면, Record { [[Type]]: "approximatelySign", [[Value]]: approximatelySign }를 ILND 인덱스에
result에 삽입한다. 예를 들어 numberFormat의 [[Locale]]가 "en-US", [[NumberingSystem]]이 "latn", [[Style]]이 "decimal"이면, 새 Record가 result의
첫 번째 원소 앞에 삽입될 수 있다.
result를 반환한다.
16.5.21 CollapseNumberRange ( numberFormat,
result )
구현 정의 추상 연산 CollapseNumberRange는
numberFormat (Intl.NumberFormat)과 result (List로, 각 원소는 Record이고 [[Type]] (문자열), [[Value]] (문자열), [[Source]] (문자열) 필드를 가진다)를 인수로 받아 List를 반환한다. 반환되는 List는 Record로 구성되며 [[Type]], [[Value]], [[Source]] 필드를 가진다. 이 연산은 result (List, Record로, PartitionNumberRangePattern에서
생성) 를 유효 로케일과 numberFormat의 서식 옵션에 따라 수정한다. 수정 방식은 중복 정보 제거, 내부 불일치 해결, 필요한 경우 문자 대체
및 공백 삽입 등이다. 그리고 수정된 List를
반환한다. 알고리즘은 ILND이지만,
Intl.NumberFormat.prototype.formatRange ( start, end
)를 호출할 때, List « start1,
end1 »와 « start2, end2 »가 CollapseNumberRange의 trivial 구현(항상
result를 그대로 반환)에서 같지 않은 경우 결과가 같아지는 모호성을 만들어서는 안 된다.
예를 들어, 구현체는 range separator 뒤의 통화 기호를 나타내는 Record를 제거해서, resultsList가
"$3–$5"를 나타내던 것을 "$3–5"로 바꿀 수 있다.
또한, 구현체는 문법적 올바름을 위해 Record의
[[Value]] 필드를 수정할 수 있다. 예, resultsList가 "0.5 miles–1
mile"을 나타내던 것을 "0.5–1 miles"로 바꿀 수 있다.
result를 수정하지 않고 그대로 반환하는 것도 CollapseNumberRange의 올바른 구현임이 보장된다.
16.5.22 FormatNumericRange ( numberFormat, x,
y )
추상 연산 FormatNumericRange는 numberFormat (Intl.NumberFormat), x (Intl 수학적 값), y
(Intl 수학적 값)를 인수로 받아
정상 완료로 문자열 또는 throw 완료를 반환한다. 호출 시 다음 단계를
수행한다:
parts를 ? PartitionNumberRangePattern(numberFormat,
x, y)로 둔다.
result를 빈 문자열로 둔다.
parts의 각 원소 part에 대해,
result를 문자열
연결(result, part.[[Value]])로 설정한다.
result를 반환한다.
16.5.23 FormatNumericRangeToParts ( numberFormat,
x, y )
추상 연산 FormatNumericRangeToParts는 numberFormat (Intl.NumberFormat), x
(Intl 수학적 값), y
(Intl 수학적 값)를 인수로 받아
정상 완료로 배열 또는 throw 완료를 반환한다. 호출 시 다음 단계를
수행한다:
parts를 ? PartitionNumberRangePattern(numberFormat,
x, y)로 둔다.
result를 ! ArrayCreate(0)로 둔다.
n을 0으로 둔다.
parts의 각 원소 part에 대해,
O를 OrdinaryObjectCreate(%Object.prototype%)로
둔다.
! CreateDataPropertyOrThrow(O,
"type", part.[[Type]])를
수행한다.
! CreateDataPropertyOrThrow(O,
"value", part.[[Value]])를
수행한다.
! CreateDataPropertyOrThrow(O,
"source", part.[[Source]])를 수행한다.
! CreateDataPropertyOrThrow(result,
! ToString(𝔽(n)),
O)를 수행한다.
Intl.PluralRules 인스턴스는 일반 객체이고,
%Intl.PluralRules.prototype%로부터 속성을 상속받는다.
Intl.PluralRules 인스턴스는 [[InitializedPluralRules]] 내부 슬롯을 가진다.
Intl.PluralRules 인스턴스는 Intl.PluralRules 생성자에 의해 계산되는 여러 내부 슬롯도 가진다:
[[Locale]]는
문자열(String) 값이며, 복수 규칙(plural rules)에 의해 지역화가 사용되는 언어 태그를
가진다.
[[Type]]는 "cardinal" 또는 "ordinal"
중 하나의 문자열(String) 값이며, 사용되는 복수 규칙을 식별한다.
[[Notation]]는 "standard",
"scientific", "engineering", "compact"
중 하나의 문자열(String) 값이며, 사용되는 표기법을 식별한다.
[[CompactDisplay]]는 "short" 또는
"long" 중 하나의 문자열(String) 값이며, "compact" 표기법으로 포매팅할 때 압축 표기
접미사를 짧은 형식("5K") 또는 긴 형식("5 thousand")으로 표시할지 지정한다. 이는 일부 경우에서 복수형 선택에 영향을 줄 수 있다. [[Notation]]의 값이 "compact"일 때만 사용된다.
[[MinimumIntegerDigits]]는 사용될 최소 정수 자릿수를 나타내는 0 이상의 정수이다.
[[MinimumFractionDigits]]와 [[MaximumFractionDigits]]는 사용될 최소 및 최대 소수 자릿수를 나타내는 0 이상의 정수이다. 필요하면 숫자는
반올림되거나 뒤쪽에 0이 추가된다.
[[MinimumSignificantDigits]]와 [[MaximumSignificantDigits]]는 사용될 최소 및 최대 유효 자릿수를 나타내는 양의 정수이다. 둘 중 하나도 없거나
둘 다 있어야 하며, 만약 있다면 최소·최대 정수와 소수 자릿수를 덮어쓴다.
[[RoundingType]]는 fraction-digits,
significant-digits, more-precision,
less-precision 중 하나의 값이며, 어떤 반올림 전략을 사용할지 나타낸다. 이에 대해서는 16.4에서 논의한다.
[[ComputedRoundingPriority]]는 "auto",
"morePrecision", "lessPrecision" 중 하나의 문자열(String) 값이다.
17.3.2에서 [[RoundingType]]을 "roundingPriority" 옵션으로 다시 변환할 때만
사용된다.
[[RoundingIncrement]]는 10, 100, 1000, 10000을 10분의 1, 5분의 1, 4분의 1, 2분의
1로 정확히 나눌 수 있는 정수이다. 이는 계산된 반올림 크기 기준으로 반올림이 어디서
이루어질지 나타낸다. 예를 들어 [[MaximumFractionDigits]]가 2이고 [[RoundingIncrement]]가 5이면, 포매팅된 숫자는 0.05 단위로 반올림된다("nickel rounding").
[[TrailingZeroDisplay]]는 "auto" 또는
"stripIfInteger" 중 하나의 문자열(String) 값이며, 포매팅된 숫자가 정수(즉, 0이 아닌 소수 자릿수가 없는 경우)일 때 뒤쪽
0을 제거할지 여부를 나타낸다.
17.5 PluralRules 객체를 위한 추상 연산
17.5.1 PluralRuleSelect ( locale, type,
notation, compactDisplay, s )
구현 정의 추상 연산
PluralRuleSelect은 locale (언어 태그), type
("cardinal" 또는 "ordinal"), notation (문자열),
compactDisplay ("short" 또는 "long"),
s (소수 문자열)을 인자로 받고, "zero", "one",
"two", "few", "many",
"other" 중 하나를 반환한다. 반환되는 문자열은 type, notation,
compactDisplay에 따라 해당 locale에서 s가 속하는 복수 범주를 나타낸다.
17.5.2 ResolvePlural ( pluralRules, n )
추상 연산 ResolvePlural은 pluralRules (Intl.PluralRules)와 n (숫자)을 인자로 받고,
Record를
반환한다. 이 Record에는 [[PluralCategory]] ("zero",
"one", "two", "few",
"many", "other")와 [[FormattedString]] (문자열) 필드가 있다. 반환되는 Record는
n에 대해 적용되는 locale 및 pluralRules의 옵션에 따라 두 개의 문자열 필드로 설명된다: [[PluralCategory]]는 복수 범주를 나타내고, [[FormattedString]]는 포맷된 표현을 포함한다. 호출 시 아래 단계들을 수행한다:
구현 정의 추상 연산
PluralRuleSelectRange는 locale (언어 태그), type
("cardinal" 또는 "ordinal"), notation (문자열),
compactDisplay ("short" 또는 "long"),
xp ("zero", "one", "two",
"few", "many", "other"), yp
("zero", "one", "two",
"few", "many", "other")을 인자로 받고,
"zero", "one", "two",
"few", "many", "other" 중 하나를 반환한다. 구현에
따라 복수
범주 문자열 값 xp와 yp가 각각 범위의 시작과 끝을 나타내며, 해당
locale에서 type, notation, compactDisplay에 대해 전체 범위의
복수 형태로 매핑되거나 "other" 문자열 값으로 매핑된다.
17.5.4 ResolvePluralRange ( pluralRules, x,
y )
추상 연산 ResolvePluralRange는 pluralRules (Intl.PluralRules), x (숫자),
y (숫자)를 인자로 받고, 정상 완료(값
포함)로 "zero", "one",
"two", "few", "many",
"other" 중 하나 또는 throw
완료를 반환한다. 반환되는 문자열 값은 x에서 y까지의 범위의 복수 형태를 해당 locale
및 pluralRules의 옵션에 따라 나타낸다. 호출 시 아래 단계들을 수행한다:
[[LocaleData]] 내부 슬롯의 값은 구현 정의이며,
9.1에 설명된 제약과 아래 추가 제약을 따른다. 모든 로케일 값
locale에 대해:
[[LocaleData]].[[<locale>]]는
"second", "minute", "hour",
"day", "week", "month",
"quarter", "year" 필드를 가진다. 이전 이름들에
"-narrow" 또는
"-short" 문자열을 이어 붙인 추가 필드가 존재할 수 있다. 이들 필드에 대응하는 값은 두 가지 범주의 필드를 포함하는
Records이다:
"future" 및 "past" 필드는 locale에 관련된
모든 복수 범주에 대한 필드를 가진 Records이며,
해당 필드의 값은 서식화된 숫자로 대체될 수 있는 "{0}"을 포함할 수 있는 패턴이다.
선택적으로, 키가 Number의 ToString 결과이고 값이
템플릿으로 취급되지 않는 리터럴 문자열인 추가 필드가 있을 수 있다.
[[LocaleData]]의 어떤 로케일 필드의 "nu" 필드 값인 List에는
"native", "traditio", "finance" 값을
포함해서는 안 된다.
추상 연산 SingularRelativeTimeUnit은 인수 unit (문자열)을 받아 정상
완료로 문자열 또는 throw
완료를 반환한다. 호출 시 다음 단계를 수행한다:
unit이 "seconds"이면 "second"를 반환한다.
unit이 "minutes"이면 "minute"를 반환한다.
unit이 "hours"이면 "hour"를 반환한다.
unit이 "days"이면 "day"를 반환한다.
unit이 "weeks"이면 "week"를 반환한다.
unit이 "months"이면 "month"를 반환한다.
unit이 "quarters"이면
"quarter"를 반환한다.
unit이 "years"이면 "year"를 반환한다.
unit이 "second",
"minute", "hour", "day",
"week", "month", "quarter",
"year" 중 하나가 아니면 RangeError 예외를 던진다.
unit를 반환한다.
18.5.2 PartitionRelativeTimePattern ( relativeTimeFormat,
value, unit )
추상 연산 PartitionRelativeTimePattern은 인수 relativeTimeFormat
(Intl.RelativeTimeFormat), value (Number), unit (문자열)을 받아 정상
완료로 List
또는 throw
완료를 반환한다. 이 List는
[[Type]] (문자열), [[Value]] (문자열), [[Unit]] (문자열 또는 empty) 필드를 가진 Records로
구성된다. 반환된 List는
유효 로케일과 relativeTimeFormat의 서식 옵션에 따라 value를 나타낸다. 호출 시 다음 단계를 수행한다:
추상 연산 MakePartsList는 인수 pattern (Pattern
String), unit (문자열), parts (서식화된 Number를 나타내는
List의
Records)를
받아, [[Type]] (문자열), [[Value]] (문자열), [[Unit]] (문자열 또는 empty) 필드를 가진 List를
반환한다. 호출 시 다음 단계를 수행한다:
이는 다음과 같은 List의
Records를
반환한다:
«
{ [[Type]]: "literal", [[Value]]: "AA", [[Unit]]: empty},
{ [[Type]]: "integer", [[Value]]: "15", [[Unit]]: "hour"},
{ [[Type]]: "literal", [[Value]]: "BB", [[Unit]]: empty}
»
18.5.4 FormatRelativeTime ( relativeTimeFormat,
value, unit )
추상 연산 FormatRelativeTime은 인수 relativeTimeFormat (Intl.RelativeTimeFormat),
value (Number), unit (문자열)을 받아 정상
완료로 문자열 또는 throw
완료를 반환한다. 호출 시 다음 단계를 수행한다:
18.5.5 FormatRelativeTimeToParts ( relativeTimeFormat,
value, unit )
추상 연산 FormatRelativeTimeToParts는 인수 relativeTimeFormat
(Intl.RelativeTimeFormat), value (Number), unit (문자열)을 받아 정상
완료로 배열 또는 throw
완료를 반환한다. 호출 시 다음 단계를 수행한다:
[[Locale]]문자열
값이며, 분절(세그멘테이션)에 사용되는 로케일의 언어 태그를 가진다.
[[SegmenterGranularity]]는 "grapheme",
"word", "sentence" 중 하나의 문자열 값으로, 분절할 텍스트 요소의 종류를 식별한다.
19.5 Segments 객체
Segments 인스턴스는 특정 문자열의 세그먼트를 나타내는 객체이며, 이를 생성한 Intl.Segmenter 인스턴스의 로케일과 옵션이
적용된다.
19.5.1 CreateSegmentsObject ( segmenter,
string )
추상 연산 CreateSegmentsObject는 인수 segmenter (Intl.Segmenter)와 string (문자열)을 받아
Segments
인스턴스를 반환한다. 반환된 Segments 인스턴스는 segmenter와
string을 참조한다. 호출 시 다음 단계를 수행한다:
internalSlotsList를 « [[SegmentsSegmenter]],
[[SegmentsString]] »로 둔다.
19.5.2.1 %IntlSegmentsPrototype%.containing ( index )
containing 메서드는 Segments 인스턴스에서 인수 index로
호출되어, 해당 Segments 인스턴스를 생성한 Intl.Segmenter 인스턴스의 로케일과 옵션에 따라 지정된 인덱스의 코드 유닛이 포함된 세그먼트를 설명하는
Segment Data 객체를 반환한다. 다음 단계를 수행한다:
추상 연산 CreateSegmentIterator는 인수 segmenter (Intl.Segmenter)와 string (문자열)을
받아 Segment Iterator를 반환한다. 반환된
Segment Iterator는
segmenter의 로케일과 옵션을 사용하여 string을 순회한다. 호출 시 다음 단계를 수행한다:
internalSlotsList를 « [[IteratingSegmenter]],
[[IteratedString]], [[IteratedStringNextSegmentCodeUnitIndex]] »로 둔다.
추상 연산 CreateSegmentDataObject는 인수 segmenter (Intl.Segmenter), string (문자열),
startIndex (0 이상의 정수), endIndex (0 이상의
정수)를 받아
Segment Data 객체를 반환한다. 반환된 Segment
Data 객체는 segmenter의 로케일에 따라 string 내에서
startIndex와 endIndex로 경계 지어진 세그먼트를 설명한다. 호출 시 다음 단계를 수행한다:
세그먼트가 "단어 유사"인지 여부는 구현 의존이며, 구현에서는 로케일에 민감한 조정을 사용하는 것이 권장된다. 일반적으로
공백 및/또는 문장부호로만 이루어진 세그먼트(예: ICU [International Components for Unicode, https://unicode-org.github.io/icu-docs/에
문서화됨]에서 "WORD_NONE" 경계로 끝나는 것)는 "단어 유사"로 간주되지 않는다.
19.8 Segmenter 객체를 위한 추상 연산
19.8.1 FindBoundary ( segmenter, string,
startIndex, direction )
추상 연산 FindBoundary는 인수 segmenter (Intl.Segmenter), string (문자열),
startIndex (0 이상의 정수), direction
(before 또는 after)을 받아 0 이상의 정수를 반환한다. 이는
segmenter의 로케일과 옵션에 따라 string에서 startIndex 인덱스의 코드 유닛으로부터 지정된
direction으로 세그먼트 경계를 찾아, 그 직후의 코드 유닛 인덱스를 반환한다. 호출 시 다음 단계를 수행한다:
toLocaleLowerCase 함수는 의도적으로 제네릭이다. this 값이 String 객체일 것을
요구하지 않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전할 수 있다.
20.1.2.1 TransformCase ( S, locales,
targetCase )
추상 연산 TransformCase는 인수 S (문자열), locales (ECMAScript 언어
값), targetCase (lower 또는
upper)를 받는다. 이는 ECMA-262, 6.1.4에
설명된 대로 S를 UTF-16 인코딩된 코드 포인트 시퀀스로 해석하고,
ILD 변환의 결과를
targetCase로 새 문자열 값으로 반환한다. 호출 시 다음 단계를 수행한다:
availableLocales를, Unicode Character Database가 언어-민감 대소문자 매핑을 포함하는
언어
태그를 포함하는 사용 가능한 로케일 목록으로
둔다. 구현이 추가적인 로케일-민감 대소문자 매핑을 지원하는 경우,
availableLocales에는 해당하는 언어 태그도 포함되어야 한다.
코드 포인트 매핑은 Unicode Standard의 기본 대소문자 변환 알고리즘의 맞춤(tailored) 버전에 따라 파생될 수 있다. 구현은 Unicode
Character Database의 SpecialCasing.txt
및/또는 CLDR 및/또는 기타 사용자 정의 맞춤을 사용할 수 있다. 맞춤 여부와 상관없이, 적합한 구현의 대소문자 변환 알고리즘은 동일한 입력 코드 포인트,
로케일, 대상 대소문자에 대해 항상 동일한 결과를 산출해야 한다.
참고
일부 코드 포인트의 대소문자 매핑은 여러 코드 포인트를 생성할 수 있으므로, 결과의 길이는 입력과 동일하지 않을 수 있다. 또한
toLocaleUpperCase와 toLocaleLowerCase는 문맥-민감 동작을 가지므로, 두 함수는
대칭적이지 않다. 즉,
s.toLocaleUpperCase().toLocaleLowerCase()는 반드시
s.toLocaleLowerCase()와 같지 않을 수 있으며,
s.toLocaleLowerCase().toLocaleUpperCase()도 반드시
s.toLocaleUpperCase()와 같지 않을 수 있다.
배열의 각 요소는 그들의 toLocaleString 메서드를 사용해 문자열로 변환되고, 이 문자열들이 구현-정의된 로케일-민감
구분자 문자열로 구분되어 연결된다. 이 함수는 toString과 유사하지만, 호스트
환경의 현재 로케일 관례에 대응하는 로케일-민감 결과를 생성하도록 의도되었다.
참고 3
toLocaleString 함수는 의도적으로 제네릭이다. this 값이 Array 객체일 것을 요구하지
않는다. 따라서 메서드로 사용하기 위해 다른 종류의 객체로 이전할 수 있다.
16.1 ECMA-402 제8판에서, NumberFormat
constructor는 style이
"currency"이고 maximumFractionDigits가 해당 통화의 기본 소수 자릿수보다 작은 값으로 설정된 경우 오류를 던지도록 되어
있었다. 이 동작은 제9판에서 수정되었고, 더 이상 오류를 던지지 않는다.
Annex C (informative) 콜로폰
이 사양은 평문 소스 형식인 Ecmarkup으로 GitHub에서 작성된다. Ecmarkup은 HTML과 Markdown 방언으로, 평문으로
ECMAScript 사양을 작성하고, 본 문서의 편집 규칙을 따르는 기능이 완비된 HTML 렌더링으로 처리하기 위한 프레임워크와 도구 모음을 제공한다. Ecmarkup은 구문 정의를 위한
Grammarkdown과 알고리즘 단계를 작성하기 위한 Ecmarkdown을 포함한 여러 형식과 기술 위에 구축되고 이를 통합한다. 이 사양의
PDF 렌더링은 HTML 렌더링을 PDF로 인쇄하여 생성된다.
이전 판의 사양은 Word를 사용하여 작성되었으며 — 이 판의 기반이 된 Ecmarkup 소스 텍스트는 자동 변환 도구를 사용하여 ECMAScript 2015 Word 문서를
Ecmarkup으로 변환하여 생성되었다.
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.