せっかく作っても(まだ)使い物にならないときがあります。今日の話はSPrintfです。Cのsprintfのような書式文字列化関数です。SPrintfという名前や戻り値をStringとしている点などが本家と異なります。

まずはどこかの入門サイトにいかにもありそうなプログラムなんて書いてみます。

#console

Imports System
Imports ActiveBasic.Strings

Dim name As String
Print "名前をどうぞ";
Input name
Print SPrintf("Hello! %sさん", name)

Console.Read()

ここまではいいのです。問題は数値を引数にすることです。直接、引数に渡せないのでこんなことになります。

#console

Imports System
Imports ActiveBasic.Strings

Function MyDate$() As String
	Dim date = DateTime.Now
	MyDate$ = SPrintf("%d/%02d/%02d", New Int32(date.Year), New Int32(date.Month), New Int32(date.Day))
End Function

Print MyDate$

Console.Read()

現在、可変個引数部分は、Object型で引数を取るようになっています。そして、クラス型しかObject型に変換できないという制限がかかっています。JavaもC#もやり方は違えど、ボクシングでこんなことにならないということだけは確かです。故に、きっとそのうちなんとかなるはずと淡い期待を抱いているのですけど……。

現状では、細かい書式指定が不要なら予めStr$で文字列化しておくというのが最もスマートな方法となっています。

#console

Imports System
Imports ActiveBasic.Strings

Function MyDate2$() As String
	Dim date = DateTime.Now
	MyDate2$ = SPrintf("%s年%s月%s日", Str$(date.Year), Str$(date.Month), Str$(date.Day))
End Function

Print MyDate2$()

Console.Read()

どうにかなるのを待つより、多重定義を駆使して無理矢理何とかするコードを生成するプログラムを書こうかと考えている今日この頃です。ちなみに、現在も可変個引数が使えないことへの対処として、(書式文字列の分を除いて)引数0個から10個までの多重定義を作っています。Int64とUInt64とDoubleとStringを押さえておけばとりあえず使い物になるでしょうか。


スポンサード リンク

この記事のカテゴリ

  • ⇒ 卵が孵るのはいつでしょう