HOWTO · JavaScript

JavaScript 等價於 Printf 或 String.Format 的函式

本教程描述了 JavaScript 中 printf() 的實際替換

本頁內容

JavaScript 沒有內建的 printf 或 String.Format 函式。若要在一般文字中插入值或運算式,請使用樣板字串;若要依地區設定格式化數字,請使用 Intl.NumberFormat;若確實需要 printf 樣式的格式指定符,則可使用 sprintf-js。console.log 會在主控台顯示值,但不會建立格式化字串。下方的樣板字串與 Intl.NumberFormat 範例已執行;提供的執行案例未包含內嵌的 sprintf-js 範例。

使用樣板字串

如果要用已知的值組成訊息,樣板字串是最簡單的選擇。用反引號括住文字,並將每個變數或運算式放在 ${...} 中。以下範例會用名稱和一個計算結果組成問候訊息。

const name = "Alice";
const age = 30;
const greeting = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(greeting);
Hello, my name is Alice and I am 30 years old.

這種方式也支援多行字串,以及 ${price * quantity} 這類運算式。產生的字串會直接呈現在原始碼中,而且不需要額外的格式化套件。開發時若要檢視或顯示值,可以使用 console.log(greeting);若要將資料傳給其他函式或儲存,則應使用 greeting 字串本身。

使用 Intl.NumberFormat 物件

格式化貨幣、百分比或其他數值時,請使用 Intl.NumberFormat。它會依照所選地區設定套用千分位分隔符號、小數格式和貨幣符號位置。這個物件用來格式化數字,不是任意文字。

const amount = 123456.789;
const formattedAmount = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD"
}).format(amount);
console.log(formattedAmount);
$123,456.79

請根據使用者的情境選擇地區設定和貨幣,不要假設每位讀者都使用美元。例如,使用 de-DE 搭配 EUR 時,歐元金額會採用德國慣例。標點格式和符號位置會因地區設定而異,因此不要自行串接貨幣符號與數字來組成金額字串。

使用 sprintf-js 套件

如果使用含有佔位符的格式字串更方便維護,可以執行 npm install sprintf-js 安裝 sprintf-js 套件,並匯入它的 sprintf 函式。%s 佔位符接受字串;%.1f 則會將數字格式化為小數點後一位。

例如,假設 name 的值是 "Bob",而 score 的值是 95.5,呼叫 sprintf("Player %s scored %.1f points", name, score) 會產生訊息 Player Bob scored 95.5 points。在 CommonJS 專案中,可透過 const sprintf = require("sprintf-js").sprintf 取得函式;在 ES 模組中,則可使用 import { sprintf } from "sprintf-js" 匯入。使用任一種匯入方式前,都必須先在專案中安裝此套件。

如果格式字串本身有用,例如需要遵循 printf 樣式的慣例,就可以使用這個套件。若訊息很短且只有幾個值,樣板字串通常更容易閱讀。請避免在 String.prototype 上新增 format 方法:修改內建原型可能與其他程式碼衝突,而使用套件或獨立的輔助函式,則能讓行為更明確。

結論

請依要格式化的值選擇合適的工具。樣板字串可將文字與變數及運算式組合起來;Intl.NumberFormat 可依地區設定呈現數值;需要 printf 樣式佔位符時,則可使用 sprintf-js。JavaScript 沒有直接對應的內建 printf 或 String.Format。使用 console.log 查看值很方便,但這與建立字串是兩回事。

常見問題

  1. JavaScript 中對應 printf 的方式是什麼?
    JavaScript 沒有內建的對應功能。一般插值可使用樣板字串;需要 printf 樣式格式指定符時,可使用 sprintf-js。

  2. 如何將數字格式化為貨幣?
    呼叫 new Intl.NumberFormat(locale, { style: "currency", currency }).format(amount),並選擇符合使用者情境的地區設定和貨幣。

  3. 樣板字串可以跨越多行嗎?
    可以。反引號內的換行會保留在產生的字串中。

  4. console.log 會像 printf 一樣格式化字串嗎?
    不會。console.log 會將值寫入主控台,方便除錯,但它不是通用的字串格式化工具。

  5. 哪種方法最快?
    目前沒有測量資料可用來比較效能。請依所需輸出選擇方法;如果格式化速度很重要,請在自己的應用程式中進行測量。