Last Update : 2008/06/xx
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」付加 |
まずは数字のケタ(桁)を揃えるゼロ埋めのサンプルソース。ちなみに、HSP2の場合は、str命令を利用して実現できましたが、HSP3では関数形式のstr関数に変更されました。あと、ケタ(桁)数を揃える処理はstr関数には存在せず、単純に整数値を文字列に変換する処理だけになってるため利用できません。HSP3で実現するには、この新規登場となるstrf関数を利用します。
// 10進数の桁を揃える value = 12 mes strf("%04d", value)
gettime関数で取得できる時刻の数値で常に2ケタで表示する時などで利用できます。たとえば、朝の7時7分のように数値が1ケタ状態の場合にstrf関数を噛ませることで常に2ケタ表示が可能です。
// 通常 [X:X] mes "["+gettime(4)+":"+gettime(5)+"]"
// 半角スペース付きの2ケタ [ X: X] mes strf("[%2d:", gettime(4)) + strf("%2d]", gettime(5))
// 0付きの2ケタ [0X:0X] mes strf("[%02d:", gettime(4)) + strf("%02d", gettime(5))
また、10進数を16進数の文字列へと変換することもできます。(→ 参照、HSP Tips - 16進数を10進数に変換)
// 16進数文字列に変換 value = 100 mes strf("%x", value) mes strf("%#x", value) ; 0x付き
その他、雑多な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進数表示になるよう半角スペース埋め mes strf("[%#10x]", 200) ; 先頭に「0x」記号、10ケタの16進数表示になるよう0埋め mes strf("[%#010x]", 200) ; 上をすべて大文字表記 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+" バイト
strf関数はHSP 3.2から、書式変換として指定できるパラメータ数を1個から複数個(可変長)へと拡張されます。従来は必要なだけstrf関数を呼ぶ必要がありましたが、1度のstrf関数で済ませることができます。(HSPLetはHSP 3.2〜の書式に対応してません)
// HSP 3.0以降〜 ; (※このページの横幅の関係でわざと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