JavaScriptのtoLocaleStringメソッドについて調べてみた

(今回のエントリーは元々、前回(JavaScriptの数値をカンマ区切りにする最も簡単な方法 | while(isプログラマ))の後半に記述していた内容ですが、タイトルとは少しかけ離れた内容となり、別のエントリーにしたほうがいいような気がしたので分けました)

toLocaleStringというメソッドを知ったのはつい最近なのですが、その時は(toLocaleString? toStringなら知ってるけど、toLocaleStringって何だ?)と思いました。調べてみると、JavaScriptのオブジェクトには全て(意図的にprototype.toLocaleStringをundefined等にする場合をのぞいて)、toLocaleStringメソッドが存在しているようで、たいがいのオブジェクトではただたんにtoStringメソッドを呼ぶメソッドとなっているようです(参考:toLocaleStringメソッド – Objectクラス – JavaScript入門)。

({}).toString(); //=> "[object Object]"
({}).toLocaleString(); //=> "[object Object]"

([1,2,3]).toString(); //=> "1,2,3"
([1,2,3]).toLocaleString(); //=> "1,2,3"

// テスト用オブジェクト
function Test(){};
Test.prototype.toString = function(){ return "テスト用オブジェクト" };
var test = new Test();
test.toString(); //=> "テスト用オブジェクト"
test.toLocaleString(); //=> "テスト用オブジェクト"

Test.prototype.toLocaleString = function(){ return "テスト用オブジェクト-ロケール" };
test.toString(); //=> "テスト用オブジェクト"
test.toLocaleString(); //=> "テスト用オブジェクト-ロケール"

どうやら、NumberオブジェクトとDateオブジェクトではtoStringとtoLocaleStringで別の結果を返すようです。ただ、DateオブジェクトのtoLocaleString()はChromeとIEでは別々の値を返しました

(new Date).toString(); //ChromeでもIEでも、"Sat Nov 08 2014 22:58:57 GMT+0900 (東京 (標準時))"
(new Date).toLocaleString(); // Chromeの場合"2014/11/8 22:58:58"、IEの場合"2014年11月8日 22:58:58"

もう少し調べて見ると、このtoLocaleStringメソッドは第一引数にロケール指定の文字列、第二引数にオプションを指定することがきるらしく、時刻の出力表記を変更する場合は下記のようにするといいようです(以下、出力例はChromeで実行した結果)。

// 現在時間を英語表記
(new Date).toLocaleString("en-US"); //=> "11/8/2014, 11:08:52 PM"
// 現在時間を午前・午後表記
(new Date).toLocaleString("ja-JP",{hour12:true}); //=> "2014/11/8 午後11:12:46"
// 協定世界時
(new Date()).toLocaleString("en-US", {timeZone:"UTC"}); //=> "11/8/2014, 2:13:49 PM"

参考:Date.prototype.toLocaleString() – JavaScript | MDN

もちろん、Numberオブジェクトでもいろいろな指定ができるよう。

var num = 123456789;
// ドイツ語表記
num.toLocaleString("de"); //=> "123.456.789"
// アラビア語表記
num.toLocaleString('ar-SA'); //=> "١٢٣٬٤٥٦٬٧٨٩"
// 円表記
num.toLocaleString('ja-JP', {"style":"currency", "currency":"JPY"}); //=> "¥123,456,789"
// 小数点第3桁まで記述
num.toLocaleString("ja-JP", {minimumFractionDigits:3}); //=> "123,456,789.000"
(12345.6789).toLocaleString("ja-JP",  {minimumFractionDigits:3}); //=> "12,345.679"
// 小数点第3桁で丸める
num.toLocaleString("ja-JP",  {maximumFractionDigits:3}); //=> "123,456,789"
(12345.6789).toLocaleString("ja-JP",  {maximumFractionDigits:3}); //=> "12,345.679"
// 漢字表記のカンマ付無し
num.toLocaleString('zh-Hans-CN-u-nu-hanidec', {useGrouping:false}); //=> "一二三四五六七八九"

参考:Number.prototype.toLocaleString() – JavaScript | MDN

第一引数については、下記ページが参考になるかも。
ロケール ID (LCID) の一覧

ただし、この引数の指定自体は最近のブラウザでしか指定できないようで、IEは11、Chromeは24、Firefoxは29からサポートしており、Safariではそもそもサポートしていないようです。

コメント

タイトルとURLをコピーしました