none
数値書式設定文字列 「:10」の意味について RRS feed

  • 質問

  • まだまだC#の文法については知識が者ですが、Windows Azure Platform のトレーニングキットの学習資料(ハンズオン)の指示に従ってコードを入力してAzureを勉強しています。

    そのなかで、以下のようなコードに出会いました。(Introduction to Windows Azure より)

    RowKey = string.Format("{0:10}_{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid());
    

    この中の{0:10}はDateTime型の値に対して何らかの書式設定を行っているように見えますが、「:10」の意味、これによってどのような処理が行われているかについて教えていただけるとありがたく存じます。


    使用OS: Windows 7 Professional
    2011年12月16日 3:08

回答

  • DateTime ではなく、Ticks プロパティなので Int64 です。

    おそらく、string.Format("{0:D10}_{1}", ... の誤植ではないか…と思いますが、

    • {0:10} だと、 "1" という文字と、指定された値が表示されます。たとえば、引き算の結果が 100 なら "1100" という文字列になります。
    • {0:D10} だと、十進数表記で10桁という意味になりますので、100 なら 0000000100 になります。

    詳しいことは、

    数値書式指定文字列
    http://msdn.microsoft.com/ja-jp/library/427bttx3(v=vs.80).aspx

    を確認してください。

     

    2011年12月16日 3:45
  • DateTime.MaxValueDateTime.NowはDateTime型ですが、それらのもつTicksプロパティはlong型です。long同士の引き算ですから{0}に渡されるデータ型はDateTimeではなくlong型です。一字一句きちんと読みましょう。

    さてString.Format()のドキュメントを参照すると、複合書式指定機能、標準の数値書式指定文字列、カスタム数値書式指定文字列といった記述を見つけることができると思います。

    後はそれぞれのリンク先を読むだけです。手抜きをせず、わからないことは1つ1つ調べればきちんと書かれていますので、調べる癖をつけましょう。

    2011年12月16日 3:51
  • 吉村 達二 さんこんにちは、おのでらです。

    RowKey = string.Format("{0:10}_{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid());


    この中の{0:10}はDateTime型の値に対して何らかの書式設定を行っているように見えますが、「:10」の意味、これによってどのような処理が行われているかについて教えていただけるとありがたく存じます。

    私の個人的な見解なのですが、これは記述ミスではないかと思います。

    「{0:D10}」や「{0:00}」などであれば数値書式設定として成り立ちますが、上記のコードを実行すると「DateTime.MaxValue.Ticks - DateTime.Now.Ticks」を文字列化した頭に「1」が追加されるだけでした。

    上記のコードから推測するに最低10ケタを確保したいようにも思えますが、このコードの記載者でないと真意はわからないでしょう。(コードから RowKey に割り当てるユニークな文字列を生成していることはわかりますが…)

    数値書式設定については以下のリンクが参考になるかと思います。

    この中の{0:10}はDateTime型の値に対して何らかの書式設定を行っているように見えますが

    ちなみに「DateTime.Ticks」プロパティを参照しているので DateTime ではなく long に対して処理しています。

    ※書いている間に呼び出されて時間おいたら2つも先に post されてた orz


    おのでら (http://sorceryforce.com/)
    2011年12月16日 4:10

すべての返信

  • DateTime ではなく、Ticks プロパティなので Int64 です。

    おそらく、string.Format("{0:D10}_{1}", ... の誤植ではないか…と思いますが、

    • {0:10} だと、 "1" という文字と、指定された値が表示されます。たとえば、引き算の結果が 100 なら "1100" という文字列になります。
    • {0:D10} だと、十進数表記で10桁という意味になりますので、100 なら 0000000100 になります。

    詳しいことは、

    数値書式指定文字列
    http://msdn.microsoft.com/ja-jp/library/427bttx3(v=vs.80).aspx

    を確認してください。

     

    2011年12月16日 3:45
  • DateTime.MaxValueDateTime.NowはDateTime型ですが、それらのもつTicksプロパティはlong型です。long同士の引き算ですから{0}に渡されるデータ型はDateTimeではなくlong型です。一字一句きちんと読みましょう。

    さてString.Format()のドキュメントを参照すると、複合書式指定機能、標準の数値書式指定文字列、カスタム数値書式指定文字列といった記述を見つけることができると思います。

    後はそれぞれのリンク先を読むだけです。手抜きをせず、わからないことは1つ1つ調べればきちんと書かれていますので、調べる癖をつけましょう。

    2011年12月16日 3:51
  • 吉村 達二 さんこんにちは、おのでらです。

    RowKey = string.Format("{0:10}_{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid());


    この中の{0:10}はDateTime型の値に対して何らかの書式設定を行っているように見えますが、「:10」の意味、これによってどのような処理が行われているかについて教えていただけるとありがたく存じます。

    私の個人的な見解なのですが、これは記述ミスではないかと思います。

    「{0:D10}」や「{0:00}」などであれば数値書式設定として成り立ちますが、上記のコードを実行すると「DateTime.MaxValue.Ticks - DateTime.Now.Ticks」を文字列化した頭に「1」が追加されるだけでした。

    上記のコードから推測するに最低10ケタを確保したいようにも思えますが、このコードの記載者でないと真意はわからないでしょう。(コードから RowKey に割り当てるユニークな文字列を生成していることはわかりますが…)

    数値書式設定については以下のリンクが参考になるかと思います。

    この中の{0:10}はDateTime型の値に対して何らかの書式設定を行っているように見えますが

    ちなみに「DateTime.Ticks」プロパティを参照しているので DateTime ではなく long に対して処理しています。

    ※書いている間に呼び出されて時間おいたら2つも先に post されてた orz


    おのでら (http://sorceryforce.com/)
    2011年12月16日 4:10
  • K. Takaoka さま、佐祐理 さま、おのでら さま、ご回答ありがとうございます。

    Ticks プロパティーの型についてのご説明は参考になりました。今後は、焦らず、もうすこしコードに注意を払って読み、それぞれに対応したドキュメントを慎重に読んでいこうと思います。

    トレーニングキットのサンプルプログラムはまだ作りかけで分かりませんが、ソースコードの問題の部分については、K. Takaokaさま、おのでらさまのご指摘の通り、本来は{0:D10}とすべき部分の記述ミス・誤植であると考えて読み解くと、しっくりする気がします。

    佐祐理さま。おっしゃる通りです。String.Format メソッドについては確かに調べましたが、「:10」に対応する解説文やヒントを見つけようとするあまり、いくつかリンクを踏んだものの、キーワードを探すだけの飛ばし読みで終わり、きちんと熟読していませんでした。「:10」の読み解き方についてはカスタム数値書式指定文字列の解説ページの冒頭部分の書式指定値の説明を読めば、確かにすぐに分かったはずですね。

    それに加えまして、お三方とも、有用なリンクをご提示いただき有難く思います。


    使用OS: Windows 7 Professional
    2011年12月16日 9:27