數字顯示契約
Intl 數字格式:精度、語系預設與不可見分隔符號
數值與在地化顯示是不同契約。Intl.NumberFormat 負責格式化數值,不會換匯、反向解析本地化輸入,也不會讓財務計算自動變正確。
內容更新: · 維護者:Hung Chi-Hsueh · 修正回報
格式化前,先保留十進位輸入精度
先將 9007199254740993.25 轉成 JavaScript Number,就會遺失精度。新版 Intl 可直接接收其精確十進位字串。工具以大數字與細小小數測試 format、formatToParts;不支援的環境直接停用,不暗中轉成 Number。貼上之前已遺失的數字無法恢復。
首版接受單筆 ASCII 十進位:可帶正負號、1–100 位整數,及可選的小數點後 1–20 位小數。空白不是零。拒絕空白字元、分組符號、本地化數字、指數、NaN、Infinity、貨幣與百分號。前導零可作為數值拼法輸入,但不當成識別碼保留。
查看實際採用的小數位預設
精確輸入不代表所有數字都必須出現在輸出。小數位限制可能捨入顯示結果,輸入保持不變。貨幣原生預設通常不同:JPY 為零位、USD 兩位、KWD 三位。附來源的貨幣清單不覆寫瀏覽器貨幣資料;應檢查 resolvedOptions,不要假設所有貨幣都有兩位小數。
百分比輸入是比例:0.125 表示 12.5%。原生百分比預設可能捨入成 13%;自訂最少 0、最多 2 位,可保留 12.5%。工具不會先除以 100。自訂小數位限 0–20,最少不可大於最多;這是產品範圍,不是平台完整上限。依語系不同,會計格式可能用括號顯示負值。
要求語系後,再檢查實際解析結果
語系與貨幣應分別指定。locale 不會選匯率,也不翻譯頁面。工具規範化明確的 BCP 47 標籤,使用 lookup 比對檢查 supportedLocalesOf,並逐列回報不支援與重複語系,不以瀏覽器預設取代。受支援的地區要求仍可能解析到較一般的語系資料。不相關的 Unicode extension 可能被忽略;請比較要求標籤、實際 locale 與 numberingSystem。
不同瀏覽器及執行環境的語系資料,可能改變分隔符號、貨幣符號與用詞。預覽只代表目前環境,不保證跨瀏覽器位元組相同。Web 平台無法可靠提供 ICU/CLDR 版本,因此工具不捏造版本資訊。複製後仍須在目標瀏覽器與伺服器驗證;JavaScript 範例使用十進位字串,要求環境支援精確字串格式化。
複製原始字元,查看有註解的格式拆解
法文分組可能包含 U+202F 窄不換行空白,貨幣或百分比格式也可能包含 U+00A0 不換行空白。由右至左的格式可能含有必要方向控制。不要只因看起來相似,就替換成一般空白。
formatToParts 回傳依序排列的 token,原始 value 串接後等於格式化結果。拆解表會以跳脫形式顯示空白/控制字元,列出碼位與部分名稱;這些註解不會插入複製結果。輸入僅留頁面記憶體,不上傳、不保存,也不放入網址。複製結果或程式碼會將內容送到你的剪貼簿,分享前應先檢查。
new Intl.NumberFormat("en-US", { maximumFractionDigits: 2 }).format("9007199254740993.25");
// 9,007,199,254,740,993.25
new Intl.NumberFormat("en-US", { style: "percent", maximumFractionDigits: 2 }).format("0.125");
// 12.5%資料可信度