QA@IT

0埋めするのにFormatを使う必要はないのでは?

22202 PV

@ITの記事「数値を右詰めや0埋めで文字列化するには?[C#、VB]」についての質問です。

記事では0埋めを行うのにFormatを使用されていますが、.NetFrameworkではStringクラスのメソッドとしてPadLeft,PadRightというものがありこのメソッドにより左に0埋めとか右に0埋めなどが可能です。計測はしていませんが専用の関数なのでこちらの方が多少なりとも処理速度は速いものと思われます。何故Formatによる方法を紹介されているのでしょうか?

回答

Insider.NET編集部のかわさきです。

数値を0埋めするために、PadLeftメソッドやPadRightメソッドを使うと、
「<数値>.ToString().PadLeft(...)」といった記述をすることになりますが、一度、数値を文字列化したものを、さらに0埋め(あるいは空白文字を追加)して文字列化するのは好ましくないと判断したため(だそう)です。また、数値が負数の場合に0埋めをしようとするとPadLeftメソッドでは思ったとおりの結果にはならないといったこともあります。恣意的ですが、以下の例をご覧ください。

int num = -12;
int num2 = 34;
Console.WriteLine(num.ToString().PadLeft(4, '0') + " and " + num2.ToString().PadLeft(4, '0'));
Console.WriteLine(num.ToString("D4") + " and " + num2.ToString("D4"));
Console.WriteLine(String.Format("{0:D4} and {1:D4}", num, num2));
Console.WriteLine($"{num:D4} and {num2:D4}");

追記:
と書いてはみたものの、PadLeft/PadRightメソッドを紹介するのもありかなと思いました。
次に改訂する機会があれば、検討いたします。

編集 履歴 (1)
  • 回答ありがとうございました。Formatだけの紹介だと0埋めはどうしてもFormatを使わなければいけないと思ってしまうと思うので合わせた形で紹介してもらうとケースバイケースが分かりやすくてよいと思います。またよろしくお願いします。 -
  • そうですね。Format以外の方法を紹介することも検討したいと思います(別記事かもしれませんが)。
    御意見ありがとうございました。今後ともよろしくお願いいたします。
    -
  • 重箱の隅的ですが、小数の場合もFormatでないと都合の悪いケースがあります(1.1を小数第三位まで表示したい場合など)。
    既に指定桁数より数値の桁数が多い場合に縮小されないケースも載せておいてもいいかもしれませんね。
    ちなみにPadLeft/PadRightは最終的にPadHelperというNativeメソッドが呼ばれるのでFormatよりも大分高速に処理されると思います。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。