PrintFormat 関数
設定したフォーマットでターミナルのエキスパートタブへメッセージを出力します。
printf関数は PrintFormat関数を省略して書いた関数で同様の処理をします。printf関数の先頭は小文字であることにご注意ください。
PrintFormat関数は、ストラテジーテスターの最適化では機能しません。
データ型と構成・戻り値
void PrintFormat(①,…);
void printf(①,…); //こちらの書き方でもOK
戻り値は無し。
引数 [1~64]
PrintFormat関数は 1個以上 64個以下の引数で構成されますが、通常は前の引数でフォーマットを決定して、その次の引数にデータが入るので 2個以上になります。1個でもエラーにはなりません。
番 号 | 引数名 | データ型 | 単位 | 初期値 | 説明 |
---|---|---|---|---|---|
① | format_string | string | - | - | フォーマットを指定します。文字列と結合させての指定もできます。使用例を参考にしてください。 |
… | argument | - | - | - | データをカンマ(,)区切りで①を含めて最大 64個まで出力することができます。 |
「format_string」のフォーマット形式は次のとおり先頭に %を付けて①~⑤を設定します。
%①[flags]②[width]③[.precision]④[{h | l | ll | I32 | I64}]⑤type
⑤type は必須です。
パラメータの数、順序、およびタイプは、修飾子のセットと正確に一致する必要があります。そうでない場合、出力結果は未定義です。
フォーマット文字列の後にパラメータが続く場合、この文字列には、これらのパラメータの出力フォーマットを示すフォーマット仕様が含まれている必要があります。
フォーマットの指定は常にパーセント記号(%)で始まります。
書式文字列は左から右に読み取られます。最初のフォーマット仕様が存在する場合、フォーマット文字列の後の最初のパラメーターの値が変換され、事前設定された仕様に従って出力されます。
2番目の書式仕様は、2番目のパラメータの変換と出力を呼び出し、書式文字列が終了するまで同様に続きます。
形式指定の各フィールドは、単純な記号か、単純な形式オプションを示す数値です。最も単純な形式指定には、パーセント記号(%)と、出力パラメーターのタイプを定義する記号(%s など)のみが含まれます。
フォーマット文字列でパーセント記号を出力する必要がある場合は、フォーマット仕様 %%を使用します。
①[flags]
Flag | 説明 | デフォルトの動作 |
---|---|---|
– (マイナス) | 設定幅内左詰め | 右揃え |
+ (プラス) | 符号型の値に対する + または - 符号の出力 | 符号は、値が負の場合にのみ表示されます |
0 (ゼロ) | プリセット幅内の出力値の前にゼロが追加されます。0フラグが整数形式( i 、u 、x 、X 、o 、d )で指定され、精度指定が設定されている場合(たとえば、%04.d)、0は無視されます。 | 何も追加されていません |
スペース | 出力値が符号で正の値の場合、出力値の前にスペースが表示されます。 | スペースは挿入されません |
# | フォーマットo 、xまたは Xと一緒に使用すると、出力値の前に 0、0x または 0X がそれぞれ追加されます。 | 何も追加されていません |
# | e 、E 、a または Aの形式と一緒に使用する場合、 valueは常に小数点付きで表示されます。 | 小数点は、ゼロ以外の小数部分がある場合にのみ表示されます。 |
# | 形式 gまたは Gと一緒に使用する場合、flagは出力値に小数点が存在することを定義し、先頭のゼロが切り捨てられるのを防ぎます。 フラグ #は、フォーマット c 、d 、i 、u 、s と一緒に使用すると無視されます。 | 小数点は、ゼロ以外の小数部分がある場合にのみ表示されます。先頭のゼロは切り捨てられます。 |
②[width]
フォーマットされた値の出力シンボルの最小数を設定する正数の 10進数。
出力シンボルの数が指定された幅よりも少ない場合、対応する数のスペースが、-フラグ(flag)に応じて左または右から追加されます。flag 0(ゼロ)がある場合、対応する数の 0が出力値の前に追加されます。
出力シンボルの数が指定された幅よりも大きい場合、出力値がカットされることはありません。
widthにアスタリスク(*)を指定した場合、渡されるパラメーターのリストの対応する場所に int型の値を指定する必要があります。出力値の幅を指定するために使用されます。
③[.precision]
出力精度(小数点以下の桁数)を設定する正数の 10進数。幅指定とは異なり、精度指定は端数型の部分を丸めの有無にかかわらず切り取ることができます。
精度仕様の使用は、フォーマットタイプによって異なります。
Types | 説明 | デフォルトの動作 |
---|---|---|
a, A | 精度指定は、小数点以下の桁数を設定します。 | デフォルトの精度:6桁 |
c, C | 使用できません。 | |
d, i, u, o, x, X | 出力桁数の最小値を設定します。対応するパラメータの桁数がこの精度よりも小さい場合、出力値の左側にゼロが追加されます。出力桁数が指定精度よりも大きい場合、出力値は切り捨てられません。 | デフォルトの精度:1桁 |
e, E, f | 小数点以下の出力桁数を設定します。下 1桁は四捨五入。 | デフォルトの精度:6桁。設定された精度が 0または小数部がない場合、小数点は表示されません。 |
g, G | 意味のある数値の最大数を設定します。 | 6個の意味のある数字が出力されます。 |
s, S | 文字列の出力シンボル数を設定します。弦の長さが精度を超えると、弦が切れます。 | 文字列全体が出力されます。 |
④[{h | l | ll | I32 | I64}]
パラメーターとして渡されるデータ サイズの仕様。
データ型 | 使用されたプレフィックス | 型の結合指定子 |
---|---|---|
int | l (小文字の L) | d、i、o、x、X |
uint | l (小文字の L) | o、u、x、X |
long | ll (2 つの小文字の L) | d、i、o、x、X |
short | h | d、i、o、x、X |
ushort | h | o、u、x、X |
int | I32 | d、i、o、x、X |
uint | I32 | o、u、x、X |
long | I64 | d、i、o、x、X |
ulong | I64 | o、u、x、X |
⑤type
型指定子は、書式設定された出力の唯一の必須フィールドです。
タイプ | データ型 | 出力フォーマット |
---|---|---|
c | int | short型の記号 (Unicode) |
C | int | char型の記号 (ANSI) |
d | int | 符号付き 10進数 |
i | int | 符号付き 10進数 |
o | int | 符号なし 8進数 |
u | int | 符号なし 10進数 |
x | int | 「abcdef」を使用した符号なし 16進数 |
X | int | “ABCDEF” を使用した符号なし 16進数 |
e | double | [-] d.dddd e[符号] dddの形式の実数値。小数点前の dは 1桁の 10進数、小数点後の ddddは 1桁以上の 10進数、最後の dddは 指数のサイズを決定する 3桁の数値、[符号]はプラスまたはマイナス |
E | double | eの形式と同様ですが、指数の符号が大文字で出力される点が異なります(eではなく E)。 |
f | double | [-] dddd.dddd形式の実数値。小数点前の ddddは 1桁以上の 10進数です。小数点以下の表示桁数は、数値の大きさによって異なります。小数点以下の桁数は、必要な精度によって異なります。 |
g | double | どちらの出力がよりコンパクトであるかに応じて、fまたは e形式の実数値出力。 |
G | double | どちらの出力がよりコンパクトであるかに応じて、Fまたは E形式の実数値出力。 |
a | double | [−]0xh.hhhh p ± dd 形式の実数。h.hhhhは「abcdef」を使用した 16進数形式の仮数、ddは 1桁以上の指数。小数点以下の桁数は精度仕様によって決定されます |
A | double | [−]0xh.hhhh P ±dd形式の実数。h.hhhh は “ABCDEF” を使用した 16進数形式の仮数、dd は 1桁以上の指数。小数点以下の桁数は精度仕様によって決定されます |
s | string | 文字列出力 |
使用例
PrintFormat 関数によるフォーマット設定
%①[flags]②[width]③[.precision]④[{h | l | ll | I32 | I64}]⑤type
フォーマット形式の①と⑤を使った例です。①は「+」の表示。⑤で「f」は通常の実数表示、「e」は指数を使った表示としています。「.3」を入れることで小数点以下の桁数を決定できます。
「%」を文字列として使う場合は「%%」と重ねることで文字列認識されます。
コード
#property strict
void OnInit() {
double test = 1234567890.12345678901234567890;
Print("Print:", test); // 通常のPrint
PrintFormat("PrintFormat(%%f):%f", test); // %⑤
PrintFormat("PrintFormat(%%+.3f):%+.3f", test); // %①⑤
PrintFormat("PrintFormat(%%e):%e", test); // %⑤
PrintFormat("PrintFormat(%%+.3e):%+.3e", test); // %①⑤
}
コードをコンパイルして実行する方法はこちらを参考にしてください。(デモ口座でお試しください)