{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/what-benefit-of-intl-number-format/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"29b56d8c-fdf7-52ea-ac18-37e7a47cdf60","excerpt":"Number#toFixed や Math.round/floor/ceil を駆使して表示用の値を整形することってないでしょうか。カンマ区切りをオレオレユーティリティ関数で実装したりそういったことを実現するライブラリを探したことはないでしょうか。 ほとんどの JavaScript の実行環境にはIntlという i…","html":"<p>Number#toFixed や Math.round/floor/ceil を駆使して表示用の値を整形することってないでしょうか。カンマ区切りをオレオレユーティリティ関数で実装したりそういったことを実現するライブラリを探したことはないでしょうか。</p>\n<p>ほとんどの JavaScript の実行環境には<code>Intl</code>という i18n のためのオブジェクトが組み込まれており、その中の１つに<a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Intl.NumberFormat</a>というクラスがあります。\nオプションが色々あり、かなり便利で多機能なんですが整理された情報が少なく、身の回りで使用してる人も少ないと感じました。</p>\n<blockquote class=\"twitter-tweet\"><p lang=\"en\" dir=\"ltr\">Do you use Intl.NumberFormat?</p>&mdash; れこ (@L_e_k_o) <a href=\"https://twitter.com/L_e_k_o/status/1099975432059809792?ref_src=twsrc%5Etfw\">February 25, 2019</a></blockquote> <script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n（2019/03/04あたりに結果表示されると思います。途中経過を見る場合元ツイートに飛んでください。）\n<p>「それ自前で実装しなくても NumberFormat 使えば一発だよ」とレビューし続ける bot は人間がやるべきではないので、Intl.NumberFormat を布教するための記事を書きます。<br>\n私的ユースケースごとにまとめて紹介します。</p>\n<h2 id=\"動作環境\" style=\"position:relative;\"><a href=\"#%E5%8B%95%E4%BD%9C%E7%92%B0%E5%A2%83\" aria-label=\"動作環境 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>動作環境</h2>\n<p>さほど新しい機能でもないので、IE10 以外のブラウザ、0.12 以上の Node.js、多くのスマートフォンで Intl.NumberFormat が利用できます。<br>\n「多くの」と表記しているように使えない環境ももちろんあります。</p>\n<ul>\n<li><a href=\"https://caniuse.com/#feat=internationalization\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Can I use</a></li>\n<li><a href=\"https://kangax.github.io/compat-table/esintl/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ECMAScript Internationalisation compatibility table</a></li>\n</ul>\n<p>また、Node.js では英語以外の言語を使う場合はビルド時のオプションが影響します。<a href=\"https://nodejs.org/api/intl.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">公式のガイド</a>を確認してください。<br>\nfull-icu でビルドされてない Node.js で英語以外にも対応するには<a href=\"https://www.npmjs.com/package/full-icu\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">full-icu</a>モジュールを install し<code>node --icu-data-dir=./node_modules/full-icu</code>オプションを指定するか、環境変数<code>NODE_ICU_DATA</code>に同様の値を指定すれば OK です。わざわざ再ビルドする必要はありません。</p>\n<p>React Native に関しては<a href=\"https://github.com/facebook/react-native/issues/15382#issuecomment-320499665\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">古い Android/iOS で使えないという Issue</a>があるようです。どのバージョンからなら対応しているかというきちんとしたソースは見つけられませんでした。<br>\n代わりに簡易的な動作確認ができる Expo snack プロジェクトを作っておいたので、気になる方は下記リンクから動作確認してください。</p>\n<blockquote>\n<p>— <a href=\"https://snack.expo.io/@leko/intl.numberformat-playground\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Intl.NumberFormat playground | Snack</a></p>\n</blockquote>\n<p>ただ、仮に動かない環境があったとしても polyfill という選択肢もあります。</p>\n<h2 id=\"polyfill\" style=\"position:relative;\"><a href=\"#polyfill\" aria-label=\"polyfill permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>polyfill</h2>\n<p>サポートしてない環境でも利用したい場合は<a href=\"https://github.com/andyearnshaw/Intl.js/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">andyearnshaw/Intl.js</a>を使うか、<a href=\"https://polyfill.io/v3\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">polyfill.io</a>から polyfill を利用できます。</p>\n<p>以上で Intl.NumberFormat を利用する前提条件は整ったので、ユースケース別の紹介に移ります。</p>\n<h2 id=\"ユースケースゼロ埋め\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%BC%E3%83%AD%E5%9F%8B%E3%82%81\" aria-label=\"ユースケースゼロ埋め permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユースケース：ゼロ埋め</h2>\n<p>ゼロ埋めは、よくオレオレしがちな処理の代表格だと思います。<br>\n<code>String(num).padStart(2, '0')</code>とか<code>const zeroPad = (n, digits) => ('0'.repeat(digits) + n).slice(-digits)</code>みたいな。<br>\nNumberFormat で一撃です。<code>minimumIntegerDigits</code>で整数部の最小桁数を指定できます。桁数が足りない場合はゼロ埋めされます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> zeroPad3Digits <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> minimumIntegerDigits<span class=\"token operator\">:</span> <span class=\"token number\">3</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nzeroPad3Digits<span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '001'</span>\nzeroPad3Digits<span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">54</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '054'</span>\nzeroPad3Digits<span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '100'</span></code></pre></div>\n<h2 id=\"ユースケースカンマ区切り\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%AB%E3%83%B3%E3%83%9E%E5%8C%BA%E5%88%87%E3%82%8A\" aria-label=\"ユースケースカンマ区切り permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユースケース：カンマ区切り</h2>\n<p>桁数の多い数値をカンマ区切りで表示することはよくあると思います。<br>\nuseGrouping を ON にすることでカンマ区切りで整形できます。<br>\nデフォルトは ON なので、useGrouping に明示的に false を指定すればそのまま表示もできます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> commaFormatter <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> rawFormatter <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useGrouping<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\ncommaFormatter<span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">1234567890</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '1,234,567,890'</span>\nrawFormatter<span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">1234567890</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '1234567890'</span></code></pre></div>\n<h2 id=\"ユースケース表記\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A1%A8%E8%A8%98\" aria-label=\"ユースケース表記 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユースケース：％表記</h2>\n<p><code>0 &#x3C;= N &#x3C;= 1</code>な値を％表記にするために<code>(N * 100).toFixed(2) + '%'</code>みたいな処理をしたことないでしょうか。\nNumberFormat には<code>style</code>オプションがあり、これを<code>percent</code>に変更することで％表記になります。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> percentFormatter <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> style<span class=\"token operator\">:</span> <span class=\"token string\">'percent'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\npercentFormatter<span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.5</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 50%</span>\npercentFormatter<span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.12345</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 12%</span></code></pre></div>\n<p>小数点以下をどう扱いたいかもオプションで指定可能です。<br>\n<code>minimumFractionDigits</code>で最小桁数（足りない場合は 0 で埋める）、<code>maximumFractionDigits</code>で最大桁数（超える場合はこの桁数に収まるよう四捨五入）を指定できます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> fraction2 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'percent'</span><span class=\"token punctuation\">,</span>\n  minimumFractionDigits<span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n  maximumFractionDigits<span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nfraction2<span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '0.00%'</span>\nfraction2<span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.12345</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '12.35%'</span></code></pre></div>\n<p>また、有効数字も指定できます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'percent'</span><span class=\"token punctuation\">,</span>\n  maximumSignificantDigits<span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.1234</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '10%'</span>\n\n<span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'percent'</span><span class=\"token punctuation\">,</span>\n  maximumSignificantDigits<span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.1234</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '12%'</span>\n\n<span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'percent'</span><span class=\"token punctuation\">,</span>\n  maximumSignificantDigits<span class=\"token operator\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.1234</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '12.3%'</span></code></pre></div>\n<h2 id=\"ユースケース通貨の表記\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E9%80%9A%E8%B2%A8%E3%81%AE%E8%A1%A8%E8%A8%98\" aria-label=\"ユースケース通貨の表記 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユースケース：通貨の表記</h2>\n<p>EC や暗号通貨周りでありそうなユースケースだと思いますが、使い心地は「要件による」かなと思います。</p>\n<p><code>style</code>に<code>currency</code>を指定し、<code>currency</code>に表示したい通貨を指定し、<code>currencyDisplay</code>で表示方法を指定します。\n為替をもとに通貨の変換をしてくれるわけではなく、あくまで渡された値の表示方法を整形してくれるだけなので、難しく考えることはないと思います。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'currency'</span><span class=\"token punctuation\">,</span>\n  currency<span class=\"token operator\">:</span> <span class=\"token string\">'JPY'</span><span class=\"token punctuation\">,</span>\n  currencyDisplay<span class=\"token operator\">:</span> <span class=\"token string\">'symbol'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '¥1,000'</span>\n\n<span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'currency'</span><span class=\"token punctuation\">,</span>\n  currency<span class=\"token operator\">:</span> <span class=\"token string\">'JPY'</span><span class=\"token punctuation\">,</span>\n  currencyDisplay<span class=\"token operator\">:</span> <span class=\"token string\">'code'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => 'JPY 1,000'</span>\n\n<span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'currency'</span><span class=\"token punctuation\">,</span>\n  currency<span class=\"token operator\">:</span> <span class=\"token string\">'JPY'</span><span class=\"token punctuation\">,</span>\n  currencyDisplay<span class=\"token operator\">:</span> <span class=\"token string\">'name'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">1024</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '1,024 円'</span></code></pre></div>\n<p>currencyDisplay が<code>symbol</code>（デフォルト）の場合はどの言語でも表記は固定（通貨の記号）ですが、<code>name</code>の場合は第一引数のロケールによって表記も変わります。<br>\nまた、currencyDisplay が<code>name</code>の場合は Node.js の場合はビルド設定（もしくは full-icu モジュールの有無）の影響を受けます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'en'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'currency'</span><span class=\"token punctuation\">,</span>\n  currency<span class=\"token operator\">:</span> <span class=\"token string\">'JPY'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '¥1,000'</span>\n\n<span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'zh'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'currency'</span><span class=\"token punctuation\">,</span>\n  currency<span class=\"token operator\">:</span> <span class=\"token string\">'JPY'</span><span class=\"token punctuation\">,</span>\n  currencyDisplay<span class=\"token operator\">:</span> <span class=\"token string\">'name'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">1024</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '1,024 日元'</span>\n\n<span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ja'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'currency'</span><span class=\"token punctuation\">,</span>\n  currency<span class=\"token operator\">:</span> <span class=\"token string\">'USD'</span><span class=\"token punctuation\">,</span>\n  currencyDisplay<span class=\"token operator\">:</span> <span class=\"token string\">'name'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '1,000.00 米ドル'</span></code></pre></div>\n<p>また、カンマ区切りを OFF にすれば非カンマ区切りな値も作れます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'en'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  style<span class=\"token operator\">:</span> <span class=\"token string\">'currency'</span><span class=\"token punctuation\">,</span>\n  currency<span class=\"token operator\">:</span> <span class=\"token string\">'JPY'</span><span class=\"token punctuation\">,</span>\n  useGrouping<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => '¥1000'</span></code></pre></div>\n<h2 id=\"ユースケース単位通貨カンマや小数点を数値とは別スタイルにしたい\" style=\"position:relative;\"><a href=\"#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E5%8D%98%E4%BD%8D%E9%80%9A%E8%B2%A8%E3%82%AB%E3%83%B3%E3%83%9E%E3%82%84%E5%B0%8F%E6%95%B0%E7%82%B9%E3%82%92%E6%95%B0%E5%80%A4%E3%81%A8%E3%81%AF%E5%88%A5%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AB%E3%81%97%E3%81%9F%E3%81%84\" aria-label=\"ユースケース単位通貨カンマや小数点を数値とは別スタイルにしたい permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ユースケース：単位、通貨、％、カンマや小数点を数値とは別スタイルにしたい</h2>\n<p>さらに、デザインに合わせて<code>%</code>や通貨に色を付けたりフォント変えたりサイズ変えたいなどもあると思います。そういうときは<code>formatToParts</code>を利用できます。</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// React想定で書いてます</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">Price</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> price<span class=\"token punctuation\">,</span> locale<span class=\"token punctuation\">,</span> currency <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> formatter <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Intl<span class=\"token punctuation\">.</span>NumberFormat</span><span class=\"token punctuation\">(</span>locale<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    style<span class=\"token operator\">:</span> <span class=\"token string\">'currency'</span><span class=\"token punctuation\">,</span>\n    currency<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>symbol<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>others<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> formatter<span class=\"token punctuation\">.</span><span class=\"token function\">formatToParts</span><span class=\"token punctuation\">(</span>price<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>currency<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>symbol<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>others<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> value <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">;</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Price</span></span> <span class=\"token attr-name\">price</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token number\">1000</span><span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">locale</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token string\">'en'</span><span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">currency</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token string\">'USD'</span><span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span></code></pre></div>\n<p><html><head></head><body><iframe width=\"668\" height=\"500\" src=\"https://codesandbox.io/embed/km4z3o460v\" style=\"width:668px; height:500px; border:0; border-radius: 4px; overflow:hidden;\" sandbox=\"allow-modals allow-forms allow-popups allow-scripts allow-same-origin\"></iframe></body></html></p>\n<p><a href=\"https://codesandbox.io/s/km4z3o460v?autoresize=1&#x26;fontsize=14&#x26;hidenavigation=1&#x26;view=preview\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">デモ（codesandbox）</a></p>\n<p><code>type</code>プロパティの値は種類が豊富なので<a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/formatToParts\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">formatToParts のドキュメント</a>をご覧ください。</p>\n<h2 id=\"策定中の仕様\" style=\"position:relative;\"><a href=\"#%E7%AD%96%E5%AE%9A%E4%B8%AD%E3%81%AE%E4%BB%95%E6%A7%98\" aria-label=\"策定中の仕様 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>策定中の仕様</h2>\n<p>tc39 の<a href=\"https://github.com/tc39/proposal-unified-intl-numberformat\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">proposal-unified-intl-numberformat</a>にて NumberFormat の追加 API について議論されています。</p>\n<p>+-を常に表示する<code>signDisplay</code>や、単位（<code>m/s</code>）の表記、特定領域の表現力を増すための<code>notation</code>オプションなどが議論されています。</p>\n<h2 id=\"numberprototypetolocalestring\" style=\"position:relative;\"><a href=\"#numberprototypetolocalestring\" aria-label=\"numberprototypetolocalestring permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Number.prototype.toLocaleString</h2>\n<p>Intl.NumberFormat クラスを利用する他に、<a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Number.prototype.toLocaleString</a>というメソッドからも利用可能です。</p>\n<p>実質的には Intl.NumberFormat のコンストラクタと同じ引数を取ります。好みに合わせて使い分けるといいと思います。<br>\nインスタンス自体を別ファイルに分けて再利用したいので、個人的には Intl.NumberFormat の方をよく使います。</p>\n<h2 id=\"さいごに\" style=\"position:relative;\"><a href=\"#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB\" aria-label=\"さいごに permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>さいごに</h2>\n<p>Intl には他にも色々な Format クラスがあるのですが、自然言語に寄りすぎており言葉尻が微妙に要件と合わないってことが多く、活用しきれていません。</p>\n<p>その中でも NumberFormat クラスは「数値表現」だけにフォーカスされているので、汎用的で強力な API だと思います。使えるところではここぞとばかりに使っていきましょう！</p>","timeToRead":9,"frontmatter":{"title":"Intl.NumberFormatでゼロ埋めや％表記などの数値表現を楽に実装する","tags":["JavaScript","Node.js"],"date":"February 25, 2019","featuredImage":null}}},"pageContext":{"slug":"/what-benefit-of-intl-number-format/","previous":{"fields":{"slug":"/code-reading-of-deno-boot-process/"},"frontmatter":{"title":"Dive into Deno：プロセス起動からTypeScriptが実行されるまで","tags":["JavaScript","TypeScript","Rust","Deno"]}},"next":{"fields":{"slug":"/on-site-search-in-gatsby-with-algolia/"},"frontmatter":{"title":"Gatsby製サイトにAlgoliaのサイト内検索を実装する","tags":["Algolia","JavaScript","Node.js","Gatsby","React"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}