å½éå
Intl ãªãã¸ã§ã¯ãã¯ã ECMAScript Internationalization API ã®åå空éã§ããããã±ã¼ã«ãæåãèæ
®ããå¹
åºããã¼ã¿ãæä½ãæä¾ãã¾ãã
æ¦è¦
Intl ãªãã¸ã§ã¯ãã¯ã使ãéã«å¼·ãä¾åãã¦ãã¾ãããã±ã¼ã«åºæã®ãã¸ãã¯ãè¦æ±ãããããããã®ç¨éã«å¯¾ãã¦ãåå¥ã®ãªãã¸ã§ã¯ããæä¾ãã¾ããç¾å¨ã以ä¸ã®æ©è½ãæä¾ãã¦ãã¾ãã
- ãã±ã¼ã«ã«ã¤ãã¦ã®æ
å ±ã®åå¾ï¼
Intl.Localeã使ç¨ï¼ - ãã¼ã¿ã®æ¸å¼åï¼
Intl.DateTimeFormatãIntl.DurationFormatãIntl.ListFormatãIntl.NumberFormatãIntl.RelativeTimeFormatã使ç¨ï¼ - ç
§åé åºï¼ã¤ã¾ããä¸¦ã¹æ¿ããæ¤ç´¢ã«ãããæååã®æ¯è¼ã
Intl.Collatorã使ç¨ï¼ - è¤æ°å½¢ã®é¸æï¼
Intl.PluralRulesã使ç¨ï¼ - ããã¹ãã®åºåãï¼åèªãæãæåãªã©ã®åä½ãªã©ã«åå²ããããã
Intl.Segmenterã使ç¨ï¼ - 表示ãããååã®åå¾ï¼é貨ãè¨èªãæåä½ç³»ãå°åãã¿ã¤ã ã¾ã¼ã³ã
Intl.DisplayNamesã使ç¨ï¼
ã»ã¨ãã©ã® Intl API ã¯åæ§ã®è¨è¨ãæ¡ç¨ãã¦ãã¾ãï¼Intl.Locale ã®ã¿ãä¾å¤ã§ãï¼ãã¾ããç®çã®ãã±ã¼ã«ã¨ãªãã·ã§ã³ãæå®ãã¦ã¤ã³ã¹ã¿ã³ã¹ã使ãã¾ããããã«ãããç®çã®æä½ï¼æ¸å¼åãç
§åãåºåããªã©ï¼ãè¡ãããã®ä¸é£ã®ã«ã¼ã«ãå®ç¾©ããã¾ãããã®å¾ãformat()ãcompare()ãsegment() ãªã©ã®ã¡ã½ãããã¤ã³ã¹ã¿ã³ã¹ã«å¯¾ãã¦å¼ã³åºãã¨ããªãã¸ã§ã¯ãã¯æ¸¡ããããã¼ã¿ã«æå®ãããã«ã¼ã«ãé©ç¨ãã¾ãã
// 1. ãã±ã¼ã«ã¨æ¸å¼è¨å®ãªãã·ã§ã³ãæå®ãã¦ãæ¸å¼åãªãã¸ã§ã¯ãã使
const price = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
});
// 2. æ¸å¼åãªãã¸ã§ã¯ãã® `format` ã¡ã½ããã使ç¨ãã¦æ°å¤ãæ¸å¼å
console.log(price.format(5.259)); // $5.26
ã³ã³ã¹ãã©ã¯ã¿ã¼ã®ä¸è¬çãªå½¢å¼ã¯æ¬¡ã®ã¨ããã§ãã
new Intl.SomeObject(locales, options)
localesçç¥å¯-
BCP 47 è¨èªã¿ã°ã
Intl.Localeã®ã¤ã³ã¹ã¿ã³ã¹ãã¾ãã¯ãããã®ãã±ã¼ã«èå¥åã®é åãå«ãæååã§ããundefinedãæ¸¡ãããå ´åãã¾ãã¯æå®ããããã±ã¼ã«èå¥åã®ãããã«ã対å¿ãã¦ããªãå ´åã¯ãã©ã³ã¿ã¤ã ã®ããã©ã«ãã®ãã±ã¼ã«ã使ç¨ããã¾ããlocales弿°ã®ä¸è¬çãªæ¹æ³ã¨è§£éã«ã¤ãã¦ã¯ãIntlã®ã¡ã¤ã³ãã¼ã¸ã«ãã弿°ã®èª¬æãåç §ãã¦ãã ããã optionsçç¥å¯-
æä½ã®ç¹å®ã®å´é¢ãã«ã¹ã¿ãã¤ãºããããããã£ãå«ã¾ãã¦ãããªãã¸ã§ã¯ãã§ãããããããã®
Intlãªãã¸ã§ã¯ãã使ç¨ããä¸ã§éè¦ãªè¦ç´ ã§ãã
ãã±ã¼ã«æ å ±
ãã±ã¼ã«ã¯ãIntl ã®ããããåä½ã®åºç¤ã¨ãªãã¾ãããã±ã¼ã«ã¨ã¯ä¸é£ã®æ
£ç¿ã®éåã§ãããIntl API ã§ã¯ Intl.Locale ãªãã¸ã§ã¯ãã«ãã£ã¦è¡¨ããã¾ããè¨èªã¿ã°ãåãå
¥ãããã¹ã¦ã® Intl ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ãIntl.Locale ãªãã¸ã§ã¯ããåãå
¥ãã¾ãã
ããããã®ãã±ã¼ã«ã¯ã主㫠4 ã¤ã®è¦ç´ ã§å®ç¾©ããã¾ããããã¯ãè¨èª (language)ãæåä½ç³» (script)ãå°å (region)ãããã¦å ´åã«ãã£ã¦ã¯ããã¤ãã®ããªã¢ã³ã (variants) ã§ãããããã - ã§ãã®é åºã§ã¤ãªãã¨ãBCP 47 è¨èªã¿ã°ãå½¢æãã¾ãã
- è¨èªã¯ãã±ã¼ã«ã®æãéè¦ãªè¦ç´ ã§ãããå¿
é ã§ãã
enãfrã®ããã«è¨èªãåç¬ã§æå®ãããå ´åãæ®ãã®æ å ±ãæ¨æ¸¬ããããã®ã¢ã«ã´ãªãºã ãããã¾ãï¼Intl.Locale.prototype.maximize()ãåç §ï¼ã - ãã ããåãè¨èªã話ãå°åå士ã§ãæ
£ç¿ã大ããç°ãªãå ´åããããããå¤ãã®å ´åãå°åãæå®ãããå ´é¢ãããã¾ããä¾ãã°ãæ¥ä»ã®æ¸å¼ã¯ç±³å½ã§ã¯ MM/DD/YYYY ã§ããã®ã«å¯¾ããè±å½ã§ã¯ DD/MM/YYYY ã¨ãªãããã
en-USãen-GBãæå®ãããã¨ãéè¦ã§ãã - æåä½ç³»ãåæã«æå®ãããã¨ãã§ãã¾ããæåä½ç³»ã¨ã¯ããã®è¨èªãæ¸ã表ãããã«ä½¿ç¨ããæ¸ãæ¹ãæåã®ãã¨ã§ããå®éã«ã¯ãããå°åã§ä½¿ç¨ãããè¨èªã¯å¤ãã®å ´åãä¸ã¤ã®æåä½ç³»ã§ãã表è¨ãããªããããæåä½ç³»ãæå®ããå¿
è¦ã¯ããã¾ããããã ããã©ãã³æåã¨ããªã«æåã®ä¸¡æ¹ã§è¡¨è¨ã§ããã»ã«ãã¢èªï¼
sr-Latnããã³sr-Cyrlï¼ããç°¡ä½åã¨ç¹ä½åã®ä¸¡æ¹ã§è¡¨è¨ã§ããä¸å½èªï¼zh-Hansããã³zh-Hantï¼ãªã©ãä¾å¤ãããã¾ãã - ãããã®ããªã¨ã¼ã·ã§ã³ã¯ãã£ãã«ä½¿ç¨ããã¾ãããé常ããããã¯ç°ãªãæ£æ¸æ³ã表ãã¾ããä¾ãã°ããã¤ãèªã«ã¯
1901ã¨1996ã®æ£æ¸æ³ããªã¨ã¼ã·ã§ã³ããããããããde-1901ããã³de-1996ã¨è¡¨è¨ããã¾ãã
// ããã 2 ã¤ã¯ãä»ã® Intl API ã«æ¸¡ãã¨åçã§ã
const locale1 = new Intl.Locale("en-US");
const locale2 = new Intl.Locale("en-Latn-US");
console.log(locale1.language, locale1.script, locale1.region); // "en", undefined, "US"
console.log(locale2.language, locale2.script, locale2.region); // "en", "Latn", "US"
ãã±ã¼ã«ã«ã¯ããã®å ·ä½çãªæååã§ä½¿ç¨ããã¦ããä¸é£ã®æ £ç¿ãå«ã¾ãã¦ãã¾ãã
| ç¨é | ãããã㣠| 解説 | æ¡å¼µãµãã¿ã° |
|---|---|---|---|
| æ¥ä»ãæå»ã®æ¸å¼å | calendar |
æ¥ãå¹´ãæãé±ã«åãããããã«ååãå²ãå½ã¦ãããã«ä½¿ç¨ããã¾ããä¾ãã°ãgregory æ¦ã® "2022-01-01" ã¯ãhebrew æ¦ã§ã¯ "28 Tevet 5782" ã¨ãªãã¾ãã |
ca |
hourCycle |
æå»ã 12 æéå¶ã§è¡¨ç¤ºãããã 24 æéå¶ã§è¡¨ç¤ºãããããã¾ããæå°ã®æã®æ°åã 0 ã«ããã 1 ã«ããããæ±ºå®ãã¾ãã | hc |
|
| æ°å¤ã®æ¸å¼åãæ¥ä»ãæå»ãæéãªã©ãå«ã | numberingSystem |
æ°å¤ããã±ã¼ã«åºæã®è¡¨è¨ã«å¤æãã¾ããé常㮠0123456789 ã·ã¹ãã ã¯ã latnï¼ã©ãã³ï¼ã¨å¼ã°ãã¾ããå¤ãã®å ´åãããããã®æåä½ç³»ã«ã¯æ¡ãã¨ã®å¯¾å¿ã«ããæ°å¤è¡¨è¨æ³ãããã¾ãããè¤æ°ã®æ°å¤è¡¨è¨æ³ãæã¤æåä½ç³»ãããã°ããã®æåä½ç³»ã§éå¸¸ã¯æ°åãæ¸ããªããã®ãããã¾ãï¼ä¾ãã°ãä¸å½èªã«ã¯ç¬èªã® hanidec æ°å¤è¡¨è¨æ³ãããã¾ãããã»ã¨ãã©ã®ããã¹ãã§ã¯æ¨æºã® latn ã·ã¹ãã ã使ç¨ããã¦ãã¾ãï¼ãã¾ããç¹å¥ãªå¤æã¢ã«ã´ãªãºã ãè¦æ±ããããã® ï¼ä¾ãã°ããã¼ãæ°å â romanï¼ãããã¾ãã |
nu |
| ç §åé åº | collation |
ä¸è¬çãªç
§åé åºã¢ã«ã´ãªãºã ãå®ç¾©ãã¾ããä¾ãã°ããã¤ãèªã® phonebk ç
§åé åºã使ç¨ããã¦ããå ´åã"ä" 㯠"ae" ã¨ãã¦æ±ããã"ad" 㨠"af" ã®éã«ã½ã¼ãããã¾ãã |
co |
caseFirst |
大æåã¨å°æåã®ã©ã¡ããå ã«ä¸¦ã¹æ¿ãããããããã¯å¤§æåã»å°æåãåºå¥ããªãããæ±ºå®ãã¾ãã | kf |
|
numeric |
æ°å¤ãæ°å¤ã¨ãã¦ã½ã¼ãããããæååã¨ãã¦ã½ã¼ãããããæ±ºå®ãã¾ããä¾ãã°ãtrue ã«è¨å®ããã¨ã"10" 㯠"2" ã®å¾ã«ã½ã¼ãããã¾ãã | kn |
Intl.Locale ãçæããéããããã¯ä»ã® Intl ã³ã³ã¹ãã©ã¯ã¿ã¼ã«è¨èªã¿ã°ã渡ãéã«ããã®ããããã£ãæç¤ºçã«æå®ãããã¨ãã§ãã¾ãããããè¡ãã®ãæé©ãªæ¹æ³ã¯ãè¨èªã¿ã°ã«è¿½å ãããããªãã·ã§ã³ã¨ãã¦æå®ãããã® 2 ã¤ã§ãã
- ããããè¨èªã¿ã°ã«è¿½å ããã«ã¯ãã¾ãæåå
-uï¼ãUnicode æ¡å¼µãã¨ããæå³ï¼ã追å ããæ¬¡ã«æå®ãããæ¡å¼µãµãã¿ã°ãããã¦å¤ãé ã«è¿½å ãã¾ãã - ãããããªãã·ã§ã³ã¨ãã¦æå®ããã«ã¯ãæå®ãããããããã£åã¨ãã®å¤ã
optionsãªãã¸ã§ã¯ãã«è¿½å ããã ãã§ãã
Intl.DateTimeFormat ãä¾ã«ã¨ãã¨ã以ä¸ã® 2 ã¤ã®è¡ã¯ã©ã¡ãããããã©ã¤æ¦ã§æ¥ä»ãæ¸å¼åãããã©ã¼ããã¿ã¼ã使ãã¾ãã
const df1 = new Intl.DateTimeFormat("en-US-u-ca-hebrew");
const df2 = new Intl.DateTimeFormat("en-US", { calendar: "hebrew" });
èªèãããªãããããã£ã¯ç¡è¦ããããããIntl.NumberFormat ã§ãä¸è¨ã¨ã¾ã£ããåãæ§æã使ç¨ãããã¨ãã§ãã¾ãããæ°å¤ã®æ¸å¼åã§ã¯ calendar ããããã£ã使ç¨ãããªããããåã« en-US ãæ¸¡ãã®ã¨ä½ãå¤ããã¯ããã¾ããã
ãããã®ãã±ã¼ã«è¨å®ã®ããã©ã«ãå¤ãåå¾ããã®ã¯å°ãåä»ã§ããnew Intl.Locale("en-US").calendar 㯠undefined ãè¿ãã¾ããããã¯ãLocale ãªãã¸ã§ã¯ãã«ã¯ã渡ãããæ
å ±ããå«ã¾ãã¦ããªãããã§ããããã©ã«ãã®ã«ã¬ã³ãã¼ã¯ãçè«çã«ã¯ããã使ç¨ãã API ã«ãã£ã¦ç°ãªãã¾ãããããã£ã¦ãIntl.DateTimeFormatã§ä½¿ç¨ããã en-US ã®ããã©ã«ãã«ã¬ã³ãã¼ãåå¾ããã«ã¯ããã® resolvedOptions() ã¡ã½ããã使ç¨ãããã¨ãã§ãã¾ãããã以å¤ã«ããä»ã®ããããã£ã«ã¤ãã¦ãåæ§ã§ãã
const locale = new Intl.Locale("en-US");
console.log(locale.calendar); // undefined; æä¾ããã¦ããªã
console.log(new Intl.DateTimeFormat(locale).resolvedOptions().calendar); // "gregory"
Intl.Locale ãªãã¸ã§ã¯ãã¯ã2 ã¤ã®å½¹å²ãåæã«æããã¾ããããªãã¡ãï¼ä»¥ä¸ã®ããã«ï¼æ§æè§£ææ¸ã¿ã® BCP 47 è¨èªã¿ã°ã表ããã¨ã¨ããã®ãã±ã¼ã«ã«é¢ããæ
å ±ãæä¾ãããã¨ã§ããcalendar ãªã©ã®ãã¹ã¦ã®ããããã£ã¯ãããã©ã«ãå¤ã«ã¤ãã¦ãã¼ã¿ã½ã¼ã¹ã«åãåããããã¨ãªããå
¥åãã¼ã¿ããã®ã¿æ½åºããã¾ãã䏿¹ããã®ãªãã¸ã§ã¯ãã«ã¯ããã±ã¼ã«ã«é¢ããå®éã®æ
å ±ãåå¾ããããã®ã¡ã½ãã群ãç¨æããã¦ãã¾ããä¾ãã°ãgetCalendars()ãgetHourCycles()ãgetNumberingSystems()ãgetCollations() ã®åã¡ã½ãã㯠calendarãhourCycleãnumberingSystemãcollation ã®åããããã£ãè£å®ãããã®ã§ãããããããããã®ããããã£ã®æ¨å¥¨å¤ã®é
åãè¿ãã¾ãã
const locale = new Intl.Locale("ar-EG");
console.log(locale.getCalendars()); // ['gregory', 'coptic', 'islamic', 'islamic-civil', 'islamic-tbla']
Intl.Locale ã®ã¤ã³ã¹ã¿ã³ã¹ã«ã¯ãgetTextInfo()ãgetTimeZones()ãgetWeekInfo() ãªã©ãæç¨ãªæ
å ±ãåå¾ããããã®ã¡ã½ãããå«ã¾ãã¦ãã¾ãã
ãã±ã¼ã«ã®ç¹å®
å½éåã«é¢ãã¦å¤ãã®äººãæ±ãå ±éã®æ¸å¿µã¯ãã使ç¨ãããã±ã¼ã«ãã©ã®ããã«ç¥ãã®ããã¨ããç¹ã§ãã
æãæç½ãªçãã¯ãã¦ã¼ã¶ã¼ãæ¨å¥¨ãããã®ãã§ãããã©ã¦ã¶ã¼ã¯ãnavigator.languages ããããã£ãéãã¦ãã¦ã¼ã¶ã¼ã®è¨èªè¨å®ãå
¬éãã¦ãã¾ããããã¯è¨èªèå¥åã®é
åã§ããããã©ã¼ããã¿ã¼ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã«ç´æ¥æ¸¡ããã¨ãã§ãã¾ãï¼ããã«ã¤ãã¦ã¯å¾è¿°ãã¾ãï¼ãã¦ã¼ã¶ã¼ã¯ãã®ãªã¹ãããã©ã¦ã¶ã¼ã®è¨å®ã§å¤æ´ã§ãã¾ãã空ã®é
åã undefined ãåæã«æ¸¡ããã¨ãå¯è½ã§ããããããã©ã¦ã¶ã¼ã®ããã©ã«ãã®ãã±ã¼ã«ã使ç¨ããã¾ãã
const numberFormatter = new Intl.NumberFormat(navigator.languages);
console.log(numberFormatter.format(1234567.89));
const numberFormatter2 = new Intl.NumberFormat([]);
ãããããããå¸¸ã«æã¾ããçµæã«ãªãã¨ã¯éãã¾ãããIntl ãã©ã¼ããã¿ã¼ã§æ¸å¼åãããæååã¯ããµã¤ãã«è¡¨ç¤ºãããããã¹ãã®ããä¸é¨ã«éãã¾ããããã¼ã«ã©ã¤ãºãããã³ã³ãã³ãã®å¤§é¨åã¯ããµã¤ãéçºè
ã§ããããªãèªèº«ãæå®ãã¦ãããã®ã§ããä¾ãã°ããããµã¤ããè±èªã¨ãã©ã³ã¹èªã® 2 è¨èªã®ã¿ã«å¯¾å¿ãã¦ããã¨ãã¾ããæ¥æ¬èªåã®ã¦ã¼ã¶ã¼ããµã¤ãã訪ããè±èªã§ãµã¤ããå©ç¨ãããã¨ããå ´åãè±èªã®ããã¹ãã®ä¸ã«æ¥æ¬èªã®æ°å¤ãæ¥ä»ãæ··å¨ãã¦ããã¨ãæ¸æã£ã¦ãã¾ãã§ãããã
é常ããã©ã¦ã¶ã¼ã®ããã©ã«ãè¨èªã使ç¨ããã®ã¯é¿ãããã¨ããã§ãããµã¤ãå ¨ä½ã§æä¾ããã¦ããã®ã¨åãè¨èªã使ç¨ãããã§ãããããããµã¤ãã«ãã¦ã¼ã¶ã¼ã®é¸æãæ ¼ç´ããããã«è¨èªåãæ¿ãæ©è½ãæã£ã¦ãããªãããããç´æ¥ä½¿ç¨ãããã¨ãã§ãã¾ãã
// ãã®ãã¨ããµã¤ãå
¨ä½ã®è¨å®ã§å¤æ´å¯è½ã ã¨ä»®å®
const userSettings = {
locale: "en-US",
colorMode: "dark",
};
const numberFormatter = new Intl.NumberFormat(userSettings.locale);
console.log(numberFormatter.format(1234567.89));
ãµã¤ãã®ããã¯ã¨ã³ãã§ãã¦ã¼ã¶ã¼ã® Accept-Language ãããã¼ã«åºã¥ãã¦åçã«è¨èªã鏿ããããã«å¿ãã¦ç°ãªã HTML ãè¿ãä»çµã¿ã«ãªã£ã¦ããå ´åã¯ãHTML è¦ç´ ã® HTMLElement.lang ããããã£ã new Intl.NumberFormat(document.documentElement.lang) ã®å½¢ã§ä½¿ç¨ãããã¨ãã§ãã¾ãã
ãµã¤ãã 1 ã¤ã®è¨èªã§ããæä¾ããã¦ããªãå ´åã¯ãnew Intl.NumberFormat("en-US") ã®ããã«ã³ã¼ãå
ã§ãã±ã¼ã«ãåæã«ãã¼ãã³ã¼ãã£ã³ã°ãããã¨ãå¯è½ã§ãã
åè¿°ã®éããã³ã³ã¹ãã©ã¯ã¿ã¼ã«ãã±ã¼ã«ã®é
åãæ¸¡ãã¦ã代æ¿åè£ã®ãªã¹ããæå®ãããã¨ãå¯è½ã§ããnavigator.languages ã使ç¨ããæåã®ä¾ãããã«è©²å½ãã¾ããã¦ã¼ã¶ã¼ãè¨å®ããæåã®ãã±ã¼ã«ãç¹å®ã®æä½ã§å¯¾å¿ãã¦ããªãå ´åãæ¬¡ã®ãã±ã¼ã«ã試ãããã©ã³ã¿ã¤ã ããã¼ã¿ãä¿æãã¦ããè¦æ±ããããã±ã¼ã«ãè¦ã¤ããã¾ã§ããã®å¦çãç¹°ãè¿ããã¾ãããã®å¦çã¯æåã§è¡ããã¨ãå¯è½ã§ããä¸è¨ä¾ã§ã¯ã馿¸¯ä¸å½èªã®è©±è
ãçè§£ã§ããå¯è½æ§ã®é«ãè¨èªã表ããã±ã¼ã«ãã詳細度ã®é«ãé ã«ãªã¹ãã¨ãã¦æå®ãã¦ãã¾ããããã«ããããã©ã¼ããã¿ã¼ã¯å¯¾å¿ãã¦ããä¸ã§æãå
·ä½æ§ã®é«ããã±ã¼ã«ã鏿ãã¾ãã
const numberFormatter = new Intl.NumberFormat([
"yue-Hant",
"zh-Hant-HK",
"zh-Hant",
"zh",
]);
対å¿ãã¦ãã¹ã¦ã®ãã±ã¼ã«ãä¸è¦§è¡¨ç¤ºãã API ã¯ããã¾ãããããã±ã¼ã«ä¸è¦§ãå¦çããããã®ã¡ã½ããã¯ããã¤ãããã¾ãã
Intl.getCanonicalLocales(): ãã®é¢æ°ã¯ããã±ã¼ã«èå¥åã®ãªã¹ããåãåããæ£è¦åããããã±ã¼ã«èå¥åã®ãªã¹ããè¿ãã¾ããããã¯ãããããã®Intlã³ã³ã¹ãã©ã¯ã¿ã¼ã®æ£è¦åããã»ã¹ãçè§£ããã®ã«æçã§ãã -ããããã®Intlãªãã¸ã§ã¯ãã«ãããsupportedLocalesOf()éçã¡ã½ããï¼Intl.DateTimeFormat.supportedLocalesOf()ãªã©ï¼: ãã®ã¡ã½ããã¯ã³ã³ã¹ãã©ã¯ã¿ã¼ã¨åã弿°ï¼localesããã³optionsï¼ãåãåããæå®ããããã¼ã¿ã«ä¸è´ãããã±ã¼ã«ã¿ã°ã®ãµãã»ãããè¿ãã¾ããããã¯ãå ·ä½çãªæä½ã«å¯¾ãã¦ã©ã³ã¿ã¤ã ãã©ã®ãã±ã¼ã«ã«å¯¾å¿ãã¦ããããææ¡ããã®ã«å½¹ç«ã¡ã¾ããä¾ãã°ã対å¿ãã¦ããè¨èªã®ã¿ãå«ãè¨èªåæ¿ãã¼ã«ã表示ãããå ´åãªã©ã«æç¨ã§ãã
è¿å¤ãçè§£ãã
ãã¹ã¦ã®ãªãã¸ã§ã¯ãã«å
±éãã 2 ã¤ç®ã®æ¸å¿µäºé
ã¯ããã¡ã½ããã¯ä½ãè¿ãã®ãï¼ãã¨ããç¹ã§ããè¿å¤ã®æ§é ãåãè¶
ãã¦ãã®åãã«çããã®ã¯å°é£ã§ãããªããªããæ£ç¢ºã«ä½ãè¿ãã¹ãããå®ããè¦ç¯çãªä»æ§ãåå¨ããªãããã§ããå¤ãã®å ´åãã¡ã½ããã®çµæã¯ä¸è²«ãã¦ãã¾ããããããåºåã¯å®è£
ã«ãã£ã¦ç°ãªããã¨ããããåããã±ã¼ã«å
ã§ãç°ãªãå ´åãããã¾ãããã®ãããªåºåã®ã°ãã¤ãã¯è¨è¨ä¸ã®æå³ã«ãããã®ã§ããã仿§ä¸ã許容ããã¦ãã¾ããã¾ããæå¾
ããéãã®çµæã«ãªããªãå¯è½æ§ãããã¾ããä¾ãã°ãformat() ã«ãã£ã¦è¿ãããæååã«ã¯ãéæ¹è¡ã¹ãã¼ã¹ãå«ã¾ãã¦ããããåæ¹åå¶å¾¡æåã§å²ã¾ãã¦ãããããå ´åãããã¾ããIntl ã¡ã½ããã®çµæããã¼ãã³ã¼ãããã宿°ã¨æ¯è¼ãã¦ã¯ãªãããã¦ã¼ã¶ã¼ã«è¡¨ç¤ºãããããã ãã«ä½¿ç¨ãã¹ãã§ãã
ãã¡ããããã®çãã§ã¯ç©è¶³ããªãã¨æããã§ããããã»ã¨ãã©ã®éçºè ã¯ãåºåã®è¦ãç®ãå¶å¾¡ãããã¨èãã¦ããããã§ããå°ãªãã¨ããæå³ä¸æãªåºåã«ãã£ã¦ã¦ã¼ã¶ã¼ãæ··ä¹±ãããããªäºæ ã¯é¿ãããã¯ãã§ããèªåãã¹ãã§ããæåãã¹ãã§ãããå®éã«ãã¹ãã宿½ãããå ´åã®ããã®ã¬ã¤ãã©ã¤ã³ã以ä¸ã«ç¤ºãã¾ãã
- ã¦ã¼ã¶ã¼ã使ç¨ããå¯è½æ§ã®ãããã¹ã¦ã®ãã±ã¼ã«ããã¹ããã¦ãã ããã対å¿ãã¦ãããã±ã¼ã«ãåºå®ããã¦ããå ´åï¼ä¾ãã°ãè¨èªåãæ¿ãæ©è½ã使ç¨ãã¦ããå ´åãªã©ï¼ããã¹ãã¯ããç°¡åã«ãªãã¾ããã¦ã¼ã¶ã¼ãæ¨å¥¨ãããã±ã¼ã«ã使ç¨ããå ´åãã¦ã¼ã¶ã¼ã«ä¸è¬çãªãã®ãããã¤ãé¸ãã§ãã¹ããããã¨ãã§ãã¾ãããã¦ã¼ã¶ã¼ã«è¡¨ç¤ºãããå
容ã¯ç°ãªãå¯è½æ§ããããã¨ã«çæãã¦ãã ãããé常ããã¹ãã©ã³ãã¼ã®è¨å®ã
Intlã®ã³ã³ã¹ãã©ã¯ã¿ã¼ãã¢ãã¯ãããã¨ã§ãã¦ã¼ã¶ã¼ã®è¨å®ãã·ãã¥ã¬ã¼ãã§ãã¾ãã - è¤æ°ã® JavaScript ã¨ã³ã¸ã³ã§ãã¹ããã¦ãã ããã
IntlAPI 㯠JavaScript ã¨ã³ã¸ã³ã«ãã£ã¦ç´æ¥å®è£ ããã¦ãããããä¾ãã° Node.js 㨠Chromeï¼ãããã V8 ã使ç¨ï¼ã§ã¯åãåºåãå¾ãããã¨äºæ³ããã¾ãããFirefoxï¼SpiderMonkey ã使ç¨ï¼ã§ã¯ç°ãªãåºåã«ãªãå¯è½æ§ãããã¾ãããã¹ã¦ã®ã¨ã³ã¸ã³ã CLDR ãã¼ã¿ã使ç¨ãã¦ããã¨æããã¾ãããé常ããã®å¦çæ¹æ³ã¯ããããç°ãªãã¾ããä¾ãã°ãä¸é¨ã®ãã©ã¦ã¶ã¼ã®ãã«ãè¨å®ï¼ã¤ã³ã¹ãã¼ã«ãµã¤ãºã®ç¸®å°ãªã©ï¼ã«ãã£ã¦ã対å¿ãã¦ãããã±ã¼ã«ããªãã·ã§ã³ãç°ãªãå ´åãããã¾ãã - åºåãä»®å®ãã¦ã¯ããã¾ãããã¤ã¾ãã
expect(result).toBe("foo")ã®ããã«ãæåã§åºåãè¨è¿°ãã¹ãã§ã¯ããã¾ããã代ããã«ãã¹ãããã·ã§ãããã¹ãã使ç¨ãããããã¹ãå®è¡æã®åºåããæååå¤ãã³ãã¼ãã¦ãã ããã
ãã¼ã¿ã®æ¸å¼å
Intl ã®ä¸»ãªç¨éã¯ãæ§é åãã¼ã¿ã表ããã±ã¼ã«åºæã®ããã¹ããåºåãããã¨ã§ããããã¯ç¿»è¨³ã½ããã«ä¼¼ã¦ãã¾ãããä»»æã®ããã¹ãã翻訳ãããã®ã§ã¯ãªããæ¥ä»ãæ°å¤ããªã¹ããªã©ã®ãã¼ã¿ãåãåãããã±ã¼ã«åºæã®ã«ã¼ã«ã«å¾ã£ã¦æ¸å¼åãè¡ãã¾ãã
Intl.DateTimeFormatãIntl.DurationFormatãIntl.ListFormatãIntl.NumberFormatãIntl.RelativeTimeFormat ã®åãªãã¸ã§ã¯ãã¯ããããã 1 種é¡ã®ãã¼ã¿ãæ¸å¼åãã¾ããããããã®ã¤ã³ã¹ã¿ã³ã¹ã¯ 2 ã¤ã®ã¡ã½ãããæä¾ãã¾ãã
format(): æå®ããããã¼ã¿ãåãåãããã±ã¼ã«ã¨ãªãã·ã§ã³ã«åºã¥ãã¦æ±ºå®ãããæ¸å¼è¨å®ã«ã¼ã«ã使ç¨ãã¦æååãè¿ãã¾ããformatToParts(): åããã¼ã¿ãåãåããåãæååãè¿ãã¾ããããã®æååã¯è¤æ°ã®é¨åã«åå²ããã¦ãããåé¨åã¯typeã¨valueãæã¤ãªãã¸ã§ã¯ãã¨ãªã£ã¦ãã¾ããããã¯ãæ¸å¼åãããããã¹ããä»ã®ããã¹ãã¨äº¤äºã«é ç½®ããã¨ãã£ããããé«åº¦ãªç¨éã«å½¹ç«ã¡ã¾ãã
ä¾ãã°ãIntl.NumberFormat ãªãã¸ã§ã¯ãã®å
¸åçãªä½¿ç¨ä¾ã¯æ¬¡ã®ã¨ããã§ãã
// 1. ãã±ã¼ã«ã¨æ¸å¼åãªãã·ã§ã³ãæå®ãã¦ããã©ã¼ããã¿ã¼ãªãã¸ã§ã¯ãã使ãã
const price = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
});
// 2. ãã©ã¼ããã¿ã¼ãªãã¸ã§ã¯ãã® `format` ã¡ã½ããã使ç¨ãã¦ãæ°å¤ã®æ¸å¼åãè¡ã
console.log(price.format(5.259)); // $5.26
// ãããã¯ã`formatToParts` ã¡ã½ããã使ç¨ãã¦ãæ¸å¼åãããæ°å¤ã
// æ§æè¦ç´ ãã¨ã«åå¾ãããã¨ãã§ãã
console.table(price.formatToParts(5.259));
// | | type | value |
// | 0 | "currency" | "$" |
// | 1 | "integer" | "5" |
// | 2 | "decimal" | "." |
// | 3 | "fraction" | "26" |
æååã®æ¸å¼åãè¡ãããã«ã常ã«ãã©ã¼ããã¿ã¼ãªãã¸ã§ã¯ããæ§ç¯ããå¿
è¦ã¯ããã¾ãããæ¥å¸¸çãªä½¿ç¨ã§ã¯ããã±ã¼ã«ã¨ãªãã·ã§ã³ã弿°ã¨ãã¦æ¸¡ãã¦ããã¼ã¿ã«å¯¾ãã¦åæã« toLocaleString() ã¡ã½ãããå¼ã³åºããã¨ãã§ãã¾ããtoLocaleString() ã¡ã½ããã¯ã Temporal.PlainDate.prototype.toLocaleString()ãTemporal.Duration.prototype.toLocaleString()ãNumber.prototype.toLocaleString() ãªã©ã«å®è£
ããã¦ãã¾ããæ¸å¼åãããã¼ã¿ã®ããã¥ã¡ã³ããåç
§ããtoLocaleString() ã対å¿ãã¦ãããã©ãããã¾ãã©ã®ãã©ã¼ããã¿ã¼ãªãã·ã§ã³ã«å¯¾å¿ãã¦ãããã確èªãã¦ãã ããã
console.log(
(5.259).toLocaleString("en-US", {
style: "currency",
currency: "USD",
}),
); // $5.26
toLocaleString() ã¯ããã©ã¼ããã¿ã¼ãªãã¸ã§ã¯ããç´æ¥ä½¿ç¨ãããããå¹çãæªãå¯è½æ§ããããã¨ã«æ³¨æãã¦ãã ãããtoLocaleString ãå¼ã³åºããããã³ã«ããã¼ã«ã©ã¤ãºæååã®å·¨å¤§ãªãã¼ã¿ãã¼ã¹å
ãæ¤ç´¢ããå¿
è¦ãããããã§ããåã弿°ã§ãã®ã¡ã½ãããä½åº¦ãå¼ã³åºãå ´åã¯ããã©ã¼ããã¿ã¼ãªãã¸ã§ã¯ãã使ãããã® format() ã¡ã½ããã使ç¨ããæ¹ãé©åã§ãããã©ã¼ããã¿ã¼ãªãã¸ã§ã¯ãã¯æ¸¡ããã弿°ãè¨æ¶ãã¦ããããã¼ã¿ãã¼ã¹ã®ä¸é¨ããã£ãã·ã¥ããå¯è½æ§ãããããããã®å¾ã® format å¼ã³åºãã§ã¯ãããå¶ç´ãããã³ã³ããã¹ãå
ã§ãã¼ã«ã©ã¤ãºæååãæ¤ç´¢ã§ããããã«ãªãããã§ãã
æ¥ä»ã¨æå»ã®æ¸å¼å
Intl.DateTimeFormat ã¯ãæ¥ä»ã¨æå»ãããã³æ¥ä»ã¨æå»ã®ç¯å²ãæ¸å¼åãã¾ããDateTimeFormat ãªãã¸ã§ã¯ãã¯ãDateãTemporal.PlainDateTimeãTemporal.PlainTimeãTemporal.PlainDateãTemporal.PlainYearMonthãTemporal.PlainMonthDay ã®ããããã®å½¢ã§æ¥ä»/æå»ã®å
¥åãåãåãã¾ãã
ã¡ã¢:> Temporal.ZonedDateTime ãªãã¸ã§ã¯ãã¯ãã¿ã¤ã ã¾ã¼ã³ããã§ã«ãªãã¸ã§ã¯ãå
ã§åºå®ããã¦ãããããç´æ¥æ¸¡ããã¨ã¯ã§ãã¾ãããTemporal.ZonedDateTime.prototype.toLocaleString() ã使ç¨ããããäºåã« Temporal.PlainDateTime ã«å¤æããããã¦ãã ããã
æ¥ä»ã¨æå»ã®å½¢å¼ãå°åã«åããã¦èª¿æ´ããä¸è¬çãªç¨éã«ã¯ã次ã®ãããªãã®ãããã¾ãã
- åãæ¥ä»ã¨æå»ããã¤ã¹ã©ã æ¦ãããã©ã¤æ¦ãä¸å½æ¦ãªã©ã®ç°ãªãæ¦ä½ç³»ã§åºåããã
- åã宿éï¼æç¹ï¼ããå¥ã®ã¿ã¤ã ã¾ã¼ã³ã§åºåããã
- æ¥ä»ã¨æå»ã®ç¹å®ã®è¦ç´ ï¼å¹´ãæãªã©ï¼ã®ã¿ã鏿çã«åºåããããããç¹å®ã®å½¢å¼ï¼ãæ¨ææ¥ãããæ¨ããªã©ï¼ã§è¡¨ç¤ºããã
- å°åãã¨ã®æ £ç¿ã«å¾ã£ã¦æ¥ä»ã表示ãããä¾ãã°ãç±³å½ã§ã¯ MM/DD/YYYYãè±å½ã§ã¯ DD/MM/YYYYãæ¥æ¬ã§ã¯ YYYY/MM/DD ã¨ãã£ãå½¢å¼ã§ãã
- 12 æéå¶ã 24 æéå¶ãªã©ãå°åãã¨ã®æ £ç¿ã«å¾ã£ã¦æå»ãåºåããã
æ¸å¼åæååã®è¡¨ç¤ºå½¢å¼ã決å®ããã«ã¯ãã¾ãã«ã¬ã³ãã¼ï¼å¹´ãæãé±ãæ¥ã®è¨ç®ã«å½±é¿ãã¾ãï¼ã¨ã¿ã¤ã ã¾ã¼ã³ï¼æ£ç¢ºãªæå»ããå ´åã«ãã£ã¦ã¯æ¥ä»ã«ãå½±é¿ãã¾ãï¼ã鏿ãã¾ããããã¯ãåè¿°ã® calendar ãªãã·ã§ã³ï¼ã¾ãã¯ãã±ã¼ã«èå¥åå
ã® -ca- æ¡å¼µãã¼ï¼ã¨ãtimeZone ãªãã·ã§ã³ã使ç¨ãã¦è¡ãã¾ãã
Dateãªãã¸ã§ã¯ãã¯ãã¦ã¼ã¶ã¼ã®ã¿ã¤ã ã¾ã¼ã³ããã³ ISO 8601 ã«ã¬ã³ãã¼ã«ãããåºæã®æç¹ã表ãï¼Date.prototype.getHours()ãDate.prototype.getMonth()ãªã©ã®ã¡ã½ããã«ãã£ã¦è¿ãããå¤ã¨åæ§ï¼ããããã¯ããã®ç¬éãä¿æããã¾ã¾æå®ãããcalendarããã³timeZoneã«å¤æããããããæ¥ä»ã¨æå»ã®æåã夿´ããããã¨ãããã¾ãã- å種ã®
Temporalãªãã¸ã§ã¯ãã«ã¯ãã§ã«ã«ã¬ã³ãã¼ãçµã¿è¾¼ã¾ãã¦ãããããcalendarãªãã·ã§ã³ã¯ãªãã¸ã§ã¯ãã®ã«ã¬ã³ãã¼ã¨ä¸è´ããªããã°ãªããªãããã ããæ¥ä»ã®ã«ã¬ã³ãã¼ã"iso8601"ã§ããå ´åã¯ããªã¯ã¨ã¹ããããcalendarã«å¤æãããããããã®ãªãã¸ã§ã¯ãã«ã¯ã¿ã¤ã ã¾ã¼ã³ãè¨å®ããã¦ããªããããæå®ãããtimeZoneã§å¤æããããã¨ãªãç´æ¥è¡¨ç¤ºãããã
ããã§ã¯ãcalendar 㨠timeZone ã®è¨å®ãçµã¿åããããã¨ã§ãåãç¬éãã©ã®ããã«ç°ãªãå½¢å¼ã§è¡¨ç¾ããããã示ãã¾ãã
// ãã¼ã«ã«ã¿ã¤ã ã¾ã¼ã³ã UTC ã§ããã¨æ³å®
const targetDate = new Date(2022, 0, 1); // ãã¼ã«ã«ã¿ã¤ã ã¾ã¼ã³ã§ã® 2022-01-01 ã®çå¤ä¸
const results = [];
for (const calendar of ["gregory", "hebrew"]) {
for (const timeZone of ["America/New_York", "Asia/Tokyo"]) {
const df = new Intl.DateTimeFormat("ja-JP", {
calendar,
timeZone,
// ãããã«ã¤ãã¦ã¯ã¾ãå¾ã§
dateStyle: "full",
timeStyle: "full",
});
results.push({ calendar, timeZone, output: df.format(targetDate) });
}
}
console.table(results);
åºåçµæã¯æ¬¡ã®ããã«ãªãã¾ãã
| æ¦ | ã¿ã¤ã ã¾ã¼ã³ | åºåçµæ |
|---|---|---|
| 'gregory' | 'America/New_York' | '2021å¹´12æ31æ¥éææ¥ 10æ00å00ç§ ç±³å½æ±é¨æ¨æºæ' |
| 'gregory' | 'Asia/Tokyo' | '2022å¹´1æ1æ¥åææ¥ 0æ00å00ç§ æ¥æ¬æ¨æºæ' |
| 'hebrew' | 'America/New_York' | 'AM5782å¹´4æ27æ¥éææ¥ 10æ00å00ç§ ç±³å½æ±é¨æ¨æºæ' |
| 'hebrew' | 'Asia/Tokyo' | 'AM5782å¹´4æ28æ¥åææ¥ 0æ00å00ç§ æ¥æ¬æ¨æºæ' |
æ¥ä»ã¨æå»ã¯ãweekdayãeraãyearãmonthãdayãdayPeriodãhourãminuteãsecondãfractionalSecondDigitsãtimeZoneNameã¨ããæåã§æ§æããã¦ãã¾ããæ¬¡ã«ãåºåã«ã©ã®è¦ç´ ãå«ããããã¾ãããããã©ã®ãããªå½¢å¼ã§è¡¨ç¤ºããããæ±ºå®ããå¿
è¦ãããã¾ãã鏿è¢ã¯ 2 ã¤ããã¾ãã
- ããããã®è¦ç´ ã¯ããã®è¦ç´ ã¨åãååã®ãªãã·ã§ã³ã使ç¨ãã¦æåã§è¨å®ã§ãã¾ããæå®ããè¦ç´ ã®ã¿ããæå®ãããå½¢å¼ã§åºåã«å«ã¾ãã¾ãã
- ãããããå®ç¾©ãããè¦ç´ ã®ã»ããã§ãã
dateStyleããã³timeStyleã®çç¥å½¢ã使ç¨ãããã¨ãã§ãã¾ãããããã¯ããã±ã¼ã«ã«å¿ãã¦ä¸é£ã®è¦ç´ ãªãã·ã§ã³ã«å±éããã¾ãã
ããã 2 ã¤ã®æ¹æ³ã®ãã¡ãã©ã¡ãã䏿¹ã鏿ãã¦ãã ããããããã¯äºãã«æä»çã§ããããã両æ¹ãåæã«ä½¿ç¨ããã¨ã¨ã©ã¼ãçºçãã¾ãã
åºæ¬çã«ãè¦ç´ ã®çµã¿åããããªã¯ã¨ã¹ãããã¨ãDateTimeFormat ãªãã¸ã§ã¯ãã¯ãªã¯ã¨ã¹ããããè¦ç´ ã«ä¸è´ããããã³ãã¬ã¼ãããè¦ã¦ãããå¤ãä¸ã¤ãã¤åãã¦ããã ãã§æ¸ã¿ã¾ãããã ãããã¹ã¦ã®è¦ç´ ã®çµã¿åããã«äºåå®ç¾©ããããã³ãã¬ã¼ããæã¤ããã§ã¯ããã¾ãããDateTimeFormat ã«ã¯ formatMatcher ãªãã·ã§ã³ããããããã«ãã£ã¦ãè¦ç´ ããªã¯ã¨ã¹ãããããã®ãã詳ãããããçããããããããã¯è¦ç´ ãçç¥ããã追å ããããããã¨ã§ãã©ã®ããã«äº¤æ¸ããããæ±ºå®ãã¾ããããªãæè¡çãªå
容ã«ãªãããããã®å¦çæ¹æ³ãããæ·±ãçè§£ããã«ã¯ãIntl.DateTimeFormat() ã®ãªãã¡ã¬ã³ã¹ãåç
§ãããã¨ããå§ããã¾ãã
ããã§ã¯ãè¦ç´ ã®æ¸å¼åãè¡ãä¸è¬çãªæ¹æ³ãããã¤ãç´¹ä»ãã¾ãã
const df1 = new Intl.DateTimeFormat("en-US", {
// ãã¹ã¦ã®æåãå«ãï¼é常ï¼
dateStyle: "full",
timeStyle: "full",
});
const df2 = new Intl.DateTimeFormat("en-US", {
// æ¦ã®æ¥ã表示
era: "short",
year: "numeric",
month: "long",
day: "numeric",
});
const df3 = new Intl.DateTimeFormat("en-US", {
// ãã¸ã¿ã«æè¨ã®ãããªæå»ã®è¡¨ç¤º
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
timeZoneName: "shortOffset",
});
const targetDate = new Date(2022, 0, 1, 12, 34, 56); // ãã¼ã«ã«ã¿ã¤ã ã¾ã¼ã³ã§ã® 2022-01-01 12:34:56
console.log(df1.format(targetDate));
// Saturday, January 1, 2022 at 12:34:56 PM Coordinated Universal Time
// January 1, 2022 AD
// 12:34:56 PM GMT
ãã以å¤ã«ãã«ã¹ã¿ãã¤ãºãªãã·ã§ã³ãããã¾ããä¾ãã°ãhourCycle ãªãã·ã§ã³ã使ç¨ããã¨ãæéã 12 æéå¶ã¾ã㯠24 æéå¶ã§è¡¨ç¤ºãããããçå¤ä¸ãæ£åã 12:00 ã¾ã㯠0:00 ã¨è¡¨ç¤ºãããããããã¨ãã§ãã¾ããã¾ããnumberingSystem ãªãã·ã§ã³ã使ç¨ããã¨ãä»»æã®æ°å¤ãå¥ã®è¡¨è¨æ³ã§è¡¨ç¤ºããããã¨ãå¯è½ã§ãã
format() ã®ã»ãã«ããæ¥ä»ãæå»ã®ç¯å²ãæ¸å¼åããéè¦ãªã¡ã½ãããããä¸ã¤ããã¾ããformatRange() ã§ãããã®ã¡ã½ããã¯ãåãåã®æ¥ä»ã»æå»ã 2 ã¤åãåãããããããæ¸å¼åããå¾ãåºåãæåï¼ãã¤ãã³ãªã©ï¼ã§çµåããéè¤ããé¨åãåé¤ãã¾ãã
const springBreak = {
start: new Date(2023, 2, 10),
end: new Date(2023, 2, 26),
};
const df = new Intl.DateTimeFormat("en-US", { dateStyle: "long" });
console.log(df.formatRange(springBreak.start, springBreak.end));
// March 10âââ26, 2023
æ°å¤ã®æ¸å¼å
æ°å¤ã®æ¸å¼åã¯ãIntl.NumberFormat ãªãã¸ã§ã¯ãã使ç¨ãã¦è¡ãã¾ããNumberFormat ãªãã¸ã§ã¯ãã¯ãæ°å¤ãæååãé·æ´æ°åã®å¤ãåãå
¥ãã¾ããæ°å¤ã®ä»£ããã«æååãé·æ´æ°ã渡ããã¨ã§ãJavaScript ã§æ£ç¢ºã«è¡¨ããªãã»ã©å¤§ããããããããã¯å°ããããæ°å¤ã®æ¸å¼åãè¡ããã¨ãã§ãã¾ãã
æ°å¤ã®æ¸å¼åã®ãã¼ã«ã©ã¤ãºã«ãããä¸è¬çãªç¨éã¯ã次ã®ãããªãã®ã§ãã
- ãã®æ°å¤ããä¸å½å¼ãã¢ã©ãã¢å¼ããã¼ãå¼ãªã©ã®å¥ã®è¨æ°æ³ã§åºåããã
- å°æ°ç¹è¨å·ï¼è±èªã§ã¯ "." ã ããå¤ãã®ã¨ã¼ããã諸å½ã§ã¯ ","ï¼ãæ¡åºåãï¼è±èªã§ã¯ 3 æ¡ã ããä»ã®æååã§ã¯ 4 æ¡ã 2 æ¡ã®å ´åãããã","ã" "ã"." ã使ç¨ããããã¨ãããï¼ãªã©ãå°ååºæã®è¡¨è¨è¦åã«å¾ã£ã¦æ°å¤ãåºåãããã
- ãã®æ°å¤ãã370ä¸ããã2åãã®ãããªææ°è¡¨è¨ãä»ãã¦åºåããã
- æ°å¤ãé貨形å¼ã§åºåããç¹å®ã®é貨è¨å·ã¨åæ¨äºå ¥ã®ã«ã¼ã«ãé©ç¨ãããä¾ãã°ãç±³å½ã§ã¯ 1 ã»ã³ãæªæºãæ¥æ¬ã§ã¯ 1 åæªæºã®éé¡ã¯ã表示ããã¦ãæå³ããªãå ´åãããã
- ãã®æ°å¤ããã¼ã»ã³ãå¤ã¨ãã¦åºåãããã±ã¼ã«åºæã®æç®ããã³æ¸å¼è¨å®ã«ã¼ã«ãé©ç¨ãã¾ãã
- æ°å¤ã«åä½ãã¤ãã¦ããã¡ã¼ãã«ããããªããã«ããªã©ã®åä½åï¼ç¿»è¨³ããããã®ï¼ãã¤ãã¦åºåããã
æ¸å¼ä»ãæååã®å¤è¦³ã決ããã«ã¯ãã¾ãè¨æ°æ³ã鏿ãã¾ãï¼ããã¯æ°åã«ä½¿ç¨ããã¦ããæåã«å½±é¿ãã¾ãï¼ãè¨æ°æ³ã®ç®çã«ã¤ãã¦ã¯ããã±ã¼ã«æ
å ±ã§ãã§ã«èª¬æãã¦ãã¾ãã ãã 1 ã¤æ±ºå®ããå¿
è¦ããããªãã·ã§ã³ã¯ style ã§ããããã¯æ°å¤ãä½ã表ããã®ã³ã³ããã¹ããè¨å®ããä»ã®ãªãã·ã§ã³ã®ããã©ã«ãå¤ã«å½±é¿ãä¸ããå¯è½æ§ãããã¾ããå¤ã¯ "decimal"ã"percent"ã"currency"ã"unit" ã®ããããã§ããéè²¨ã®æ¸å¼åãè¡ãå ´åã¯ãcurrency ãªãã·ã§ã³ãæä¾ããå¿
è¦ãããã¾ããåä½ã®æ¸å¼åãè¡ãå ´åã¯ãunit ãªãã·ã§ã³ãæä¾ããå¿
è¦ãããã¾ãã
const results = [];
for (const options of [
{ style: "decimal" }, // æ°å¤ãåä½ã®ãªãå°æ°ã¨ãã¦æ¸å¼å
{ style: "percent" }, // æ°å¤ããã¼ã»ã³ã夿¸å¼ã§è¡¨ç¤ºãæ°å¤ã« 100 ãæãããã
{ style: "currency", currency: "USD" }, // æ°å¤ãç±³ãã«éé¡ã¨ãã¦æ¸å¼åãã
{ style: "unit", unit: "meter" }, // æ°å¤ãã¡ã¼ãã«åä½ã§æ¸å¼åãã
]) {
const nf = new Intl.NumberFormat("ja", options);
results.push({ style: options.style, output: nf.format(1234567.89) });
}
console.table(results);
åºåçµæã¯æ¬¡ã®ããã«ãªãã¾ãã
| style | åºåçµæ |
|---|---|
| 'decimal' | '1,234,567.89' |
| 'percent' | '123,456,789%' |
| 'currency' | '$1,234,567.89' |
| 'unit' | '1,234,567.89 m' |
次ã®ã°ã«ã¼ãã®ãªãã·ã§ã³ã¯ããã¹ã¦æ°å¤é¨åã®è¡¨ç¤ºå½¢å¼ãæå®ãããã®ã§ããã¾ããé常ã«å¤§ããªå¤ããããèªã¿åãå¯è½ãªå½¢ã§è¡¨ãããå ´åãããã§ããããnotation ãªãã·ã§ã³ã "scientific" ã¾ã㯠"engineering" ã«è¨å®ããã¨ãã©ã¡ãã 1.23e+6 ã®ãããªè¡¨è¨ã使ç¨ããã¾ãã両è
ã®éãã¯ãå¾è
ãææ°ã«3ã®åæ°ã使ç¨ããä»®æ°ï¼e è¨å·ããåã®é¨åï¼ã 1 ãã 1000 ã®ç¯å²ã«åããã®ã«å¯¾ããåè
ã¯ææ°ã«ä»»æã®æ´æ°ã使ç¨ãããã¨ãã§ãã¾ãããä»®æ°ã 1 ãã 10 ã®ç¯å²ã«åãã¾ããåæã«ãnotation ã "compact" ã«è¨å®ããã¨ããã人éãèªã¿åãå¯è½ãªè¡¨è¨ã使ç¨ãããã¨ãã§ãã¾ãã
const results = [];
for (const options of [
{ notation: "scientific" },
{ notation: "engineering" },
{ notation: "compact", compactDisplay: "short" }, // "short" ãããã©ã«ã
{ notation: "compact", compactDisplay: "long" },
]) {
const nf = new Intl.NumberFormat("en-US", options);
results.push({
notation: options.compactDisplay
? `${options.notation}-${options.compactDisplay}`
: options.notation,
output: nf.format(12000),
});
}
console.table(results);
åºåçµæã¯æ¬¡ã®ããã«ãªãã¾ãã
| notation | åºåçµæ |
|---|---|
| 'scientific' | '1.2E4' |
| 'engineering' | '12E3' |
| 'compact-short' | '12K' |
| 'compact-long' | '12 thousand' |
次ã«ãæ°å¤ãé·ããªããããªãããã«ãæ°å¤ã丸ãããã¨ããå§ããã¾ãï¼notation ãæå®ãã¦ããå ´åã¯ãä»®æ°é¨ã®ã¿ã対象ã¨ãªãã¾ãï¼ã以ä¸ã«ãæ¡æ°ã®è¨å®ãªãã·ã§ã³ãè¨è¼ãã¾ãã
minimumIntegerDigitsminimumFractionDigitsmaximumFractionDigitsminimumSignificantDigitsmaximumSignificantDigitsroundingPriorityroundingIncrementroundingMode
ãããã®ãªãã·ã§ã³ã®æ£ç¢ºãªç¸äºä½ç¨ã¯ããªãè¤éã§ãããããã§ã¯ç¶²ç¾ ãã価å¤ã¯ããã¾ããã詳細ã«ã¤ãã¦ã¯ãæ¡ãªãã·ã§ã³ã®ãªãã¡ã¬ã³ã¹ãåç §ãã¦ãã ãããã¨ã¯ãããåºæ¬çãªä»çµã¿ã¯åç´ã§ããã¾ããä¿æãããå°æ°ç¹ä»¥ä¸ã®æ¡æ°ãæ¢ãããã®å¾ãæå¾ã®æ¡ã®å¤ã«å¿ãã¦åãæ¨ã¦ã¾ãã¯åãä¸ããè¡ããä½åãªå°æ°ç¹ã丸ãã¾ãã
const results = [];
for (const options of [
{ minimumFractionDigits: 4, maximumFractionDigits: 4 },
{ minimumSignificantDigits: 4, maximumSignificantDigits: 4 },
{ minimumFractionDigits: 0, maximumFractionDigits: 0, roundingMode: "floor" },
{
minimumFractionDigits: 0,
maximumFractionDigits: 0,
roundingMode: "floor",
roundingIncrement: 10,
},
]) {
const nf = new Intl.NumberFormat("en-US", options);
results.push({
options,
output: nf.format(1234.56789),
});
}
console.table(results);
åºåçµæã¯æ¬¡ã®ããã«ãªãã¾ãã
| options | åºåçµæ |
|---|---|
{ minimumFractionDigits: 4, maximumFractionDigits: 4 } |
'1,234.5679' |
{ minimumSignificantDigits: 4, maximumSignificantDigits: 4 } |
'1,235' |
{ minimumFractionDigits: 0, maximumFractionDigits: 0, roundingMode: "floor" } |
'1,234' |
{ minimumFractionDigits: 0, maximumFractionDigits: 0, roundingMode: "floor", roundingIncrement: 10 } |
'1,230' |
ãã以å¤ã«ãã«ã¹ã¿ãã¤ãºãªãã·ã§ã³ãããã¾ããä¾ãã°ãuseGrouping ã signDisplay ãªãã·ã§ã³ã使ç¨ãããã¨ãã§ãã¾ããããã«ãããã°ã«ã¼ãåºåãæåï¼"1,234,567.89" ã® "," ãªã©ï¼ã符å·ã表示ããããã©ãããã¾ããã®è¡¨ç¤ºæ¹æ³ãã«ã¹ã¿ãã¤ãºã§ãã¾ãããã ããã°ã«ã¼ãåºåãæåãå°æ°ç¹ã符å·ã«ä½¿ç¨ãããæåã¯ãã±ã¼ã«ã«ä¾åãããããç´æ¥ã«ã¹ã¿ãã¤ãºãããã¨ã¯ã§ããªãç¹ã«ã注æãã ããã
format() ã®ä»ã«ãæ°å¤ã®ç¯å²ãæ¸å¼åããããã«ããä¸ã¤éè¦ãªã¡ã½ãããformatRange() ãããã¾ãããã®ã¡ã½ãã㯠2 ã¤ã®æ°å¤è¡¨ç¾ãåãåãããããããæ¸å¼åããå¾ãåºåãæåï¼ãã¤ãã³ãªã©ï¼ã§çµåããå
±éé¨åãéè¤æé¤ããå ´åãããã¾ãã
const heightRange = {
min: 1.63,
max: 1.95,
};
const nf = new Intl.NumberFormat("en-US", { style: "unit", unit: "meter" });
console.log(nf.formatRange(heightRange.min, heightRange.max));
// 1.63â1.95 m
ãªã¹ãã®æ¸å¼å
ãã§ã«æ¬¡ã®ãããªã³ã¼ããæ¸ãããã¨ãããããããã¾ããã
const fruits = ["apple", "banana", "cherry"];
console.log(`I like ${fruits.join(", ")}.`);
// I like apple, banana, cherry.
ãã®ã³ã¼ãã¯å½éå対å¿ãã¦ãã¾ãããè¨èªã«ãã£ã¦ã¯ããªã¹ãã®åºåãæåãã«ã³ãã§ã¯ãªãå ´åãããã¾ããã»ã¨ãã©ã®è¨èªï¼è±èªãå«ãï¼ã§ã¯ãæå¾ã®ã¢ã¤ãã ã®åã«æ¥ç¶è©ãå¿ è¦ã§ããããããåã«æåã§ "and" ã追å ããã ãã§ã¯ããã¹ã¦ã®è±èªè©±è ã«ã¨ã£ã¦æ£ããã¨ã¯éãã¾ããããªããªããè±èªã«ã¯ãªãã¯ã¹ãã©ã¼ãã«ã³ãã«é¢ããè°è«ãããããã§ãã"apple, banana, and cherry" 㨠"apple, banana and cherry" ã®ã©ã¡ããæ£ãããã¨ããåé¡ã§ãã
Intl.ListFormat ãªãã¸ã§ã¯ãã¯ãã®åé¡ã解決ãã¾ãããã®ãªãã¸ã§ã¯ãã¯æååã®é
åãåãåãããã±ã¼ã«ã«å¿ããæ¹æ³ã§ããããé£çµããçµæãçµå (and)ã鏿 (or)ãåä½ã®ãªã¹ãã表ãããã«ãã¾ãã
const fruits = ["apple", "banana", "cherry"];
const lf = new Intl.ListFormat("en-US", { style: "long", type: "conjunction" });
console.log(`I like ${lf.format(fruits)}.`);
// I like apple, banana, and cherry.
const lf = new Intl.ListFormat("en-US", { style: "long", type: "disjunction" });
console.log(`I can give you ${lf.format(fruits)}.`);
// I can give you apple, banana, or cherry.
ãã以å¤ã®ã¬ã¤ã¤ãªãã·ã§ã³ã«ã¤ãã¦ã¯ã Intl.ListFormat() ã確èªãã¦ãã ããã
ç¸å¯¾æå»ã®æ¸å¼å
Intl.RelativeTimeFormat ã¯ãæéå·®ãæ¸å¼åãã¾ããRelativeTimeFormat ãªãã¸ã§ã¯ãã¯ã2 ã¤ã®å¼æ°ãï¼ç¬¦å·ãåããªãï¼æ°å¤ã¨ã"day"ã"hour"ã"minute" ãªã©ã®æéåä½ã®å½¢ã§ç¸å¯¾æéãæå®ãã¾ãã
ããã¯è¤æ°ã®ãã¨ãä¸åº¦ã«è¡ãã¾ãã
- æéåä½ãå°åã«åããã¦è¡¨ç¤ºããæ°å¤ã®æ¸å¼åã¨åæ§ã«è¤æ°å½¢ã«å¤æããï¼ä¾: "1 day" 㨠"2 days"ï¼ã
- éå»ãæªæ¥ã®æç¹ã表ãã®ã«é©åãªè¡¨ç¾ï¼ã1 æ¥å¾ããã1 æ¥åããªã©ï¼ãé¸ã¶ã
- ã1 æ¥åãã¨ãæ¨æ¥ãã®ããã«ãç¹å®ã®æéåä½ã«å¯¾ãã¦ç¹å¥ãªè¡¨ç¾ã鏿ããããã¨ãããã¾ãã
const rtf = new Intl.RelativeTimeFormat("en-US", { numeric: "auto" });
console.log(rtf.format(1, "day")); // tomorrow
console.log(rtf.format(2, "day")); // in 2 days
console.log(rtf.format(-1, "hour")); // 1 hour ago
ãã®ä»ã®ä¾ããªãã·ã§ã³ã«ã¤ãã¦ã¯ Intl.RelativeTimeFormat() ãåç
§ãã¦ãã ããã
æéã®æ¸å¼å
Intl.DurationFormat ã¯ãã3 æé 4 å 5 ç§ãã®ãããªæéã®æ¸å¼åãæä¾ãã¾ããããã¯ç¬èªã®ãã©ã¼ããã¿ã¼ãæã¤åç¬ã®æä½ã§ã¯ãªããå
é¨ã§ Intl.NumberFormat ããã³ Intl.ListFormat ã使ç¨ãã¦ããããã®æéã®è¦ç´ ãæ¸å¼åãããªã¹ãåºåãæåã§ããããçµåãã¾ããDurationFormat ãªãã¸ã§ã¯ãã¯ãTemporal.Duration ãªãã¸ã§ã¯ããã¾ãã¯åãããããã£ãæã¤åç´ãªãªãã¸ã§ã¯ãã®å½¢ã§æéãåãåãã¾ãã
çªå·ä»ãæ¹å¼ã®ã«ã¹ã¿ãã¤ãºã«å ããæéã®æ¸å¼åãªãã·ã§ã³ã§ã¯ãããããã®è¦ç´ ã表示ããããã©ãããããã³ãã®é·ããã©ã®ããã«è¨å®ããããæ±ºå®ãã¾ãã
console.log(
new Intl.DurationFormat("ja", {
style: "long",
}).format({ hours: 3, minutes: 4, seconds: 5 }),
);
// 3 æé 4 å 5 ç§
ãã以å¤ã®ä¾ããªãã·ã§ã³ã¯ Intl.DurationFormat() ãåç
§ãã¦ãã ããã
ç §åé åº
Intl.Collator ãªãã¸ã§ã¯ãã¯ãæååã®æ¯è¼ãã½ã¼ãã«å½¹ç«ã¡ã¾ãããã®ãªãã¸ã§ã¯ã㯠2 ã¤ã®æååãåãåããArray.prototype.sort ã¡ã½ããã® compareFn 弿°ã¨åæ§ã«ããããã®ç¸å¯¾çãªé åºãç¤ºãæ°å¤ãè¿ãã¾ãã
ã¦ã¼ã¶ã¼åãã®æååãæ¯è¼ããéã«ã=== ã > ã¨ãã£ã JavaScript ã®æ¼ç®åã使ç¨ãã¹ãã§ãªãçç±ãæ°å¤ãããã¾ãã
- ç¡é¢ä¿ãªç¶´ãã®éããããã¾ããä¾ãã°ãè±èªã§ã¯ "naïve" 㨠"naive" ã¯åãåèªã®ç°ãªãç¶´ãã«éãããåçã«æ±ãã¹ãã§ãã
- 大æåã¨å°æåãåºå¥ããªãå ´åãããã¾ããæååãæ¯è¼ããéã大æåã¨å°æåãåºå¥ããªãããã«ãããå¤ãã®å ´åãããã¾ããä¾ãã°ã "apple" 㨠"Apple" ã¯åä¸ã¨ã¿ãªãããã¹ãã§ãã
- Unicode ã³ã¼ããã¤ã³ãã®é åºã«ã¯ä¸è²«æ§ãããã¾ããã
>ã®ãããªæ¯è¼æ¼ç®å㯠Unicode ã³ã¼ããã¤ã³ãã®é åºã«åºã¥ãã¦æ¯è¼ãè¡ãã¾ãããããã¯è¾æ¸ã«ãããæåã®é åºã¨ã¯ç°ãªãã¾ããä¾ãã°ãã³ã¼ããã¤ã³ãã®é åºã§ã¯ "ï" 㯠"z" ã®å¾ã«æ¥ã¾ãããè¾æ¸ã§ã¯ "i" ã®é£ã«ä¸¦ãã§ã»ãããã®ã§ãã - Unicode ã®æ£è¦åãUnicode ã§ã¯ãåãæåãè¤æ°ã®è¡¨ç¾ãæã¤ãã¨ãã§ããå ´åãããã¾ããä¾ãã°ã"ñ" ã¯åä¸ã®æåã¨ãã¦è¡¨ããããã"n" ã«çµåç¨ãã«ããç¶ãå½¢ã¨ãã¦è¡¨ãããããã¾ãï¼
String.prototype.normalize()ãåç §ï¼ããããã¯åä¸ã®ãã®ã¨ãã¦æ±ãããã¹ãã§ãã - æ°å¤ã®æ¯è¼ãæååå ã®æ°å¤ã¯ãæååã¨ãã¦ã§ã¯ãªãæ°å¤ã¨ãã¦æ¯è¼ããå¿ è¦ãããã¾ããä¾ãã°ã"test-10" 㯠"test-2" ãããå¾ã«æ¥ãããã«ãããã§ãããã
ç §åã«ã¯ãã½ã¼ãã¨æ¤ç´¢ã¨ãã 2 ã¤ã®æç¢ºãªç¨éãããã¾ããã½ã¼ãã¨ã¯ãæååã®ãªã¹ãããããä½ããã®ã«ã¼ã«ã«å¾ã£ã¦ããããä¸¦ã¹æ¿ããå ´åãæãã¾ããæ¤ç´¢ã¨ã¯ãæååã®ãªã¹ãããããåãåããã«ä¸è´ããæååãæ¢ãããå ´åãæãã¾ããæ¤ç´¢ãè¡ãéã¯ãæ¯è¼çµæã 0ï¼çããï¼ãã©ããã ãã«æ³¨æãæããçµæã®ç¬¦å·ã«ã¯æ³¨æãæãå¿ è¦ã¯ããã¾ããã
åããã±ã¼ã«å ã§ããä¸¦ã¹æ¿ãã®æ¹æ³ã«ã¯ãã¾ãã¾ãªãã®ãããã¾ããä¾ãã°ããã¤ãèªã«ã¯å®éããé»è©±å¸³é ãã¨ãè¾æ¸é ãã¨ãã 2 ã¤ã®ç°ãªãã½ã¼ãé ãããã¾ããé»è©±å¸³é ã§ã¯é³ã強調ãããã½ã¼ãåã« "ä", "ö" ãªã©ã®æåã "ae", "oe" ãªã©ã®ããã«å±éããããã®ããã«è¡¨ç¤ºããã¾ãã
const names = ["Hochberg", "Hönigswald", "Holzman"];
const germanPhonebook = new Intl.Collator("de-DE-u-co-phonebk");
// ["Hochberg", "Hoenigswald", "Holzman"]; ã§ãããã®ããã«ã½ã¼ãããã
console.log(names.sort(germanPhonebook.compare));
// ['Hochberg', 'Hönigswald', 'Holzman']
ãã¤ãèªã«ã¯ã¦ã ã©ã¦ãä»ãã§æ´»ç¨ããåèªããããããè¾æ¸ã§ã¯ã¦ã ã©ã¦ããç¡è¦ãã¦ä¸¦ã¹æ¿ããã®ãåççã§ãï¼schon 㨠schön ã®ãããªãã¦ã ã©ã¦ãã®ã¿ãç°ãªãåèªã並ã¹ãå ´åãé¤ãï¼ã
const germanDictionary = new Intl.Collator("de-DE-u-co-dict");
// ["Hochberg", "Honigswald", "Holzman"] ã§ãããã®ããã«ã½ã¼ãããã
console.log(names.sort(germanDictionary.compare).join(", "));
// "Hochberg, Holzman, Hönigswald"
è¤æ°å½¢è¦å
Intl.PluralRules ãªãã¸ã§ã¯ãã¯ãåèªã®æ£ããè¤æ°å½¢ã鏿ããã®ã«æç¨ã§ãããã®ãªãã¸ã§ã¯ãã¯èªåçã«åèªãè¤æ°å½¢ã«å¤æããããã§ã¯ããã¾ãããï¼ä¾ãã°ã"apple" ãæ¸¡ã㦠"apples" ãè¿ã£ã¦ãããã¨ãæå¾
ãããã¨ã¯ã§ãã¾ããï¼ãæ°å¤ã«åºã¥ãã¦ã©ã®è¤æ°å½¢ã使ç¨ãã¹ãããæç¤ºãã¦ããã¾ãããã§ã«æ¬¡ã®ãããªä½¿ãæ¹ãããã¦ããããããã¾ããã
function formatMessage(n) {
return `You have ${n} ${n === 1 ? "apple" : "apples"}.`;
}
ãããããã®è¦åããã¹ã¦ã®è¨èªã«ä¸æ¦ã«å½ã¦ã¯ããã®ã¯é£ãããç¹ã«è¤æ°å½¢ã夿°åå¨ããè¨èªã§ã¯ãªãããã§ããè¤æ°å½¢ã®è¦åã«é¢ããä¸è¬çãªæ¦è¦ã«ã¤ãã¦ã¯ãIntl.PluralRules ãåç
§ãã¦ãã ãããããã§ã¯ãããã¤ãä¸è¬çãªç¨éãç´¹ä»ããã«ã¨ã©ãã¾ãã
const prCard = new Intl.PluralRules("en-US");
const prOrd = new Intl.PluralRules("en-US", { type: "ordinal" });
const englishOrdinalSuffixes = {
one: "st",
two: "nd",
few: "rd",
other: "th",
};
const catPlural = {
one: "cat",
other: "cats",
};
function formatMessage(n1, n2) {
return `The ${n1}${englishOrdinalSuffixes[prOrd.select(n1)]} U.S. president had ${n2} ${catPlural[prCard.select(n2)]}.`;
}
console.log(formatMessage(42, 1)); // The 42nd U.S. president had 1 cat.
console.log(formatMessage(45, 0)); // The 45th U.S. president had 0 cats.
åºåãæå
Intl.Segmenter ãªãã¸ã§ã¯ãã¯ãæååãã»ã°ã¡ã³ãã«åå²ããã®ã«æçã§ããIntl ã使ç¨ããªãã¦ããUTF-16 ã³ã¼ãåä½ããã³ Unicode ã³ã¼ããã¤ã³ãã«åºã¥ãã¦æååãåå²ãããã¨ã¯å¯è½ã§ãã
const str = "ðºð¸ð¨ð³ð·ðºð¬ð§ð«ð·";
console.log(str.split(""));
// Array(20) ['\uD83C', '\uDDFA', '\uD83C', ...]
console.log([...str]);
// Array(10) ['ðº', 'ð¸', 'ð¨', 'ð³', 'ð·', 'ðº', 'ð¬', 'ð§', 'ð«', 'ð·']
ãããããåããã®ããã«ãUnicode ã³ã¼ããã¤ã³ãã¯ã人éã®ã¦ã¼ã¶ã¼ãåå¥ã®æåã¨ãã¦èªèãããã®ã¨ä¸è´ããããã§ã¯ããã¾ãããããã¯çµµæåã§å¤ãã®å ´åç¾ããç¾è±¡ã§ãããåä¸ã®çµµæåãè¤æ°ã®ã³ã¼ããã¤ã³ãã§è¡¨ããããã¨ãããã¾ããã¦ã¼ã¶ã¼ãããã¹ããæä½ããéãæ¸è¨ç´ ã¨ã¯ãåé¤ã鏿ãªã©ãã¦ã¼ã¶ã¼ãæä½ã§ããããã¹ãã®æå°åä½ã®ãã¨ã§ããSegmenter ãªãã¸ã§ã¯ãã¯ãæ¸è¨ç´ åä½ã®åºåããã§ããããã«ããæåæ°ã®ã«ã¦ã³ããããã¹ãã®å¹
ã®æ¸¬å®ãªã©ã§å½¹ç«ã¡ã¾ãããã®ãªãã¸ã§ã¯ãã¯æååãåãåããå復å¯è½ãªãã¸ã§ã¯ã segments ãè¿ãã¾ãããã®ãªãã¸ã§ã¯ãã®ããããã®è¦ç´ ã«ã¯ããã®åºéã®ããã¹ãã表ã segment ããããã£ãããã¾ãã
const segmenter = new Intl.Segmenter("en-US", { granularity: "grapheme" });
console.log([...segmenter.segment("ðºð¸ð¨ð³ð·ðºð¬ð§ð«ð·")].map((s) => s.segment));
// ['ðºð¸', 'ð¨ð³', 'ð·ðº', 'ð¬ð§', 'ð«ð·']
ãã®ã»ã°ã¡ã³ã¿ã¼ã¯ãåèªåä½ãæåä½ã®åå²ãªã©ãããé«ã¬ãã«ã®åå²å¦çãè¡ããã¨ãå¯è½ã§ãããããã®å ´åãå¿ ç¶çã«è¨èªã«ä¾åãã¾ããä¾ãã°ã以ä¸ã¯åèªã«ã¦ã³ãã®éå¸¸ã«æãå®è£ ä¾ã§ãã
const wordCount = (str) => str.split(/\s+/).length;
console.log(wordCount("Hello, world!")); // 2
ãã®åé¡ã«ã¯ããã¤ãã®åé¡ãããã¾ãããã¹ã¦ã®è¨èªãåèªã®åºåãã¨ãã¦ç©ºç½ãæ±ãããã§ã¯ãªãããã¹ã¦ã®ç©ºç½ãåèªã®åºåãã§ããããã§ããªããã¾ããã¹ã¦ã®åèªã空ç½ã§åºåããã¦ããããã§ããªãããã§ããããã解決ããã«ã¯ãgranularity: "word" ãæå®ã㦠Segmenter ã使ç¨ãã¾ãããã®çµæãå
¥åæååãåèªã¨éåèªã®åºéã«åå²ããã¾ããåèªæ°ãã«ã¦ã³ãããå ´åã¯ãããããã®åºéã® isWordLike ããããã£ã調ã¹ã¦ãéåèªãé¤å¤ããå¿
è¦ãããã¾ãã
const segmenter = new Intl.Segmenter("en-US", { granularity: "word" });
const str = "It can even split non-space-separated words";
console.table([...segmenter.segment(str)]);
// âââââââââââââââ¬ââââââââ¬âââââââââââââ
// â segment â index â isWordLike â
// âââââââââââââââ¼ââââââââ¼âââââââââââââ¤
// â 'It' â 0 â true â
// â ' ' â 2 â false â
// â 'can' â 3 â true â
// â ' ' â 6 â false â
// â 'even' â 7 â true â
// â ' ' â 11 â false â
// â 'split' â 12 â true â
// â ' ' â 17 â false â
// â 'non' â 18 â true â
// â '-' â 21 â false â
// â 'space' â 22 â true â
// â '-' â 27 â false â
// â 'separated' â 28 â true â
// â ' ' â 37 â false â
// â 'words' â 38 â true â
// âââââââââââââââ´ââââââââ´âââââââââââââ
console.log(
[...segmenter.segment(str)].filter((s) => s.isWordLike).map((s) => s.segment),
);
// ['It', 'can', 'even', 'split', 'non', 'space', 'separated', 'words']
åèªã®åºåãæ©è½ã¯ãæåãã¼ã¹ã®è¨èªã§ãå©ç¨ã§ãã¾ããä¾ãã°ãä¸å½èªã§ã¯è¤æ°ã®æåã 1 ã¤ã®åèªã表ãã¾ããããããã®éã«ã¯ç©ºç½ãæ¿å ¥ããã¾ããããã®åºåãæ©è½ã¯ãåèªãããã«ã¯ãªãã¯ãããã¨ã§ãã©ã¦ã¶ã¼ã®æ¨æºçãªåèªåºåãæ©è½ã¨åãåä½ãçºçããã¾ãã
const segmenter = new Intl.Segmenter("zh-Hans", { granularity: "word" });
console.log([...segmenter.segment("ææ¯è¿ç¯ææ¡£çä½è
")].map((s) => s.segment));
// ['ææ¯', 'è¿', 'ç¯', 'æ', 'æ¡£', 'ç', 'ä½è
']
æã®åºåããåæ§ã«è¤éã§ããä¾ãã°ãè±èªã«ã¯æã®çµããã示ãåºåãæåãæ°å¤ãããã¾ãï¼"."ã"!"ã"?" ã¨ãã£ãå ·åã«ï¼ã
const segmenter = new Intl.Segmenter("en-US", { granularity: "sentence" });
console.log(
[...segmenter.segment("I ate a sandwich. Then I went to bed.")].map(
(s) => s.segment,
),
);
// ['I ate a sandwich. ', 'Then I went to bed.']
ãªãããã®ã»ã°ã¡ã³ã¿ã¼ã¯æåãé¤å»ãããã¨ã¯ããã¾ãããåã«æååãåºéã«åå²ããã ãã§ãããããã®åºé㯠1 ã¤ã®æã¨ãªãã¾ããå¿ è¦ã«å¿ãã¦ããã®å¾ã§å¥èªç¹ãé¤å»ãããã¨ãã§ãã¾ããã¾ããç¾å¨ã®ã»ã°ã¡ã³ã¿ã¼ã®å®è£ ã§ã¯ãæã®å岿å¶ï¼"Mr." ã "Approx." ã®ãããªããªãªãã®å¾ã«æãåå²ãããªãããã«ããæ©è½ï¼ã¯å¯¾å¿ãã¦ããªãã®ã§ããããã®æ©è½ã®å¯¾å¿ç¶æ³ã¯æ¹åããã¦ãã¾ãã
表示å
ããã»ã©å¤ãã®ãªãã·ã§ã³ãåä½ãç´¹ä»ããã¨ããã§ãããããã¦ã¼ã¶ã¼ã«ã©ã®ããã«æç¤ºããã°ãããè¿·ãããããã¾ãããIntl ã«ã¯ãã¦ã¼ã¶ã¼ã¤ã³ã¿ã¼ãã§ã¤ã¹ãæ§ç¯ããããã® 2 ã¤ã®ä¾¿å©ãª API ãç¨æããã¦ãã¾ããããã¯ãIntl.supportedValuesOf() 㨠Intl.DisplayNames ã§ãã
Intl.supportedValuesOf() 颿°ã¯ãæå®ããããªãã·ã§ã³ã«å¯¾ãã¦å¯¾å¿ãã¦ããå¤ã®é
åãè¿ãã¾ããä¾ãã°ããã®é¢æ°ã使ç¨ãããã¨ã§ãã¦ã¼ã¶ã¼ãæ¥ä»ã表示ããããã«é¸æã§ããã対å¿ãã¦ããæ¦ã®ãããããã¦ã³ãªã¹ãã使ãããã¨ãã§ãã¾ãã
const supportedCal = Intl.supportedValuesOf("calendar");
console.log(supportedCal);
// ['buddhist', 'chinese', 'coptic', 'dangi', ...]
ããããå¤ãã®å ´åããããã®èå¥åã¯ã¦ã¼ã¶ã¼ãã¬ã³ããªã¼ã§ã¯ããã¾ãããä¾ãã°ãæ¦ãã¦ã¼ã¶ã¼ã®è¨èªã§ç¤ºããããç¥èªãå±éããããããå ´åãããã¾ããIntl.DisplayNames ãªãã¸ã§ã¯ãã¯ãããããç¨éã«æçã§ããããã¯ãã©ã¼ããã¿ã¼ã«ä¼¼ã¦ãã¾ããããã³ãã¬ã¼ããã¼ã¹ã§ã¯ããã¾ããããã®ä»£ããã«ãè¨èªã«ä¾åããªãèå¥åãããã¼ã«ã©ã¤ãºãããåç§°ã¸ã®ç´æ¥çãªå¯¾å¿ä»ããè¡ãã¾ããè¨èªãå°åãæåä½ç³»ï¼BCP 47 è¨èªã¿ã°ã® 3 ã¤ã®ãµããã£ã¼ã«ãï¼ãéè²¨ãæ¦ãæ¥æãã£ã¼ã«ãã®æ¸å¼åã«å¯¾å¿ãã¦ãã¾ãã
次ã®ãã¢ã試ãã¦ã¿ã¦ãã ããã
<select id="lang"></select>
<select id="calendar"></select>
<output id="output"></output>
const langSelect = document.getElementById("lang");
const calSelect = document.getElementById("calendar");
const fieldset = document.querySelector("fieldset");
const output = document.getElementById("output");
// A few examples
const langs = [
"en-US",
"zh-Hans-CN",
"ja-JP",
"ar-EG",
"ru-RU",
"es-ES",
"fr-FR",
"de-DE",
"hi-IN",
"pt-BR",
"bn-BD",
"he-IL",
];
const calendars = Intl.supportedValuesOf("calendar");
for (const lang of langs) {
const option = document.createElement("option");
option.value = lang;
option.textContent = new Intl.DisplayNames(lang, { type: "language" }).of(
lang,
);
langSelect.appendChild(option);
}
function renderCalSelect() {
const lang = langSelect.value;
calSelect.innerHTML = "";
const dn = new Intl.DisplayNames(lang, { type: "calendar" });
const preferredCalendars = new Intl.Locale(lang).getCalendars?.() ?? [
"gregory",
];
for (const cal of [
...preferredCalendars,
...calendars.filter((c) => !preferredCalendars.includes(c)),
]) {
const option = document.createElement("option");
option.value = cal;
option.textContent = dn.of(cal);
calSelect.appendChild(option);
}
}
function renderFieldInputs() {
const lang = langSelect.value;
fieldset.querySelectorAll("label").forEach((label) => label.remove());
const dn = new Intl.DisplayNames(lang, { type: "dateTimeField" });
for (const field of fields) {
const label = document.createElement("label");
label.textContent = dn.of(field);
const input = document.createElement("input");
input.type = "checkbox";
input.value = field;
label.appendChild(input);
fieldset.appendChild(label);
}
}
function renderTime() {
const lang = langSelect.value;
const cal = calSelect.value;
const df = new Intl.DateTimeFormat(lang, {
calendar: cal,
dateStyle: "full",
timeStyle: "full",
});
const now = new Date();
const dn = new Intl.DisplayNames(lang, { type: "dateTimeField" });
output.innerHTML = "";
for (const component of df.formatToParts(now)) {
const text = document.createElement("span");
text.textContent = component.value;
if (
![
"era",
"year",
"quarter",
"month",
"weekOfYear",
"weekday",
"day",
"dayPeriod",
"hour",
"minute",
"second",
"timeZoneName",
].includes(component.type)
) {
output.appendChild(text);
continue;
}
const title = dn.of(component.type);
const field = document.createElement("ruby");
field.appendChild(text);
const rt = document.createElement("rt");
rt.textContent = title;
field.appendChild(rt);
output.appendChild(field);
}
}
renderCalSelect();
renderTime();
langSelect.addEventListener("change", renderCalSelect);
langSelect.addEventListener("change", renderTime);
calSelect.addEventListener("change", renderTime);
setInterval(renderTime, 500);