この記事で学べること
- JavaScriptで数値を文字列に変換する全7つの方法とそれぞれの特徴
String()・toString()・テンプレートリテラルの正しい使い分け
toFixed()・toLocaleString()・Intl.NumberFormatによる数値フォーマット
- 2進数・8進数・16進数への基数変換テクニック
- NaN・Infinity・BigIntなど特殊な数値の扱い方
- 金額表示・電話番号・0埋めなど実務パターン集
- 各方法のパフォーマンス比較と最適な選択フローチャート
JavaScriptで開発をしていると、数値を文字列に変換する場面は非常に多く登場します。DOM操作でテキストを設定するとき、APIにデータを送信するとき、ローカルストレージにデータを保存するとき——あらゆる場面で数値から文字列への変換が必要になります。
しかし、JavaScriptには数値を文字列に変換する方法が複数あり、それぞれに特徴や注意点があります。String()関数、toString()メソッド、テンプレートリテラル、+ ""演算子、さらにtoFixed()やtoLocaleString()、Intl.NumberFormatなど、用途に応じた多彩な変換方法が用意されています。
この記事では、JavaScriptの数値→文字列変換について基本から応用まで完全に網羅します。各方法の構文・動作・注意点を詳しく解説し、パフォーマンス比較や実務で使えるパターン集まで、このページだけで全てが分かるガイドを目指します。
ポイント:この記事はJavaScript初心者から中級者まで幅広く対応しています。基本的な変換方法から高度なフォーマット、実務で役立つパターンまで段階的に解説していますので、目次から必要な部分にジャンプしてお読みください。
数値→文字列変換が必要な場面
まずは、JavaScriptで数値を文字列に変換する必要がある代表的な場面を確認しましょう。「なぜ変換が必要なのか」を理解することで、適切な変換方法を選択できるようになります。
DOM操作でテキストを設定するとき
HTMLのDOM要素にテキストを設定する際、数値をそのまま使える場合もありますが、明示的に文字列に変換した方が安全です。特にtextContentやinnerHTMLに値を設定するとき、意図しない型変換を防ぐことができます。
JavaScript – DOM操作での数値→文字列変換
// カウンターの値をDOM要素に表示する
const count = 42;
const element = document.getElementById('counter');
// textContentは自動変換されるが、明示的に変換するのがベストプラクティス
element.textContent = String(count); // "42"
// inputのvalueに設定する場合
const input = document.querySelector('#price-input');
input.value = String(1980); // "1980"
// data属性に数値を設定する場合
const item = document.querySelector('.product');
item.dataset.price = String(2500); // "2500"
文字列結合(メッセージ生成)
ユーザーに表示するメッセージに数値を含める場合、文字列結合が必要になります。テンプレートリテラルを使えば自然に埋め込めますが、+演算子を使う場合は意図しない動作に注意が必要です。
JavaScript – 文字列結合での数値変換
const itemCount = 5;
const totalPrice = 12800;
// テンプレートリテラル(推奨)
const message = `商品${itemCount}点、合計${totalPrice}円です`;
// → "商品5点、合計12800円です"
// + 演算子で結合する場合
const message2 = '商品' + itemCount + '点、合計' + totalPrice + '円です';
// → "商品5点、合計12800円です"
// 注意: 数値同士の + は加算になる
const bad = 5 + 3 + '円'; // "8円"(5+3=8 が先に計算される)
const good = '' + 5 + 3 + '円'; // "53円"(文字列結合になる)
API送信・JSONデータ
APIにデータを送信する際や、JSONデータを構築する際に、特定のフィールドを文字列型として送る必要がある場合があります。電話番号や郵便番号など、先頭の0が意味を持つ数値は必ず文字列として扱う必要があります。
JavaScript – API送信時の数値→文字列変換
// APIに送るデータを構築
const userId = 12345;
const zipCode = 1050001; // 本来は "105-0001"
const payload = {
user_id: String(userId), // "12345"
zip_code: String(zipCode), // "1050001"
amount: String(9800), // "9800"
};
// fetch でAPI送信
fetch('/api/order', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
フォーム処理
フォームから取得した値は常に文字列ですが、計算後に再びフォームに値を設定する場合は、数値を文字列に変換する必要があります。
JavaScript – フォーム処理での型変換
// フォームから値を取得して計算
const priceInput = document.querySelector('#price');
const quantityInput = document.querySelector('#quantity');
const totalOutput = document.querySelector('#total');
// フォームの値は文字列なので、数値に変換して計算
const price = Number(priceInput.value);
const quantity = Number(quantityInput.value);
const total = price * quantity;
// 計算結果をフォームに設定(数値→文字列)
totalOutput.value = String(total);
// 金額フォーマットして表示する場合
const display = document.querySelector('#total-display');
display.textContent = total.toLocaleString() + '円';
// → "12,800円"
ローカルストレージ・セッションストレージ
localStorageやsessionStorageは文字列しか保存できません。数値を保存する際は必ず文字列に変換する必要があります。
JavaScript – ローカルストレージでの数値保存
const score = 9850;
const level = 12;
// localStorageに保存(自動的に文字列に変換される)
localStorage.setItem('highScore', String(score));
localStorage.setItem('level', String(level));
// 取得時は文字列なので、数値に戻す
const savedScore = Number(localStorage.getItem('highScore'));
// → 9850 (number型)
// オブジェクトを保存する場合はJSON.stringifyを使う
const data = { score: 9850, level: 12, time: 180.5 };
localStorage.setItem('gameData', JSON.stringify(data));
URLパラメータ・クエリ文字列
URLのクエリパラメータに数値を含める場合も、文字列への変換が必要です。
JavaScript – URLパラメータでの数値変換
const page = 3;
const limit = 20;
const categoryId = 15;
// URLSearchParams を使う方法(推奨)
const params = new URLSearchParams({
page: String(page),
limit: String(limit),
category: String(categoryId)
});
const url = `/api/products?${params}`;
// → "/api/products?page=3&limit=20&category=15"
数値→文字列変換が必要な主な場面まとめ
- DOM操作: textContent、innerHTML、inputのvalue設定
- 文字列結合: ユーザー向けメッセージの生成
- API通信: JSONデータの構築、リクエストパラメータ
- フォーム処理: 計算結果のフォームへの反映
- ストレージ: localStorage/sessionStorageへの保存
- URL構築: クエリパラメータの設定
- ログ出力: console.logでのデバッグ表示
String() 関数で数値を文字列に変換する
String()関数は、JavaScriptで数値を文字列に変換する最も安全で汎用的な方法です。グローバル関数として提供されており、あらゆる値を文字列に変換できます。nullやundefinedに対しても安全に動作するため、値の型が不確定な場合に特に有効です。
基本構文と使い方
String()関数の基本構文は非常にシンプルです。引数に数値を渡すだけで、対応する文字列が返されます。
JavaScript – String() の基本構文
// 基本構文
String(値)
// 整数の変換
String(42); // "42"
String(0); // "0"
String(-7); // "-7"
String(100); // "100"
// 小数の変換
String(3.14); // "3.14"
String(0.001); // "0.001"
String(-2.5); // "-2.5"
// 大きな数値
String(1000000); // "1000000"
String(1e6); // "1000000"(指数表記が展開される)
String(1e20); // "100000000000000000000"
String(1e21); // "1e+21"(大きすぎると指数表記のまま)
実行結果
"42" "0" "-7" "100" "3.14" "0.001" "-2.5" "1000000" "1e+21"
null・undefined・NaN・Infinity の扱い
String()関数の大きな強みは、nullやundefinedを含むあらゆる値を安全に文字列に変換できることです。これはtoString()メソッドにはない利点です。
JavaScript – String() で特殊な値を変換
// 特殊な数値
String(NaN); // "NaN"
String(Infinity); // "Infinity"
String(-Infinity); // "-Infinity"
// null と undefined(String() の強み)
String(null); // "null"
String(undefined); // "undefined"
// ブーリアン
String(true); // "true"
String(false); // "false"
// -0(マイナスゼロ)
String(-0); // "0"(注意: マイナスが消える)
注意:String(-0)は"0"を返します。マイナスゼロを正確に文字列に変換したい場合は、Object.is(value, -0) ? "-0" : String(value)のように判定が必要です。
String() と new String() の違い
String()をnewキーワード付きで呼び出すと、プリミティブな文字列ではなくStringオブジェクトが生成されます。これは一般的には避けるべきです。
JavaScript – String() vs new String()
// String() — プリミティブ文字列を返す(推奨)
const str1 = String(42);
console.log(typeof str1); // "string"
console.log(str1); // "42"
// new String() — Stringオブジェクトを返す(非推奨)
const str2 = new String(42);
console.log(typeof str2); // "object"
console.log(str2); // String {"42"}
// 比較時に問題が発生する
String(42) === "42"; // true
new String(42) === "42"; // false(オブジェクトと文字列の比較)
new String(42) == "42"; // true(型変換が行われる)
ポイント:数値を文字列に変換する目的では、常にnewなしのString()を使いましょう。new String()はオブジェクトを生成するため、厳密等価演算子(===)での比較で意図しない結果になります。
String() の内部動作(ToString抽象操作)
String()関数は内部的にECMAScript仕様で定義されたToString抽象操作に従って変換を行います。各型ごとの変換ルールを以下の表にまとめます。
| 入力値の型 |
変換ルール |
結果の例 |
undefined |
"undefined" を返す |
"undefined" |
null |
"null" を返す |
"null" |
Boolean |
true→"true", false→"false" |
"true" |
Number |
Number::toString() を呼ぶ |
"42" |
String |
そのまま返す |
"hello" |
BigInt |
BigInt::toString() |
"42" |
Object |
toPrimitive→toString()→valueOf() |
"[object Object]" |
String() を使うべき場面
String()は以下のような場面で特に威力を発揮します。
JavaScript – String() が最適な場面
// 1. 値がnullやundefinedの可能性がある場合
function displayValue(value) {
return String(value); // null/undefined でも安全
}
displayValue(42); // "42"
displayValue(null); // "null"
displayValue(undefined); // "undefined"
// 2. 配列のmap関数で一括変換
const numbers = [1, 2, 3, 4, 5];
const strings = numbers.map(String);
// → ["1", "2", "3", "4", "5"]
// 3. 混在した配列の安全な変換
const mixed = [42, null, NaN, undefined, 0, Infinity];
const result = mixed.map(String);
// → ["42", "null", "NaN", "undefined", "0", "Infinity"]
String() の実用的なユースケース
実際の開発現場でString()が活躍する場面をさらに見ていきましょう。
JavaScript – String() の実用例
// APIレスポンスの値を安全に文字列化
function formatApiResponse(data) {
return {
id: String(data.id),
name: String(data.name),
score: String(data.score ?? 0)
};
}
// ログ出力のフォーマット
function logEntry(level, code, message) {
const timestamp = Date.now();
return [String(timestamp), String(level), String(code), message].join(' | ');
}
// switch文でのマッチング
function getStatusText(code) {
switch (String(code)) {
case '200': return 'OK';
case '404': return 'Not Found';
case '500': return 'Server Error';
default: return 'Unknown';
}
}
toString() メソッドで数値を文字列に変換する
toString()は数値型(Number)のプロトタイプに定義されたメソッドで、数値を文字列に変換します。String()との最大の違いは、基数(radix)を指定できることと、null/undefinedに対して使えないことです。
基本構文
JavaScript – toString() の基本構文
// 基本構文
数値.toString(基数)
// 基数を省略すると10進数(デフォルト)
const num = 42;
num.toString(); // "42"
// 変数を使わずリテラルから直接呼ぶ場合
(42).toString(); // "42"(括弧が必要)
42..toString(); // "42"(ドット2つでもOK)
// 各種数値
(0).toString(); // "0"
(-7).toString(); // "-7"
(3.14).toString(); // "3.14"
(1000000).toString(); // "1000000"
(1e21).toString(); // "1e+21"
注意:数値リテラルから直接toString()を呼ぶ場合、42.toString()と書くとドットが小数点と解釈されてSyntaxErrorになります。(42).toString()または42..toString()と書く必要があります。
基数指定で2進数・8進数・16進数に変換する
toString()の最大の特徴は、基数(radix)を指定して任意の進数表記の文字列に変換できることです。基数は2〜36の整数を指定できます。
JavaScript – toString() で基数変換
const num = 255;
// 2進数(binary)
num.toString(2); // "11111111"
// 8進数(octal)
num.toString(8); // "377"
// 10進数(decimal)- デフォルト
num.toString(10); // "255"
// 16進数(hexadecimal)
num.toString(16); // "ff"
// 36進数(最大)
num.toString(36); // "73"
// 色コードの例
const red = 200, green = 150, blue = 50;
const hexColor = '#' + red.toString(16).padStart(2, '0')
+ green.toString(16).padStart(2, '0')
+ blue.toString(16).padStart(2, '0');
// → "#c89632"
実行結果
255 → 2進数: "11111111"
255 → 8進数: "377"
255 → 16進数: "ff"
色コード: "#c89632"
基数変換の詳細表
よく使う基数変換の結果を一覧で確認しましょう。
| 10進数 |
2進数 |
8進数 |
16進数 |
| 0 |
0 |
0 |
0 |
| 1 |
1 |
1 |
1 |
| 7 |
111 |
7 |
7 |
| 8 |
1000 |
10 |
8 |
| 10 |
1010 |
12 |
a |
| 15 |
1111 |
17 |
f |
| 16 |
10000 |
20 |
10 |
| 100 |
1100100 |
144 |
64 |
| 255 |
11111111 |
377 |
ff |
| 256 |
100000000 |
400 |
100 |
null/undefined での TypeError
toString()はnullやundefinedに対して呼び出すとTypeErrorが発生します。これがString()との最大の違いです。
JavaScript – toString() のエラーケース
// 正常に動作するケース
(42).toString(); // "42" ✓
(NaN).toString(); // "NaN" ✓
(Infinity).toString(); // "Infinity" ✓
// エラーになるケース
let value = null;
// value.toString(); // TypeError: Cannot read properties of null
let undef;
// undef.toString(); // TypeError: Cannot read properties of undefined
// 安全に使う方法: オプショナルチェイニング
const safeStr = value?.toString() ?? '';
// → ''(nullの場合は空文字列)
// または nullish coalescing で事前チェック
const result = (value ?? 0).toString();
// → "0"(nullの場合は0を文字列化)
String() と toString() の比較まとめ
| 比較項目 |
String() |
toString() |
| 種類 |
グローバル関数 |
プロトタイプメソッド |
| null の扱い |
"null" を返す |
TypeError |
| undefined の扱い |
"undefined" を返す |
TypeError |
| 基数指定 |
不可 |
可能(2〜36) |
| 呼び出し方 |
String(value) |
value.toString() |
| 安全性 |
高い(どの値でもOK) |
低い(null/undefinedで例外) |
| 用途 |
汎用的な変換 |
基数変換が必要な場合 |
ポイント:単純に数値を文字列にするだけならString()が安全です。2進数・8進数・16進数への変換が必要な場合はtoString(radix)を使いましょう。
テンプレートリテラル(${})で数値を文字列に変換する
テンプレートリテラルはES2015(ES6)で導入された文字列記法で、バッククォート(`)で囲み、${}の中に式を埋め込むことができます。数値を文字列に変換する方法としても非常に便利で、現代のJavaScript開発で最もよく使われる方法の一つです。
基本構文と使い方
JavaScript – テンプレートリテラルの基本
// 基本構文: バッククォート + ${式}
const num = 42;
const str = `${num}`;
console.log(str); // "42"
console.log(typeof str); // "string"
// 各種数値の変換
`${0}`; // "0"
`${-7}`; // "-7"
`${3.14}`; // "3.14"
`${NaN}`; // "NaN"
`${Infinity}`; // "Infinity"
`${null}`; // "null"
`${undefined}`; // "undefined"
式の埋め込みと計算結果の変換
テンプレートリテラルの${}内には任意のJavaScript式を記述できます。計算結果が自動的に文字列に変換されます。
JavaScript – テンプレートリテラルで式を埋め込む
const price = 1980;
const tax = 0.1;
const quantity = 3;
// 計算結果を埋め込み
const total = `合計: ${price * quantity}円`;
// → "合計: 5940円"
// 税込計算
const withTax = `税込: ${Math.floor(price * (1 + tax))}円`;
// → "税込: 2178円"
// 三項演算子も使える
const stock = 0;
const status = `在庫: ${stock > 0 ? stock + '個' : 'なし'}`;
// → "在庫: なし"
// 関数呼び出し結果の埋め込み
const formatted = `価格: ${price.toLocaleString()}円`;
// → "価格: 1,980円"
複数変数の結合
テンプレートリテラルの大きな強みは、複数の変数を自然な文章の中に埋め込めることです。+演算子による結合よりもはるかに読みやすくなります。
JavaScript – テンプレートリテラルで複数変数を結合
const name = '田中';
const age = 30;
const score = 95.5;
// テンプレートリテラル(読みやすい)
const msg1 = `${name}さん(${age}歳)のスコア: ${score}点`;
// → "田中さん(30歳)のスコア: 95.5点"
// + 演算子(読みにくい)
const msg2 = name + 'さん(' + age + '歳)のスコア: ' + score + '点';
// 複数行にまたがる場合
const report = `
レポート
========
名前: ${name}
年齢: ${age}
スコア: ${score}
`;
テンプレートリテラルのパフォーマンス
テンプレートリテラルは内部的に文字列結合を行うため、パフォーマンスは+演算子とほぼ同等です。モダンなJavaScriptエンジンでは最適化されているため、パフォーマンスを理由に避ける必要はありません。
JavaScript – パフォーマンス比較
const num = 42;
// どちらもほぼ同じパフォーマンス
const a = `${num}`; // テンプレートリテラル
const b = '' + num; // + 演算子
const c = String(num); // String関数
const d = num.toString(); // toStringメソッド
// 可読性の面でテンプレートリテラルが最も推奨される
// 特に文字列の中に数値を埋め込む場合
ポイント:テンプレートリテラルは可読性が高く、式の埋め込みも可能なため、文字列の中に数値を埋め込む場面では最も推奨される方法です。単純に数値だけを文字列化する場合はString()の方が意図が明確です。
文字列結合演算子(+ "")で数値を文字列に変換する
空文字列との結合+ ""は、数値を文字列に変換する最も簡潔な方法の一つです。JavaScriptの暗黙の型変換(型強制/coercion)を利用しています。
基本構文と動作原理
JavaScript – + "" による変換
// 基本構文
const str = 42 + "";
console.log(str); // "42"
console.log(typeof str); // "string"
// 各種数値
0 + ""; // "0"
-7 + ""; // "-7"
3.14 + ""; // "3.14"
NaN + ""; // "NaN"
Infinity + ""; // "Infinity"
null + ""; // "null"
undefined + ""; // "undefined"
+ 演算子の挙動と注意点
JavaScriptの+演算子は、オペランドに文字列がある場合は文字列結合として動作し、両方が数値の場合は加算として動作します。この二面性が予期しないバグの原因になることがあります。
JavaScript – + 演算子の落とし穴
// 文字列 + 数値 = 文字列結合
"Price: " + 100; // "Price: 100"
// 数値 + 数値 + 文字列 = 加算してから結合
5 + 3 + "円"; // "8円"(5+3=8, 8+"円"="8円")
// 文字列 + 数値 + 数値 = すべて結合
"" + 5 + 3; // "53"(""+5="5", "5"+3="53")
// 予期しない結果のパターン
const a = 10, b = 20;
console.log("合計: " + a + b); // "合計: 1020" ← 期待と異なる!
console.log("合計: " + (a + b)); // "合計: 30" ← 括弧で解決
console.log(`合計: ${a + b}`); // "合計: 30" ← テンプレートリテラルが安全
注意:+ ""による変換は簡潔ですが、意図が不明確になりがちです。コードレビューの観点からは、String()やテンプレートリテラルの方が意図が明確で推奨されます。
暗黙の型変換の仕組み
+演算子で文字列結合が行われる際、JavaScriptエンジンは内部的に以下の手順で型変換を行います。
+ 演算子の型変換ステップ
- 両方のオペランドに対して
ToPrimitive()を呼ぶ
- どちらかが文字列型であれば、もう一方を
ToString()で文字列に変換し結合
- どちらも文字列でなければ、両方を
ToNumber()で数値に変換し加算
toFixed() / toPrecision() / toExponential() で数値をフォーマットする
これらのメソッドは数値を文字列に変換すると同時に、桁数を制御したフォーマットを行います。金額表示や科学的な数値表示など、表示形式を細かく指定したい場合に使います。
toFixed() — 小数点以下の桁数を指定
toFixed(digits)は小数点以下の桁数を指定して文字列に変換します。不足分は0で埋められ、超過分は四捨五入されます。
JavaScript – toFixed() の使い方
// 基本構文: 数値.toFixed(小数桁数)
const pi = 3.14159265;
pi.toFixed(0); // "3"
pi.toFixed(1); // "3.1"
pi.toFixed(2); // "3.14"
pi.toFixed(3); // "3.142"(四捨五入)
pi.toFixed(5); // "3.14159"
// 整数に対して使う(0埋め)
const num = 42;
num.toFixed(2); // "42.00"
num.toFixed(4); // "42.0000"
// 金額表示に便利
const price = 1980;
const taxRate = 0.1;
const total = price * (1 + taxRate);
total.toFixed(0); // "2178"
total.toFixed(2); // "2178.00"
注意:toFixed()の四捨五入は「銀行家の丸め(偶数丸め)」ではなく、浮動小数点の精度に依存します。例えば(1.005).toFixed(2)は"1.00"になります(期待値は"1.01")。正確な金額計算にはライブラリの使用を検討してください。
toFixed() の四捨五入の罠
JavaScript – toFixed() の四捨五入の注意点
// 浮動小数点の精度問題
(1.005).toFixed(2); // "1.00" ← 期待は "1.01"
(1.015).toFixed(2); // "1.01" ← 期待は "1.02"
(1.025).toFixed(2); // "1.02" ← 期待通り
(1.035).toFixed(2); // "1.04" ← 期待通り
// 原因: 1.005は内部的に 1.00499999... として保持されている
console.log(1.005.toPrecision(20));
// → "1.0049999999999998934"
// 正確な四捨五入の方法
function roundFixed(num, digits) {
const multiplier = 10 ** digits;
return (Math.round(num * multiplier) / multiplier).toFixed(digits);
}
roundFixed(1.005, 2); // "1.01" ← 正確!
roundFixed(1.015, 2); // "1.02" ← 正確!
toPrecision() — 有効桁数を指定
toPrecision(precision)は有効桁数を指定して数値を文字列に変換します。toFixed()が小数点以下の桁数を指定するのに対し、toPrecision()は数値全体の有効桁数を指定します。
JavaScript – toPrecision() の使い方
const num = 123.456;
num.toPrecision(1); // "1e+2"(有効1桁 → 指数表記)
num.toPrecision(2); // "1.2e+2"(有効2桁)
num.toPrecision(3); // "123"(有効3桁)
num.toPrecision(4); // "123.5"(有効4桁)
num.toPrecision(5); // "123.46"(有効5桁)
num.toPrecision(6); // "123.456"(有効6桁)
num.toPrecision(8); // "123.45600"(0埋め)
// 小さい数値
const small = 0.00456;
small.toPrecision(1); // "0.005"
small.toPrecision(2); // "0.0046"
small.toPrecision(3); // "0.00456"
toExponential() — 指数表記
toExponential(digits)は数値を指数表記(科学的記数法)の文字列に変換します。非常に大きな数や小さな数を表示する場合に使います。
JavaScript – toExponential() の使い方
const num = 123456;
num.toExponential(); // "1.23456e+5"
num.toExponential(0); // "1e+5"
num.toExponential(1); // "1.2e+5"
num.toExponential(2); // "1.23e+5"
num.toExponential(4); // "1.2346e+5"
// 小さな数値
const tiny = 0.000123;
tiny.toExponential(); // "1.23e-4"
tiny.toExponential(1); // "1.2e-4"
tiny.toExponential(4); // "1.2300e-4"
3つのメソッドの比較
| メソッド |
引数の意味 |
123.456 の例 |
主な用途 |
toFixed(2) |
小数点以下の桁数 |
"123.46" |
金額表示、価格表示 |
toPrecision(5) |
有効桁数 |
"123.46" |
科学データ、測定値 |
toExponential(2) |
仮数部の小数桁数 |
"1.23e+2" |
非常に大きい/小さい数 |
金額表示の実践例
JavaScript – toFixed() で金額表示
// 日本円(小数なし)
function formatJPY(amount) {
return '¥' + Math.round(amount).toLocaleString();
}
formatJPY(1980); // "¥1,980"
formatJPY(2178.5); // "¥2,179"
// USドル(小数2桁)
function formatUSD(amount) {
return '$' + amount.toFixed(2);
}
formatUSD(19.99); // "$19.99"
formatUSD(100); // "$100.00"
formatUSD(0.5); // "$0.50"
// パーセント表示
function formatPercent(ratio) {
return (ratio * 100).toFixed(1) + '%';
}
formatPercent(0.156); // "15.6%"
formatPercent(0.8); // "80.0%"
formatPercent(1); // "100.0%"
toLocaleString() でロケール別フォーマット
toLocaleString()は数値をロケール(地域設定)に応じた書式の文字列に変換します。桁区切りのカンマや小数点の表記が自動的にロケールに合わせて設定されるため、国際化対応の数値表示に便利です。
基本構文
JavaScript – toLocaleString() の基本
// 基本構文
数値.toLocaleString(ロケール, オプション)
const num = 1234567.89;
// ロケール省略(ブラウザのデフォルト)
num.toLocaleString();
// → "1,234,567.89"(日本語環境の場合)
// 日本語
num.toLocaleString('ja-JP');
// → "1,234,567.89"
// ドイツ語(小数点がカンマ、桁区切りがピリオド)
num.toLocaleString('de-DE');
// → "1.234.567,89"
// アラビア語(アラビア数字を使用)
num.toLocaleString('ar-EG');
// → "١٤٢٣٤٥٦٧"(環境による)
// インド(独自の桁区切り: 12,34,567.89)
num.toLocaleString('en-IN');
// → "12,34,567.89"
通貨表示
toLocaleString()の第2引数にオプションを渡すことで、通貨表示を行えます。
JavaScript – toLocaleString() で通貨表示
const amount = 1980;
// 日本円
amount.toLocaleString('ja-JP', {
style: 'currency',
currency: 'JPY'
});
// → "¥1,980"
// USドル
amount.toLocaleString('en-US', {
style: 'currency',
currency: 'USD'
});
// → "$1,980.00"
// ユーロ
amount.toLocaleString('de-DE', {
style: 'currency',
currency: 'EUR'
});
// → "1.980,00 €"
// 中国元
amount.toLocaleString('zh-CN', {
style: 'currency',
currency: 'CNY'
});
// → "¥1,980.00"
パーセント表示
JavaScript – toLocaleString() でパーセント表示
const ratio = 0.156;
ratio.toLocaleString('ja-JP', {
style: 'percent'
});
// → "16%"(四捨五入される)
ratio.toLocaleString('ja-JP', {
style: 'percent',
minimumFractionDigits: 1
});
// → "15.6%"
// 達成率など
(0.875).toLocaleString('ja-JP', {
style: 'percent',
minimumFractionDigits: 1,
maximumFractionDigits: 1
});
// → "87.5%"
桁数制御オプション
JavaScript – toLocaleString() の桁数制御
const num = 1234.5;
// 最小小数桁数
num.toLocaleString('ja-JP', {
minimumFractionDigits: 3
});
// → "1,234.500"
// 最大小数桁数
(3.14159).toLocaleString('ja-JP', {
maximumFractionDigits: 2
});
// → "3.14"
// 最小整数桁数(0埋め)
(42).toLocaleString('ja-JP', {
minimumIntegerDigits: 5
});
// → "00,042"
// 有効桁数
(123456).toLocaleString('ja-JP', {
maximumSignificantDigits: 3
});
// → "123,000"
ポイント:toLocaleString()は手軽にロケール対応のフォーマットができますが、より高度な制御が必要な場合は次のセクションで解説するIntl.NumberFormatの使用を検討してください。
Intl.NumberFormat で高度な数値フォーマット
Intl.NumberFormatはJavaScriptの国際化API(Internationalization API)の一部で、数値を各国の書式に合わせてフォーマットするための高機能なAPIです。toLocaleString()よりも細かい制御が可能で、パフォーマンスも優れています。
基本構文
JavaScript – Intl.NumberFormat の基本
// 基本構文
const formatter = new Intl.NumberFormat(ロケール, オプション);
formatter.format(数値);
// 日本語ロケール
const jpFormatter = new Intl.NumberFormat('ja-JP');
jpFormatter.format(1234567.89);
// → "1,234,567.89"
// フォーマッターを再利用できる(パフォーマンスが良い)
const numbers = [1000, 50000, 1234567];
numbers.map(n => jpFormatter.format(n));
// → ["1,000", "50,000", "1,234,567"]
通貨フォーマット
JavaScript – Intl.NumberFormat で通貨表示
// 日本円
const jpyFormat = new Intl.NumberFormat('ja-JP', {
style: 'currency',
currency: 'JPY'
});
jpyFormat.format(1980); // "¥1,980"
jpyFormat.format(50000); // "¥50,000"
jpyFormat.format(1234567); // "¥1,234,567"
// USドル
const usdFormat = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
});
usdFormat.format(19.99); // "$19.99"
usdFormat.format(1500); // "$1,500.00"
// ユーロ(ドイツ語ロケール)
const eurFormat = new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR'
});
eurFormat.format(1980); // "1.980,00 €"
// 通貨表示の名前スタイル
const longFormat = new Intl.NumberFormat('ja-JP', {
style: 'currency',
currency: 'JPY',
currencyDisplay: 'name'
});
longFormat.format(1980); // "1,980円"
パーセント・単位表示
JavaScript – Intl.NumberFormat でパーセント・単位表示
// パーセント表示
const percentFormat = new Intl.NumberFormat('ja-JP', {
style: 'percent',
minimumFractionDigits: 1,
maximumFractionDigits: 1
});
percentFormat.format(0.156); // "15.6%"
percentFormat.format(0.8); // "80.0%"
percentFormat.format(1.5); // "150.0%"
// 単位表示(ES2020+)
const kmFormat = new Intl.NumberFormat('ja-JP', {
style: 'unit',
unit: 'kilometer'
});
kmFormat.format(42.5); // "42.5 km"
const tempFormat = new Intl.NumberFormat('ja-JP', {
style: 'unit',
unit: 'celsius'
});
tempFormat.format(36.5); // "36.5°C"
const byteFormat = new Intl.NumberFormat('ja-JP', {
style: 'unit',
unit: 'megabyte'
});
byteFormat.format(256); // "256 MB"
コンパクト表記(万・億など)
JavaScript – Intl.NumberFormat でコンパクト表記
// 短いコンパクト表記
const shortFormat = new Intl.NumberFormat('ja-JP', {
notation: 'compact'
});
shortFormat.format(1500); // "1500"
shortFormat.format(15000); // "1.5万"
shortFormat.format(150000); // "15万"
shortFormat.format(1500000); // "150万"
shortFormat.format(150000000); // "1.5億"
// 英語のコンパクト表記
const enShort = new Intl.NumberFormat('en-US', {
notation: 'compact'
});
enShort.format(1500); // "1.5K"
enShort.format(1500000); // "1.5M"
enShort.format(1500000000); // "1.5B"
formatToParts() で部品ごとに取得
JavaScript – formatToParts() の使い方
const fmt = new Intl.NumberFormat('ja-JP', {
style: 'currency',
currency: 'JPY'
});
const parts = fmt.formatToParts(1980);
console.log(parts);
// [
// { type: "currency", value: "¥" },
// { type: "integer", value: "1" },
// { type: "group", value: "," },
// { type: "integer", value: "980" }
// ]
// 整数部分だけ取得
const integerPart = parts
.filter(p => p.type === 'integer' || p.type === 'group')
.map(p => p.value)
.join('');
// → "1,980"
toLocaleString() vs Intl.NumberFormat
- 単発の変換なら
toLocaleString()が手軽
- 繰り返し使う場合は
Intl.NumberFormatを生成して再利用する方がパフォーマンスが良い
formatToParts()で部品ごとに取得したい場合はIntl.NumberFormatが必要
- 実際には
toLocaleString()は内部的にIntl.NumberFormatを使っている
基数変換(2進数・8進数・16進数)を極める
プログラミングでは10進数以外の数値表現を扱う場面が多くあります。ビット演算、色コード、権限管理、ネットワークアドレスなど、基数変換は幅広い分野で活躍します。
toString() で任意の基数に変換
JavaScript – 各種基数変換
const num = 255;
// 基数2〜36を指定可能
num.toString(2); // "11111111" (2進数)
num.toString(3); // "100110" (3進数)
num.toString(8); // "377" (8進数)
num.toString(10); // "255" (10進数)
num.toString(16); // "ff" (16進数)
num.toString(36); // "73" (36進数)
// 接頭辞を付けて分かりやすくする
function toBinary(n) {
return '0b' + n.toString(2);
}
function toOctal(n) {
return '0o' + n.toString(8);
}
function toHex(n) {
return '0x' + n.toString(16);
}
toBinary(255); // "0b11111111"
toOctal(255); // "0o377"
toHex(255); // "0xff"
parseInt() との相互変換
JavaScript – 文字列→数値の基数変換(parseInt)
// parseInt(文字列, 基数) で数値に変換
parseInt('11111111', 2); // 255(2進数→10進数)
parseInt('377', 8); // 255(8進数→10進数)
parseInt('ff', 16); // 255(16進数→10進数)
// 10進数→2進数→10進数 の往復変換
const original = 42;
const binary = original.toString(2); // "101010"
const back = parseInt(binary, 2); // 42
// 16進数カラーコードの操作
const color = '#ff8800';
const r = parseInt(color.slice(1, 3), 16); // 255
const g = parseInt(color.slice(3, 5), 16); // 136
const b = parseInt(color.slice(5, 7), 16); // 0
0埋め(ゼロパディング)
JavaScript – 基数変換と0埋め
// padStart() で0埋め
function toBin8(n) {
return n.toString(2).padStart(8, '0');
}
toBin8(0); // "00000000"
toBin8(1); // "00000001"
toBin8(42); // "00101010"
toBin8(255); // "11111111"
// 16進数の0埋め(2桁)
function toHex2(n) {
return n.toString(16).padStart(2, '0');
}
toHex2(0); // "00"
toHex2(10); // "0a"
toHex2(255); // "ff"
// RGBカラーコード変換(完全版)
function rgbToHex(r, g, b) {
return '#' + [r, g, b]
.map(c => c.toString(16).padStart(2, '0'))
.join('');
}
rgbToHex(255, 136, 0); // "#ff8800"
rgbToHex(0, 128, 255); // "#0080ff"
ビット演算とビットマスク
JavaScript – ビット操作と2進数表示
// 権限管理の例
const READ = 0b0001; // 1
const WRITE = 0b0010; // 2
const EXECUTE = 0b0100; // 4
const ADMIN = 0b1000; // 8
// 権限を組み合わせる
const userPerms = READ | WRITE;
userPerms.toString(2); // "11" → padStart → "0011"
const adminPerms = READ | WRITE | EXECUTE | ADMIN;
adminPerms.toString(2); // "1111"
// 権限チェックを見やすく表示
function showPermissions(perms) {
const bits = perms.toString(2).padStart(4, '0');
return `[${bits}] A=${bits[0]} X=${bits[1]} W=${bits[2]} R=${bits[3]}`;
}
showPermissions(userPerms);
// → "[0011] A=0 X=0 W=1 R=1"
showPermissions(adminPerms);
// → "[1111] A=1 X=1 W=1 R=1"
特殊な数値の文字列変換
JavaScriptには通常の数値以外にもいくつかの特殊な値があります。これらを文字列に変換する際の挙動を正しく理解しておくことが重要です。
NaN(Not a Number)
JavaScript – NaN の文字列変換
// NaN の生成
const nan1 = NaN;
const nan2 = Number('abc');
const nan3 = 0 / 0;
const nan4 = Math.sqrt(-1);
// 全ての変換方法で "NaN" になる
String(NaN); // "NaN"
NaN.toString(); // "NaN"
`${NaN}`; // "NaN"
NaN + ""; // "NaN"
// NaN判定してからフォーマット
function safeFormat(value) {
if (Number.isNaN(value)) return 'N/A';
return String(value);
}
safeFormat(42); // "42"
safeFormat(NaN); // "N/A"
Infinity と -Infinity
JavaScript – Infinity の文字列変換
String(Infinity); // "Infinity"
String(-Infinity); // "-Infinity"
// Infinity の生成
String(1 / 0); // "Infinity"
String(Number.POSITIVE_INFINITY); // "Infinity"
String(Number.NEGATIVE_INFINITY); // "-Infinity"
// toFixed/toPrecisionはInfinityでエラー
// Infinity.toFixed(2); // RangeError
// 安全にフォーマットする
function formatNumber(value) {
if (!isFinite(value)) return '-';
return value.toFixed(2);
}
-0(マイナスゼロ)
JavaScript – -0 の文字列変換
// -0 の文字列変換ではマイナスが消える
String(-0); // "0"(!)
(-0).toString(); // "0"(!)
`${-0}`; // "0"(!)
// -0を検出して正しく変換する方法
function stringifyWithNegZero(value) {
if (Object.is(value, -0)) return '-0';
return String(value);
}
stringifyWithNegZero(-0); // "-0"
stringifyWithNegZero(0); // "0"
BigInt
JavaScript – BigInt の文字列変換
const big = 9007199254740993n;
// String() で変換
String(big); // "9007199254740993"
big.toString(); // "9007199254740993"
`${big}`; // "9007199254740993"
// 基数変換も可能
big.toString(16); // "20000000000001"
big.toString(2); // "100000000000000000000000000000000000000000000000000001"
// 注意: BigIntはtoFixed等のメソッドを持たない
// big.toFixed(2); // TypeError
// Number.MAX_SAFE_INTEGERとの比較
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
String(Number.MAX_SAFE_INTEGER); // "9007199254740991"
// Number型では精度が失われる
String(9007199254740993); // "9007199254740992"(精度喪失!)
String(9007199254740993n); // "9007199254740993"(BigIntは正確)
特殊な数値の変換結果一覧
| 値 |
String() |
toString() |
typeof |
NaN |
"NaN" |
"NaN" |
number |
Infinity |
"Infinity" |
"Infinity" |
number |
-Infinity |
"-Infinity" |
"-Infinity" |
number |
-0 |
"0" |
"0" |
number |
null |
"null" |
TypeError |
object |
undefined |
"undefined" |
TypeError |
undefined |
42n |
"42" |
"42" |
bigint |
true |
"true" |
"true" |
boolean |
false |
"false" |
"false" |
boolean |
パフォーマンス比較と使い分けガイド
数値を文字列に変換する方法はいくつもありますが、パフォーマンスには差があるのでしょうか。ここでは各方法のベンチマーク結果と、用途別の使い分けフローチャートを紹介します。
ベンチマーク結果
以下は100万回の変換を繰り返した場合の相対的なパフォーマンス比較です(環境によって結果は変わります)。
JavaScript – パフォーマンスベンチマーク
const num = 12345;
const iterations = 1000000;
// テスト関数
function benchmark(name, fn) {
const start = performance.now();
for (let i = 0; i < iterations; i++) {
fn();
}
const end = performance.now();
console.log(`${name}: ${(end - start).toFixed(2)}ms`);
}
benchmark('String()', () => String(num));
benchmark('toString()', () => num.toString());
benchmark('Template literal', () => `${num}`);
benchmark('+ ""', () => num + "");
benchmark('toFixed(0)', () => num.toFixed(0));
一般的なベンチマーク結果(参考値)
+ "": ~15ms(最速)
template literal: ~18ms
toString(): ~20ms
String(): ~22ms
toFixed(0): ~45ms(最遅)
注意:パフォーマンスの差は100万回単位でも数十ミリ秒程度です。通常のアプリケーションではこの差は無視できるため、可読性・安全性を優先して選択するのがベストプラクティスです。
用途別の使い分けフローチャート
変換方法の選び方
- 文字列の中に数値を埋め込む → テンプレートリテラル
`${num}`
- 値がnull/undefinedの可能性がある →
String(num)
- 2進数/8進数/16進数に変換したい →
num.toString(radix)
- 小数桁数を指定したい →
num.toFixed(digits)
- 通貨・パーセント表示 →
Intl.NumberFormat
- 桁区切りカンマ →
num.toLocaleString()
- 配列を一括変換 →
numbers.map(String)
- 単純に数値→文字列 →
String(num)(最も安全)
全方法の比較表
| 方法 |
構文例 |
null安全 |
基数変換 |
桁数制御 |
ロケール |
| String() |
String(42) |
✔ |
✘ |
✘ |
✘ |
| toString() |
(42).toString() |
✘ |
✔ |
✘ |
✘ |
| テンプレートリテラル |
`${42}` |
✔ |
✘ |
✘ |
✘ |
| + "" |
42 + "" |
✔ |
✘ |
✘ |
✘ |
| toFixed() |
(42).toFixed(2) |
✘ |
✘ |
✔ |
✘ |
| toPrecision() |
(42).toPrecision(4) |
✘ |
✘ |
✔ |
✘ |
| toLocaleString() |
(42).toLocaleString() |
✘ |
✘ |
✔ |
✔ |
| Intl.NumberFormat |
new Intl.NumberFormat() |
✘ |
✘ |
✔ |
✔ |
実務パターン集
ここでは実際の開発現場でよく使う数値→文字列変換のパターンを紹介します。コピー&ペーストしてすぐに使える実用的なコード集です。
金額表示(日本円)
JavaScript – 金額表示パターン
// シンプルな金額表示
function formatPrice(price) {
return '¥' + Math.floor(price).toLocaleString('ja-JP');
}
formatPrice(1980); // "¥1,980"
formatPrice(50000); // "¥50,000"
formatPrice(1234567); // "¥1,234,567"
// 税込表示付き
function formatPriceWithTax(price, taxRate = 0.1) {
const withTax = Math.floor(price * (1 + taxRate));
return `¥${withTax.toLocaleString('ja-JP')}(税込)`;
}
formatPriceWithTax(1980); // "¥2,178(税込)"
// Intl.NumberFormat版(推奨)
const jpyFormatter = new Intl.NumberFormat('ja-JP', {
style: 'currency',
currency: 'JPY'
});
jpyFormatter.format(1980); // "¥1,980"
電話番号フォーマット
JavaScript – 電話番号フォーマット
// 電話番号のフォーマット(文字列として扱う)
function formatPhone(phone) {
const str = String(phone).replace(/D/g, '');
if (str.length === 11) {
return str.replace(/^(d{3})(d{4})(d{4})$/, '$1-$2-$3');
}
if (str.length === 10) {
return str.replace(/^(d{3})(d{3})(d{4})$/, '$1-$2-$3');
}
return str;
}
formatPhone('09012345678'); // "090-1234-5678"
formatPhone('0312345678'); // "031-234-5678"
0埋め(ゼロパディング)
JavaScript – 0埋めパターン
// padStart() を使った0埋め
function zeroPad(num, width) {
return String(num).padStart(width, '0');
}
zeroPad(5, 3); // "005"
zeroPad(42, 3); // "042"
zeroPad(100, 3); // "100"
zeroPad(7, 5); // "00007"
// 連番生成
const items = Array.from({ length: 5 }, (_, i) => {
return `ITEM-${String(i + 1).padStart(4, '0')}`;
});
// → ["ITEM-0001", "ITEM-0002", "ITEM-0003", "ITEM-0004", "ITEM-0005"]
日付文字列の生成
JavaScript – 日付の数値→文字列変換
function formatDate(date) {
const y = date.getFullYear();
const m = String(date.getMonth() + 1).padStart(2, '0');
const d = String(date.getDate()).padStart(2, '0');
return `${y}-${m}-${d}`;
}
formatDate(new Date(2026, 2, 8)); // "2026-03-08"
// 時刻付き
function formatDateTime(date) {
const y = date.getFullYear();
const mo = String(date.getMonth() + 1).padStart(2, '0');
const d = String(date.getDate()).padStart(2, '0');
const h = String(date.getHours()).padStart(2, '0');
const mi = String(date.getMinutes()).padStart(2, '0');
const s = String(date.getSeconds()).padStart(2, '0');
return `${y}-${mo}-${d} ${h}:${mi}:${s}`;
}
ファイルサイズ表示
JavaScript – ファイルサイズフォーマット
function formatFileSize(bytes) {
if (bytes === 0) return '0 B';
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
const i = Math.floor(Math.log(bytes) / Math.log(1024));
const size = bytes / (1024 ** i);
return size.toFixed(i === 0 ? 0 : 1) + ' ' + units[i];
}
formatFileSize(0); // "0 B"
formatFileSize(1023); // "1023 B"
formatFileSize(1024); // "1.0 KB"
formatFileSize(1536000); // "1.5 MB"
formatFileSize(1073741824); // "1.0 GB"
CSV出力
JavaScript – CSV出力での数値→文字列変換
function toCSV(data, headers) {
const headerLine = headers.join(',');
const rows = data.map(row =>
row.map(cell => {
const str = String(cell ?? '');
// カンマや改行を含む場合はクォートで囲む
return str.includes(',') || str.includes('
')
? `"${str}"` : str;
}).join(',')
);
return [headerLine, ...rows].join('
');
}
const data = [
[1, '商品A', 1980, 3],
[2, '商品B', 3500, 1],
];
toCSV(data, ['ID', '商品名', '価格', '数量']);
// → "ID,商品名,価格,数量
1,商品A,1980,3
2,商品B,3500,1"
数値の桁区切り表示
JavaScript – 桁区切り実装パターン
// 方法1: toLocaleString()(最も簡単)
(1234567).toLocaleString(); // "1,234,567"
// 方法2: Intl.NumberFormat(再利用向け)
const fmt = new Intl.NumberFormat('ja-JP');
fmt.format(1234567); // "1,234,567"
// 方法3: 正規表現(ライブラリなし)
function addCommas(num) {
return String(num).replace(/B(?=(d{3})+(?!d))/g, ',');
}
addCommas(1234567); // "1,234,567"
addCommas(100); // "100"(3桁以下は変化なし)
addCommas(1000); // "1,000"
カウントダウンタイマー
JavaScript – タイマー表示
function formatTimer(totalSeconds) {
const hours = Math.floor(totalSeconds / 3600);
const minutes = Math.floor((totalSeconds % 3600) / 60);
const seconds = totalSeconds % 60;
const pad = n => String(n).padStart(2, '0');
return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
}
formatTimer(0); // "00:00:00"
formatTimer(65); // "00:01:05"
formatTimer(3661); // "01:01:01"
formatTimer(86399); // "23:59:59"
よくある質問(FAQ)
Q. toString()とString()はどちらを使うべきですか?
A. null/undefinedの値に使う場合はString()が安全です(null→”null”)。toString()はnullやundefinedに対して呼ぶとエラーになります。確実に数値が入っているならどちらでも構いません。コードの意図を明示するためString()を使う方がわかりやすい場合が多いです。
Q. 整数部分だけを文字列にしたい場合はどうすればよいですか?
A. まずMath.floor()やtrunc()で整数にしてからString()で変換します。例:String(Math.floor(3.7))→"3"。または(3.7).toFixed(0)→"4"(四捨五入)も使えます。用途によってtruncとfloorとtoFixedを使い分けてください。
Q. 数値をゼロ埋め(”007″のような形式)で文字列にするにはどうすればよいですか?
A. String(n).padStart(3, "0")を使います。例:String(7).padStart(3, "0")→"007"。padStart(全体の桁数, 埋める文字)で指定します。
まとめ
JavaScriptで数値を文字列に変換する方法を網羅的に解説しました。最後に、この記事のポイントを整理します。
この記事のまとめ
- 安全で汎用的な変換なら
String()を使う(null/undefinedも安全)
- 文字列への埋め込みにはテンプレートリテラル
`${num}`が最も読みやすい
- 基数変換(2進数・8進数・16進数)には
toString(radix)を使う
- 小数桁数の制御には
toFixed()を使う(四捨五入の精度に注意)
- 通貨・パーセント・単位表示には
Intl.NumberFormatが最適
- 桁区切りには
toLocaleString()が手軽
- 0埋めには
String(num).padStart(width, '0')を使う
- パフォーマンスの差はごくわずかなので、可読性と安全性を優先して選択する
ポイント:迷ったらString()を使いましょう。null/undefinedでもエラーにならず、意図も明確です。文字列に数値を埋め込む場面ではテンプレートリテラルが最も自然な書き方になります。