VB.NETの数値・文字列変換がTMTOWTDI過ぎる件
最近VB.NETを触る機会がありました。いろいろ忘れてるんで、ググりながらのプログラミングです。
で、単純なIntegerからStringへの変換ってどうだっけ、と検索してみたらこれがよく分からないんですよね。いや、その、検索結果はいろいろ出てくるんですよ。でも、なんだか、みんな言ってることがバラバラなんです。いったいどれが本当なんだろうか。
たとえば、次の整数numから文字列sへ変換するとして、
Dim num As Integer = 1000 Dim s As String
こんな変換方法があるようです。
s = num ' => "1000"
あー、暗黙の変換か。短いスクリプト言語ならともかく、しっかり作りこむソフトではあんまり使いたくないな。
s = Str(num) ' => " 1000"
お、大昔に何かで見たような変換関数。なるほど先頭に符号用のスペースがつくのか。
s = CStr(num) ' => "1000"
なんだか似たようなのが出てきたぞ。そうそう、CIntとかCDateとかCからはじまる変換関数シリーズってあったね。
s = CType(num, String) ' => "1000"
と思ったら、今度はそれらを一般化した汎用変換関数か。意味あるのかな。
s = Convert.ToString(num) ' => "1000"
おいおい、さらにそれを汎用変換クラスにしたものまであったぞ。
あの、言いにくいんですが、もう目的は達したんでそろそろ勘弁してもらえませんか。
s = num.ToString() ' => "1000"
えーと、すごく…オブジェクト指向です…。なんとなくRubyとかそのへんっぽい。
s = Format(num, "0") ' => "1000"
あ、これ使ったことある。C言語でいうsprintfだよね。表示桁数を指定するときとか便利。
s = String.Format("{0:D}", num) ' => "1000"
最後は文字列クラス版のFormat関数。書式指定方法が全然違うのはなぜなのだ。
ちなみに0は何番目の引数かを示して、DはデシマルのD。これもDの代わりに0による書式指定や、
s = String.Format("{0:0}", num) ' => "1000"
書式を省略した{0}なんて書き方もできる。
s = String.Format("{0}", num) ' => "1000"
いやいや、もうおなかいっぱい。
なんというか長い長いBASIC言語の歴史を全部引きずってる感じ。過去のものを廃止したりせずに全部入りになってるのはVB.NETの寛容さなのか。PerlのLarry Wallもびっくりの"There's More Than One Way To Do It."(TMTOWTDI)っぷりでした。