ナンバー・フォーマッター
数値をカンマ、略語、通貨記号、カスタム小数でフォーマットします。
仕組み
- 数値を入力: 数値, 整数、小数、大きな数値、または科学的表記, を入力または貼り付けます。
- フォーマットオプションを選択: ロケール(US、EUなど)、小数桁数、グループ区切り文字、必要に応じて通貨記号を選択します。
- フォーマットされた結果をコピー: 数値が選択した形式で瞬時に表示されます。レポート、ドキュメント、エクスポートで使用するためにコピーします。
なぜ数値フォーマッターを使うのか?
数値はロケールによって異なる意味を持ちます。米国は1000を1,000.00と書き、多くのヨーロッパ諸国は1.000,00と書きます。システム間で生の数値をコピーすると、解析エラー、誤読、財務エラーが発生します。数値フォーマッターは、財務レポートの準備、コンテンツのローカライゼーション、プレゼンテーション用のデータクリーンアップなど、あらゆるオーディエンスに対して数値が正しく表示されることを保証します。
機能
- ロケール対応フォーマット: 適切な小数およびグループ区切り文字を持つUS、EU、国際形式をサポート。
- 小数精度コントロール: 表示する小数桁数を正確に定義します。
- 千の区切り: ワンクリックで千の区切り文字を追加または削除します。
- 通貨フォーマット: 通貨記号をプレフィックスして、通貨値としてフォーマットします。
- 科学的表記: 非常に大きいまたは非常に小さい数値の科学的表記との変換。
よくある質問
米国とヨーロッパの数値形式の違いは?
米国では、小数区切り文字はピリオド(.)で、千の区切り文字はカンマ(,)です, 例: 1,234.56。ヨーロッパのほとんどでは、その逆です: 1.234,56。このツールは2つの形式間を正しく変換します。
通貨用に数値をフォーマットできますか?
はい。通貨モードを有効にして、フォーマットされた数値の前に追加する記号($ € £ ¥など)を選択します。負の数の慣例を持つ会計形式の場合は、会計モードを有効にします。
非常に大きいまたは非常に小さい数値を処理しますか?
はい。フォーマッターは複数桁の数値を処理し、標準、グループ化、または科学的表記でそれらを表示できます。浮動小数点精度は構成された小数に適用されます。
数値フォーマット標準の出どころ
今日ソフトウェアで見かける数値フォーマットは、30年かけて落ち着いた小さな標準のスタックによって定義されています。IEEE 754(1985年)は2008年と2019年に改訂され、バイナリ浮動小数点数のビットレイアウトを固定しました:64ビットを1符号、11指数、52仮数に分割、これがすべてのJavaScript数値の内部表現です。ISO 4217(1978年、現行版2015年)は3文字通貨コード、USD、EUR、JPY、INR、BRLと、それぞれの補助単位の数(USDは2、JPYは0、KWDは3、CLFは4)を定義しました。Unicode CLDR(Common Locale Data Repository)は2003年に初公開され、全ロケールのグループ区切り、小数点区切り、通貨記号、複数形ルールを記録するオープンデータセットです;現在のリリースはCLDR 46(2024年10月)。ECMA-402(2012年)、ECMAScript国際化APIは、JavaScriptにIntl.NumberFormatを通じてそのデータへのネイティブバインディングを与え、V8、JavaScriptCore、SpiderMonkeyのICU(International Components for Unicode)に支えられています。これら4つのスペックが組み合わさって(1234567).toLocaleString('de-DE')が1,234,567ではなく1.234.567を返すようになっています。
出会う6つのロケールパターン
野生のほとんどの数値フォーマットは6パターンに収まります。この6つを覚えれば、グローバル製品のユーザーベースの約95%をカバーできます。
- en-US、en-GB、ja-JP、zh-CN、ko-KR、コンマグループ、ピリオド小数:
1,234,567.89。 - de-DE、es-ES、it-IT、nl-NL、pt-BR、ピリオドグループ、コンマ小数:
1.234.567,89。これを米国のスプレッドシートに貼り付ける際は注意。 - fr-FR、ru-RU、sv-SE、pl-PL、狭い改行禁止スペースグループ(Unicode U+202F)、コンマ小数:
1 234 567,89。区切り文字は通常のスペースではありません;空白を正規化するシステムを通じてコピー&ペーストすると壊れます。 - de-CH、右シングルクォートグループ(U+2019)、ピリオド小数:
1’234’567.89。スイスはここで独特です。 - en-IN、hi-IN、コンマグループ、ピリオド小数、しかしグループ化は3-3-3ではなく2-2-3:
12,34,567.89。これはlakh/croreシステムを反映しています:1 lakh = 10⁵、1 crore = 10⁷。 - ar-EG、ar-SA、アラビア・インド数字(٠١٢٣٤٥٦٧٨٩)、アラビア小数U+066B、アラビア千区切りU+066C:
١٬٢٣٤٬٥٦٧٫٨٩。ほとんどのアラビア語圏の開発環境は内部でラテン数字を使い、表示時のみ切り替えます。
丸めモード、実際に何をするか
ECMA-402(2023年)はIntl.NumberFormatに9つの丸めモードを追加しました。選択は財務合計、科学レポート、税金計算を変えます。実際には3つが最も重要です。
halfExpand(デフォルト)。 2.5は3に丸まり、−2.5は−3に丸まります。これは皆が学校で学んだ丸めで、JavaScriptのデフォルトです。halfEven(銀行家丸め)。 2.5は2に、3.5は4に丸まり、タイは常に偶数桁に行きます。浮動小数点演算のためにIEEE 754で必須。米国税表、科学計算、主要会計システムで使用され、halfExpandが数百万の丸めにわたって導入する小さな系統的バイアスを除去します。trunc。 カットオフ後をすべて丸めずに切り捨て。2.9は2に、−2.9は−2に。文字通り精度を破棄したいときに使用、お金には絶対使わない。- 他の6つ(
ceil、floor、expand、halfCeil、halfFloor、halfTrunc)は送料を常に切り上げる、または税割引を常に切り捨てるなどの専門的なケースを処理します。意図的に選択し、お金やコンプライアンスが絡む場合はデフォルトを受け入れないこと。
このツールが本領を発揮する場面
- 財務レポート。スライドデッキ用に収益、経費、比率をフォーマット。聴衆の国に合わせて米国とEUのフォーマットを切り替え。
- ストアのロケールチェック。希望のフォーマットで価格を入力し、ドイツやインドの顧客向けにECサイトがレンダリングするものと一致するか確認。
- CSV準備。ピリオド小数を期待するシートにインポートする前に、ドイツの
1.234,56行を米国の1234.56に変換、またはその逆。 - インドルピーフォーマット。南アジアの聴衆向けに12,500,000を1,25,00,000(1.25 crore)に変換。ほとんどの米国製ツールはこれをしない。
- ダッシュボードのコンパクト表示。水平スペースが狭いウィジェット用に1,234,567を
1.23Mに変換。コンパクト表記もロケール対応:ドイツ語は1,23 Mio.と表示。 - 通貨記号の前置。各ロケールの正しい位置に$、€、£、¥、₹を追加、米ドルは前に、ドイツのユーロは後ろに。
- Excel科学表記エスケープ。Twitter snowflakeのような貼り付けた大きなIDは
1.23E+18に変換され精度を失います。Excelがテキストとして扱うように、貼り付ける前にグループ化と先頭アポストロフィを付けてフォーマット。
経験豊富な開発者でも陥るミス
- お金に対する浮動小数点演算。
0.1 + 0.2 === 0.30000000000000004はJavaScriptだけでなく、すべてのIEEE 754言語で。通貨は整数の補助単位(セント)として保存するか、decimal.jsのような10進ライブラリを使用。フォーマットはエラーを隠すが、修正はしない。 - ロケール文字列の素朴な解析。
parseFloat("1,234.56")は1234.56ではなく1を返します。parseFloat("1.234,56")は1.234を返します。ロケールフォーマットされた数値を解析するには、グループ区切りを取り除いてから小数点を置換、理想的にはIntl.NumberFormat(locale).formatToParts()で駆動。 - 大きな整数の精度損失。
2⁵³ − 1 = 9 007 199 254 740 991を超える整数はnumberとして保存されると静かに精度を失います。Twitter ID、Stripe ID、ブロックチェーン取引ハッシュはすべてこれを超えます。文字列として受け取るかBigIntを使用;Intl.NumberFormatはBigIntをネイティブに受け入れます。 - Stripeスタイルの補助単位。Stripeは$4.99に対して
amount: 499を送信。フォーマット前に100で(または通貨のISO 4217補助単位数で)割ります。JPY、KRW、VND、ISK、HUFは0補助単位を使用、割り算不要。 - パーセント入力は分数。
new Intl.NumberFormat('en', {style: 'percent'}).format(0.5)は0.5%ではなく50%を返します。パーセンテージとして保存している場合、フォーマット前に保存値に0.01を掛けます。 - ホットループでのNumberFormat構築。各コンストラクタ呼び出しがICUロケールデータを読み込みます。呼び出し間で単一インスタンスを再利用:キャッシュされたインスタンスでの100万回のフォーマットはV8で約60ms、毎回新規構築すると約3秒。
- 2桁の小数を持つJPY。
¥1000.00はJPYが0補助単位を持つため間違っています。JPY、KRW、VND、ISK、HUF、CLPにはminimumFractionDigits: 0, maximumFractionDigits: 0を設定。
その他のよくある質問
なぜ0.1 + 0.2は0.3にならないのか?
IEEE 754バイナリ浮動小数点が10進小数0.1を正確に保存できないからです、ちょうど10進数が1/3を正確に保存できないように。0.1に最も近い64ビットdoubleはおよそ0.1000000000000000055511151231257827021181583404541015625です。2つのそのような近似を加算すると、0.3ではなく0.30000000000000004に丸まる結果が出ます。すべてのIEEE 754言語にこの動作があります:Java、Python、C++、Swift、すべて。正確な10進演算には、整数セントまたはdecimal.js / PythonのDecimal / JavaのBigDecimalのようなライブラリを使用。
Intl.NumberFormatとtoLocaleStringの違いは?
同じエンジン、異なるエルゴノミクス。(1234.5).toLocaleString('de-DE', {style: 'currency', currency: 'EUR'})とnew Intl.NumberFormat('de-DE', {style: 'currency', currency: 'EUR'}).format(1234.5)は同じ出力を生成します。違い:Intl.NumberFormatは再利用可能なので、同じオプションで多くの数値をフォーマットするなら、一度インスタンス化してキャッシュ。toLocaleStringは呼び出しごとにコンストラクタオプションを読み、タイトループで劇的に遅い。
インドの数字システムはどう機能するか?
インド英語とヒンディー語は3-3-3ではなく2-2-3パターンで桁をグループ化します:最も右の3桁、その後2つのグループ。100,000は1,00,000と書かれ1 lakh(10⁵)と呼ばれます。10,000,000は1,00,00,000と書かれ1 crore(10⁷)と呼ばれます。Intl.NumberFormat('en-IN').format(12345678)は1,23,45,678を返します。システムはarab(10⁹)とkharab(10¹¹)まで拡張しますが、現代の使用では稀です。
このツールはどれくらい大きな数値を扱えるか?
Number.MAX_SAFE_INTEGER = 2⁵³ − 1 = 9,007,199,254,740,991まで、任意の整数は正確にラウンドトリップを生き延びます。それを超えると、精度が漏れ始めます。JSON.parse("9007199254740993")は9007199254740992を返します、最も近い表現可能なdouble。より大きな値には、BigIntリテラルとして貼り付ける(末尾にnを付けて)か、文字列として扱います。フォーマッタはどちらも受け入れます。
自分の数値はどこかに送信されるか?
いいえ。Intl.NumberFormatとロケールデータはブラウザに同梱されています;パイプライン全体がローカルで実行。DevToolsでNetworkタブを開いて数値をフォーマット、ゼロの送信リクエストが見えます。給与、収益、口座残高、またはホスト型サービスに貼り付けないデータに対して安全。