Logo wizaman's blog (legacy)

C#の書式指定文字列が地獄

September 3, 2017
5 min read

C#の書式指定文字列の仕様はC#独自のものであるため、色んな言語を経験していると混乱します。そして、覚えられません。多機能かもしれませんが、かえって使いにくくなっています(※個人の感想です)。

C#自体は好きな言語なのですが、数少ない気に入らない点のひとつがこのフォーマット仕様です。

例えば、

  • 10進整数を表示
  • 正の符号も表示
  • 数値は9桁(符号含め10文字)
  • ゼロパディング(ゼロ埋め)する
  • 3桁ごとにカンマ区切り

この書式をC#で実装してみます。

var format = "{0:+0,00000000;-0,00000000}";
var result1 = string.Format(format, 0);
var result2 = string.Format(format, 1280);
var result3 = string.Format(format, -1280);

ゼロパディングするだけならd9のようにd(10進数)書式を採用すればいいのですが、これはテンプレ書式であって、正の数値に対して符号を出すためにカスタム数値書式を採用すると使えなくなります。このように書式が複数のルールから成り立ち、複雑です。記述も長くなりがち。

ドキュメントがもうね、膨大すぎて読む気が起きないですよ・・・。

やりたい内容からググって逆引き的に情報探したほうが実装が早いという始末。

ちなみに、さっきの例をPythonで書くとこうなります。

format = "{:+010,}"
result1 = format.format(0)
result1 = format.format(1280)
result1 = format.format(-1280)

各条件に対応する記述が最小限ですし、記述する順序もあまり混乱しないと思います。

ドキュメントもすっきり。

Pythonの場合、波括弧で囲んだ中に書式を書くという点ではC#に似ていますが、細かい書式オプションについては、C言語のprintf()ベースになります。

C言語がとても古い言語であるということもあり、その書式が理想的かと問われれば首を傾げますが、たくさんの言語に取り入れられた実績のある仕様です。従って、ある程度共通化された文化であると言えます。しかし、この知識がC#で使えないし、C#の独自仕様は遥かに仰々しい。つらい。

どうしても多機能を実現したいなら、独自フォーマッタをクラスで定義できるようにすれば、それで十分だと思うんですよね。

基本機能はわかりやすくシンプルに。プログラミングの鉄則だと思います。