SPrintf関数

提供: AB開発Wiki
2007年11月17日 (土) 03:56時点におけるEgtra (トーク | 投稿記録)による版 (SPrintfは書式付文字列化関数……)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動検索に移動

SPrintfは、書式付文字列化関数です。各種の数値などを指定された書式で文字列へ変換します。

プロトタイプ

Function SPrintf(format As String) As String
Function SPrintf(format As String, param0 As Object) As String
Function SPrintf(format As String, param0 As Object, param1 As Object) As String
...
Function SPrintf(format As String, param0 As Object,
    param1 As Object, param2 As Object, param3 As Object,
    param4 As Object, param5 As Object, param6 As Object,
    param7 As Object, param8 As Object, param9 As Object) As String
format
出力書式文字列(後述)
paramN
変換する対象など
戻り値
書式化された文字列

使用例

現在のところラッパクラスを介して引数を渡す必要があることに注意してください。

#console
Imports ActiveBasic.Strings
Dim a[4] = [1, 10, 100, 1000, 10000] As DWord
Dim i As Long
For i = 0 To 4
    Print SPrintf("|%5u|", New System.UInt32(a[i]))
Next
Sleep(10000)

これは次のような出力になります。

|    1|
|   10|
|  100|
| 1000|
|10000|

浮動小数点数は、通常%gを用います。Str$による変換結果にも最も近いです。

#console
Imports ActiveBasic.Strings
Do
    Dim x As Double
    Input x
    Print SPrintf("x = %g", New System.Double(x))
    Print SPrintf("sin(x) = %g", New System.Double(Sin(x)))
    Print SPrintf("cos(x) = %g", New System.Double(Cos(x)))
    Print SPrintf("tan(x) = %g", New System.Double(Tan(x)))
Loop

? 3.141592
x = 3.14159
sin(x) = 6.5359e-07
cos(x) = -0.999999
tan(x) = -6.53589e-07

変換指定子の簡易一覧

整数

整数変換には、符号付十進のほか、符号無し整数の十進、八進、十六進変換があります。

#console
Imports ActiveBasic.Strings
Dim u = Nothing As Object
u = New System.UInt32(127)
Print SPrintf("%u", u)
Print SPrintf("%&o", u)
Print SPrintf("%&x", u)

出力は次のとおりとなります。

127
&o177
&h7f

浮動小数点数

浮動小数点数変換には、汎用%gのほか、指数、固定小数点、十六進指数形式が存在します。

#console
Imports ActiveBasic.Strings
Dim l = Nothing As Object
l = New System.Double(Exp(10))
Print SPrintf("%g", l)
Print SPrintf("%e", l)
Print SPrintf("%f", l)
Print SPrintf("%&a", l)

出力は次のとおりとなります。

22026.4
2.202646e+04
22026.465794
&h1.5829dcf950563p+14


出力書式文字列

出力書式文字列は、出力の書式を指定する文字列で、次のような構成になります。

%以外の文字が現れると、そのまま出力されます。

Dim s = SPrintf("132") 's = "132"

%が現れると、変換仕様 (conversion specifications)の始まりとなります。変換仕様の内容に従って引数paramNの内容が順に使用されます。

変換仕様は、%に続いて、フラグ (flag)、最小フィールド幅 (field width)、精度 (precision)、長さ修飾子 (length modifier)、変換指定子 (conversion specifier)の指定が順に並びます。ただし、変換指定子以外の使用は任意です。

フラグ

フラグは次のものがあり、複数を順不同に指定可能です。

-
最小フィールド幅に揃えるときに、左詰めにします。標準では右詰めです。
+
符号付変換で、常に符号を表示します。標準では負の値に限って符号が表示されます。
(空白)
符号付変換で、負の値でないときに、符号分の場所として1文字の空白を変換結果の前に置きます。+フラグと同時に指定すると、+が優先されます。
0
数値変換 (d, i, u, O, o, X, x, A, a, E, e, F, f, G, g)で、フィールド幅を満たすまで0を埋めるようにします。標準では空白文字で埋められます。-フラグと同時に指定した場合、この0フラグは無視されます。また、整数変換 (d, i, u, O, o, X, x)では、精度と同時に指定された場合も無視されます。
#
代替形式で変換します(後述)。
&
BASICの接頭辞を付けます。O, o変換では&O, &oを前置し、X, x, A, a変換では、&H, &hを前置します。なお、#同様、O, o, X, x変換で値が0のときにはこれら接頭辞は付きません。

代替形式は、通常変換と違い次のような違いがあります。

  • O, o変換では、頭が0で始まるようにします。
  • X, x変換では、0でない値のとき、それぞれ、0X, 0xを頭に付けます。
  • A, a, E, e, F, f, G, g変換では、小数点以降に文字が続かない場合でも小数点文字を置きます。標準では、小数点以降に数字が無い場合、小数点文字は省略されます。
    • A, a, G, g変換では、さらに小数点以下末尾の桁の0の省略を行いません。

最小フィールド幅

最小フィールド幅は、この変換が占める最小限の文字列の長さを指定する場所で、十進法の値かアスタリスク (*)を指定します。*を指定した場合、次のparamN引数からLong型の値が読み取られ、それを最小フィールド幅とします。ただし、負の値であったときは、その絶対値を最小フィールド幅とするとともに、-フラグが指定されたものとして扱われます。

変換結果の文字列の長さが最小フィールド幅より小さかった場合、最小フィールド幅を満たすよう空白文字(0フラグが適用されなかった場合)が置かれます。

「最小」フィールド幅と言うことで、結果が最小フィールド幅を超えることもあります。

#console
Imports ActiveBasic.Strings
Dim a[4] = [1, 10, 100, 1000, 10000] As DWord
Dim i As Long
For i = 0 To 4
    Print SPrintf("|%3u|", New System.UInt32(a[i]))
Next
Sleep(10000)

これは次のような出力になります。

|  1|
| 10|
|100|
|1000|
|10000|

精度

精度は、次のような意味を持ちます。ピリオド (.)の後に最小フィールド幅同様、十進数字もしくは*を書きます。

  • 浮動小数点数変換では小数点以下の桁数の指定(省略時6)
    • G, gでは、最大有効桁数の指定
  • 整数変換では最低限表示されるべき桁数(省略時1)
  • 文字列変換では最大の長さ(省略時制限無)
Dim s = SPrintf("%.15e", New System.Double(2.7182818284590452353602874713527))
'sは"2.718281828459045e+00"となる

長さ修飾子

長さ修飾子は、型に関する指定です。現在のところ整数変換にのみ使用可能で、次の指定があります。

l
QWord, Int64
h
Word, Integer
hh
Byte, SByte
j
最も大きい整数型 (uintmax_t, intmax_t): 現在のABでは、lと同じ
z
size_t, ssize_t
t
ptrdiff_t
(省略)
DWord, Long

変換指定子

paramNで与えられた引数の型や変換方法を指定します。

大文字、小文字が併記されているものは、変換結果にアルファベットが含まれるときに、大文字にするか小文字にするかという違いを持っています。

d, i
符号付整数の十進法変換
u
符号無整数の十進法変換
O, o
符号無整数の八進法変換
X, x
符号無整数の十六進法変換
E, e
浮動小数点数の十進法・指数形式変換
A, a
浮動小数点数の十進法・固定小数点数形式変換
G, g
浮動小数点数の十進法・汎用変換
F, f
浮動小数点数の十六進法・指数形式形式変換
p
ポインタ変換 (VoidPtr)
s
文字列変換 (String)
c
文字変換 (StrChar)
%
%の出力