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__
上は、幅に負数を設定すると左詰めになるという例です。
下は、エスケープの方法です。{{ }}と重ねればいいようです。