JScript.NET  新JavaScript入門  JavaScript,Neo-Generation  DOM  WSH  掲示板  表紙
Written 6/25/03
JScript.NET
書式(1)
JScriptにはCのprintfやVBのFormatような書式をつける機能がなく、 仕方なく自作をしていたものでした。
    print(myformat(100, 5) + myformat(200, 5));
    
    //右詰めでn桁にする
    function myformat(x, n) {
        var str = x + "";
        //桁が足りない分、左にスペースを入れる
        for(var i = str.length; i < n; i++)
            str = " " + str;
        return str;
    }
 
次のように5桁ずつになって表示されます。
    __100__200
 
_はスペースを表します。
以下のように、 .NET Frameworkのライブラリを使えばこのようなことはいらなくなります。
整数の書式
数値オブジェクトにToStringメソッドを 使うと文字列に変換できますが、 以下のように引数に書式指定子 と呼ばれる文字を使うことで書式が指定できます。
    var n : int = 31;
    print(n.ToString());          //31
    print(n.ToString("D"));       //31 10進数
    print(n.ToString("X"));       //1F 16進数(大文字)
    print(n.ToString("x"));       //1f 16進数(小文字)
 
これらの書式は、整数型以外で使うと例外が投げられます。
実数の書式
    var f : double = 0.012271846303;
    var g : double = 0.000012271846303;
    print(f.ToString("F"));       //0.01               小数
    print(f.ToString("E"));       //1.227185E-002      指数(大文字)
    print(f.ToString("e"));       //1.227185e-002      指数(小文字)
    print(f.ToString("G"));       //0.012271846303     一般
    print(g.ToString("G"));       //1.2271846303E-05   一般(大文字)
    print(g.ToString("g"));       //1.2271846303e-05   一般(小文字)
 
"G"は小数か指数か、文字列の長さが短くなるほうで表示されます。
各書式で精度を指定することができますが、 デフォルトの小数点以下の桁数は以下の通りです。
"F"を指定したときは2桁です。
"E"を指定したときは6桁です。
"G"を指定したときは有効桁数いっぱいまで使われますが、 末尾の0は削除されます。
  var h : double = 0.000012;
  print(h.ToString("G"));     //1.2E-05
 
その他に次のものもあります。
    var f : double = 0.012271846303;
    var a : double = 1227184.6303;
    print(f.ToString("P"));       //1.23%          パーセント
    print(a.ToString("N"));       //1,227,184.63   数値(3桁ごとにカンマ)
    print(a.ToString("C"));       //\1,227,185     通貨(地域ごとに違う)
 
ラウンドトリップという特殊なものもあります。
これは、数値と文字列に変換してさらに数値に変換したときに、 元と同じ数値になることを保障するためのものです。
例えば、
    var r : float = 0.14555555;
    print(r.ToString());             //0.1455556
    var p = float(r.ToString());     //変換+逆変換
    print(r - p);                    //-4.470348358154297e-8
 
というように変換して逆変換すると違う数値になってしまいます。
これを避けるようにするために次のようにします。
    var r : float = 0.14555555;
    print(r.ToString("R"));         //0.145555556
    var q = float(r.ToString("R")); //変換+逆変換
    print(r - q);                   //0
 
このように元の数値に戻ります。
精度の指定
書式指定子の後に整数を書くとそれが精度になります。
    var n : int = 31;
    var a : double = 1227184.6303;
    print(n.ToString("D5"));        //00031
    print(a.ToString("E"));         //1.227185E+006
    print(a.ToString("E7"));        //1.2271846E+006
    print(a.ToString("F7"));        //1227184.6303000
 
整数の場合はその桁になるまで0で埋めます。
実数の場合は小数点以下の桁がそれになります。
さらに複雑な書式の指定
String.Formatメソッドや Console.Writeメソッドを使うと、 さらに複雑な書式指定を行うことができます。
    import System;
    import System.Console;
    
    var x : double = 100.2;
    var y : double = -230.574;
    print(String.Format("{1,14:E5}{0,14:E5}{1,14:E5}", x, y));
    Console.WriteLine("{1,14:E5}{0,14:E5}{1,14:E5}", x, y);
 
最後とその前の行の出力はともに、
    _-2.30574E+002__1.00200E+002_-2.30574E+002
 
となります。
{}の中の最初の整数がその後の何番目の引数を書式化するかを表しています。 すなわち、{1,14:E5}はyを書式化します。 その次の整数が書式化された数値の幅、 書式指定子の後の整数が小数点以下の桁数です。
もう少しだけ例を挙げます。
    Console.WriteLine("{0,-5:D3}", 31);              //031__
    Console.WriteLine("{{0,-5:D3}}{0,-5:D3}", 31);   //{0,-5:D3}031__
 
上は、幅に負数を設定すると左詰めになるという例です。
下は、エスケープの方法です。{{ }}と重ねればいいようです。
書式(2), exit