日付・時刻の書式指定文字列には2つの種類があります。
1つは1文字だけで成り立つ標準書式指定文字列、
もう1つは複雑な書式設定ができるカスタム書式指定文字列です。
import System;
var d : DateTime = DateTime.Now;
print(d.ToString()); //2003/07/12 10:03:01
print(d.ToString("yy MM dd hh mm ss")); //03 07 12 04 49 02
print(d.ToString("yyyy MMM ddd H mmm sss")); //2003 7 土 16 49 02
print(d.ToString("y MMMM dddd HH m s")); //3 7月 土曜日 16 49 2
print(d.ToString("D")); //2003年7月12日
print(d.ToString("d")); //2003/07/12
print(d.ToString("T")); //16:49:02
print(d.ToString("f")); //2003年7月12日 16:49
上のように色々な書式設定ができますが、
詳しくは、
標準の DateTime 書式指定文字列と
カスタム DateTime 書式指定文字列
をご覧ください。
独自のクラスについて書式を設定するには次のようにします。
fraction2.js
------------------------------------------------------------------------
import System;
import System.Globalization;
import System.Console;
//IFormattableを継承した分数クラス
class Fraction implements IFormattable {
private var a : long; //分子
private var b : long; //分母
...
function ToString(format : String, ifp : IFormatProvider) : String {
if(format == null) { //書式設定無し
if(b == 1)
return a.ToString();
else
return a + "/" + b;
}
else { //書式設定有り
if(b == 1)
return a.ToString(format);
else
return a.ToString(format) + "/" + b.ToString(format);
}
}
}
var f : Fraction = new Fraction(2, 6);
Console.WriteLine(f); // 1/3
Console.WriteLine("{0:D2}", f); // 01/03
独自クラスに
IFormattableを継承させて、
上のように
ToStringメソッドを追加します。
そうすると、一番下のように
Console.WriteLine("{0:D2}", f);
を実行すると、その引数がそのクラスだった場合、
この追加したメソッドが呼び出されます。
このとき、引数のformatという変数には、
"D2"
が入り、long(Int64)のToStringメソッドを使って上のように値を返します。
既存クラスに独自の書式設定をするときはさらに難しくなります。
ここでは、1つ1つの文字列の間にスペースを入れる書式を作りましょう。
書式指定子を"S"としたとき次のようになります。
format1.js
----------------------------------------------------------------------
import System;
import System.Globalization;
class CustomFormat implements IFormatProvider, ICustomFormatter {
function GetFormat(service : Type) : Object {
if(service.ToString() == ICustomFormatter.ToString())
return this;
else
return null;
}
function Format(format : String, arg : Object,
provider : IFormatProvider) : String {
if(format == null)
return String.Format("{0}", arg);
//書式指定子が"S"でなければ元々ある書式
if(format.charAt(0) != "S")
//ここ甘い
return arg.ToString(format, provider);
//ここからが"S"のときの処理
var str : String = arg.ToString();
var str2 : String = str.charAt(0);
for(var i = 1; i < str.Length; i++)
str2 += " " + str.charAt(i); //warningは気にしない
return str2;
}
}
print(String.Format(new CustomFormat(),
"{0:S},{1:S}", (Object[])([23456,323])));
このときの出力は、
2_3_4_5_6,__323
となります。
出力のところのFormatメソッドは、
public static function Format(IFormatProvider, String, Object[]) : String;
というプロトタイプになります。
最後の引数はObjectの配列で、これが書式化されます。
最初の引数は、
IFormatProvider, ICustomFormatter
を継承したクラスのオブジェクトになります。
あんまりよくわかってないけど、結局、Objectの配列の要素ごとにそのオブジェクトの
Formatメソッドが実行され、
最初の引数に対応する書式指定子が入ってきます。
それが"S"でなければ元々ある書式で出力され、
"S"ならスペースを入れて出力するように書きます。