命令講座 <strf関数>

Last Update : 2008/06/xx

strf関数 (HSP 3.x)

 HSP3から登場した新規の関数です。命令名の由来は、「string format」から。任意の数値をケタ揃えや16進数や小数点付き実数などの指定した文字列表記に変換する機能を持ってます。HSP2時代のstr命令に相当する機能が含まれます。

 strf ("書式指定文字列", 数値)

 ヘルプによると、書式指定文字列には『Cランタイムライブラリがサポートしているsprintfの書式をそのまま流用することができます』とあり、下のようなものがあります。

変換指定子 (型フィールド文字)
%d 数値を 符号付き10進数 に。「decimal number」(10進数)から。
%i 上と同じ。「integer」(整数)から。
%x / %X 数値を 16進数 に。「hexadecimal number」(16進数)から。
%o 数値を 8進数 に。「octal number」(8進数)から。
%u 数値を 符号なし10進数 に。「unsigned 〜」(符号なし10進数)から。
%p 数値を 16進数アドレス表記 に。
%f 数値を 実数(小数形式) に。「floating-point number」(浮動小数点数)から。
%e / %E 数値を 実数(指数形式) に。「exponential 〜」(指数)から。
%g / %G 数値を 実数 に。(「%e」 or 「%f」 で、ケタ数の少ない方)
%c 文字コード(0〜255) を文字に。「character」(文字)から。
%n strf関数の書式指定文字列で「%n」直前までのバイト数。
%s [HSP 3.2] 指定ポインタの文字列。
※符号は、数値の先頭に付ける「+」や「−」のこと

 %(パーセント)の後に付ける「フラグ」です。

フラグ文字
0 数値の前に0埋め
+ 数値の先頭に+付加
- 数値を左詰め
# 16進数の先頭に0x付加、8進数の先頭に0付加

^

サンプルソース (16進数表記・桁揃え)

 まずは数字のケタ(桁)を揃えるサンプルスクリプト。HSP2の場合は、str命令を利用しましたが、HSP3ではstr関数に変更されました。また、ケタ(桁)数を揃える処理は削除され、単純に文字列に変換する処理だけになっているため利用できません。

 HSP3で実現するには、この新規登場となるstrf関数を利用します。時刻の数値で常に2ケタで表示する時などに利用できます(→ 参照、gettime関数)。また、10進数を16進数文字列に変換することもできます(→ 参照、HSP Tips - 16進数を10進数に変換)。

;	strf関数を使って数値の桁を揃える [HSP3]

	a = 12

;	10進数で
	mes strf("%04d", a)

;	16進数で
	mes strf("%04x", a)

HSP3 strf関数 之図 (数値の桁を揃えて書式変換した文字列)

^

雑多サンプルソース

 その他、雑多なHSP3向けstrf関数のサンプルコード断片。

 まずは変換指定子「%d」。10進数文字列を表示するもので、単純な整形処理として利用します。たとえば、数値の桁(ケタ)を揃えて表示を右揃えにできます。桁が満たない場合、数値の前に半角スペースやゼロ(0)が付加されます。

//	strf関数 サンプルコード1

;	6ケタ表示になるよう数値の前を空白で埋める
	mes strf("[%6d]", 10)

;	6ケタ表示になるよう数値の前を0で埋める
	mes strf("[%06d]", 10)

;	マイナス記号も1文字分としてカウント
	mes strf("[%06d]", -10)

;	6ケタ表示になるよう数値を左に詰めて余白を用意
	mes strf("[%-6d]", 10)

;	正数値の場合、先頭にプラス記号を付加
	mes strf("[%+d]", 10)

;	負数値の場合、先頭にそのままマイナス記号を付加
	mes strf("[%+d]", -10)

 変換指定子「%x」「%X」。16進数文字列へ変換します。

//	strf関数 サンプルコード2

;	16進数変換 (英文字はすべて小文字表記)
	mes strf("[%x]", 200)

;	16進数変換 (英文字はすべて大文字表記)
	mes strf("[%X]", 200)

;	6ケタの16進数表示になるよう数値の前を半角スペースで埋める
	mes strf("[%6x]", 200)

;	6ケタの16進数表示になるよう数値の前を0で埋める
	mes strf("[%06x]", 200)

;	先頭に「0x」記号を付加
	mes strf("[%#x]", 200)

;	先頭に「0x」記号、10ケタの16進数表示になるよう0埋め
	mes strf("[%#010x]", 200)

 変換指定子「%f」。実数値文字列への変換や整形を行います。たとえば、小数点数値の四捨五入(丸め処理)です。

//	strf関数 サンプルコード3

;	小数点第3位の四捨五入
	mes strf("[%.2f]", 3.141592)

;	小数点第4位の四捨五入
	mes strf("[%.3f]", 3.141592)

;	小数点第3位の四捨五入、6ケタ表示になるよう数値の前を0埋め
	mes strf("[%06.2f]", 3.141592)

 変換指定子「%c」。文字コード(キャラクタコード)を文字に変換します。HSPに付属するドキュメント『HSP3文字列のひみつ (hsp3str.htm)』を参照してください。(→ Webdings&Wingdings、絵文字フォントの利用

//	strf関数 サンプルコード4

	mes 'A'
	mes 'z'

	mes strf("[%c]", $41)	; 文字コード'A'
	mes strf("[%c]", $5A)	; 文字コード'Z'
	mes strf("[%c]", $61)	; 文字コード'a'
	mes strf("[%c]", $7A)	; 文字コード'z'

 その他。

;	strf関数 サンプルコード5

;	16進数でいう0xFFFFFFFF
	mes strf("[%u]", -1)

;	目的不明
	dummy = strf("Let's HSP! =HSP情報サイト=%n", varptr(len))
	mes ""+len+" バイト

^

可変長パラメータ (HSP 3.2以降)

 HSP 3.2から、strf関数は書式変換として指定できるパラメータ数を1個から複数個(可変長)へと機能拡張されます。従来はstrf関数を必要のたびに呼ばなければならなかったのが、1度のstrf関数で済ませることもできるようになります。

//	HSP 3.0以降〜

;	※1行が文字数が多いのであえて2段階にしてます。
	time = strf("%2d月", gettime(1)) + strf("%2d日", gettime(2))
	time += strf(" [%02d", gettime(4)) + strf(":%02d]", gettime(5))

	mes time
//	HSP 3.2以降〜

	time = strf("%2d月%2d日 [%02d:%02d]", gettime(1), gettime(2), gettime(4), gettime(5))
	mes time

^

Copyright © 2005-2008 HSP情報サイト Let's HSP!. All rights reserved.