JScript.NET  新JavaScript入門  JavaScript,Neo-Generation  DOM  WSH  掲示板  表紙
Written 7/13/03
JScript.NET
書式(2)
日付・時刻の書式
日付・時刻の書式指定文字列には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"ならスペースを入れて出力するように書きます。
書式(1), exit