構文
#include <monetary.h>
ssize_t strfmon(char *s, size_t maxsize, const char
*format, ...);
特記事項
ANSI C の ", ..." は可変長の引き数リストを表しており、この行を特定のページ番号に合わせるためのオプション
[ または必須 ] の (/*
*/) に指定します。
説明
strfmon() 関数は、 format でポイントされている文字列の制御通りに、文字を s でポイントされている配列に入れます。配列には maxsize バイトより多くを入れることはできません。
フォーマットは、2 つのオブジェクト型を含んだ文字列です。1 つは出力用に単にコピーされる通常の文字です。もう 1 つは変換指定で、その指定それぞれに対して、変換とフォーマッティングの対象となる引き数がフェッチされます。 double 型の引き数についての詳細は、「変換文字 」の項を参照してください。フォーマットに対して引き数の数が少ない場合の結果は定義されていません。フォーマットを終了しても引き数が残っている場合、余分な引き数は無視されます。
変換指定は、次の文字列です。
%[flag...][field_width][#left_precision][.right_precision] conversion_character
このシーケンス中の各要素は、以下のように指定します。
フラグ
以下の任意フラグを 1 つまたは複数指定することによって、変換を制御できます。
| =f | | = (等号) と、数値充てん文字として使用する単一の文字 f です。充てん文字は、桁数と横幅の数が正しく合うように、1 バイトで表すことができる文字でなければなりません。デフォルトの数値充てん文字は空白文字です。このフラグはフィールド幅の埋め込み
(空白文字を使用) には影響しません。左桁数 (下記を参照) を指定していない限り、このフラグは無視されます。 |
| ^ | | 金額をフォーマットする場合に、グループ文字を使用しません。デフォルトでは、現在のロケールに定義されているグループ文字が挿入されます。 |
| + または ( | | 正および負の金額を表すためのスタイルを指定します。 + または ( (プラス符号または左かっこ)
のどちちらか 1 つだけを指定します。 + を指定すると、+
および - と等価なロケール値が使用されます (たとえば en_US.roman8 ロケールの場合、正の値には空文字、負の値には
- が使用されます)。 ( を指定すると、負の値はかっこで囲まれます。どちらのフラグも指定しないと、 + のスタイルが使用されます。 |
| ! | | 変換後の出力から通貨記号を取り除きます。 |
| - | | マイナス符号は、データの整列形式を意味します。このフラグを指定すると、すべてのフィールドは右揃えではなく、左揃えになります
(右側がパディングされます)。 |
フィールド幅
| w | | 10 進数の数字 w で、変換の結果を右揃え (フラグ - を指定した場合は左揃え)
したときの最小のフィールド幅を指定します。デフォルトはゼロです。 |
左桁数
| #n | | # と 10 進数の数字 n で、小数点の左側にフォーマットする最大桁数を指定します。このオプションは、複数の呼び出しからフォーマットされた出力を strfmon() で同じカラムに整列させる場合に使用できます。また、$***123.45 のように、使用されていない位置に特殊文字を埋め込む場合にも使用できます。このオプションを使用すると、金額に n で指定している桁数があるかのようにフォーマットされます。金額が n の桁数よりも多い場合、この変換指定は無視されます。実際に必要な桁数以外の余分な位置は、数値充てん文字で埋め込まれます
(前の =f フラグを参照)。 ^ フラグによるグループ分けの抑制を行っていない場合、現在のロケールにグループ文字が定義されていれば、グループ区切り記号が挿入されてから、充てん文字が追加されます。充てん文字が数字であっても、グループ区切り記号は充てん文字には適用されません。 正しく整列するように、通貨記号や符号など、フォーマットされた出力の前または後に現れる文字は、正および負のフォーマットが同じ長さになるように必要に応じて空白文字で埋め込まれます。 |
右桁数
| .p | | ピリオドと 10 進数の数字 p で、小数点以下の桁数を指定します。右桁数 p の値がゼロであると、小数点は現れません。右桁数を指定していないと、現在のロケールに指定されているデフォルトが使用されます。フォーマットされる金額は指定の桁数に丸められてから、フォーマットされます。 |
変換文字
変換文字と意味は、以下のとおりです。
| i | | double 引き数は、ロケールの国際通貨フォーマットに従ってフォーマットされます
(たとえば en_US.roman8 ロケールでは USD 1,234.56)。 |
| n | | double 引き数は、ロケールの国内通貨フォーマットに従ってフォーマットされます
(たとえば en_US.roman8 ロケールでは $1,234.56)。 |
| % | | % に変換されます。引き数は変換されません。変換指定全体が
%% でなければなりません。 |
多言語化対応
ロケール
プログラムのロケールの LC_MONETARY カテゴリが、金額の小数点
(LC_NUMERIC カテゴリの影響を受ける数値の小数点と異なる場合があります)、グループ区切り記号、通貨記号、およびフォーマットを含め、この関数の動作に影響します。
戻り値
終了ヌルバイトを含めて結果の総バイト数が maxsize 以下の場合、 strfmon() 関数は s でポイントされている配列に納めたバイト数を返します。ただし、この中には終了ヌルバイトは含まれていません。そうでなければ
-1 を返します。この場合、配列の内容は分からず、 errno が該当のエラーに設定されます。
エラー
次の場合、 strfmon() 関数は正常に動作しません。
| E2BIG | | バッファーのスペースが不十分であったため、変換を中止しました。 |
例
次のプログラムセグメントは en_US.roman8 ロケールを使用して、左桁数 5 および充てん文字 * で金額 -4321.123 をフォーマットしています。
char string[31]; double amt =
-4321.123; setlocale(LC_MONETARY, "en_US.roman8"); strfmon(string,
31, "The amount is %=*#5n.", amt);
string 配列の内容は、次のようになります。
The amount is -$*4,321.12. 以下の例では、 en_US.roman8 ロケールを使用し、値は 123.45、 -123.45、
および 3456.781 です。
| 変換 | 出力 | コメント |
| 指定 | | |
| %n | $123.45 | デフォルトのフォーマット |
| | -$123.45 | |
| | $3,456.78 | |
| %11n | $123.45 | 11 文字のフィールド内で右揃え |
| | -$123.45 | |
| | $3,456.78 | |
| %#5n | $ 123.45 | 99,999 までの値を桁揃え |
| | -$ 123.45 | |
| | $ 3,456.78 | |
| %=*#5n | $***123.45 | 充てん文字を指定 |
| | -$***123.45 | |
| | $*3,456.78 | |
| %=0#5n | $000123.45 | 充てん文字が数字であっても、充てん文字の中では |
| | -$000123.45 | グループ区切り記号は使用されません。 |
| | $03,456.78 | |
| %^#5n | $ 123.45 | グループ区切り記号を使用しない |
| | -$ 123.45 | |
| | $ 3456.78 | |
| %^#5.0n | $ 123 | 小数点以下を丸める |
| | -$ 123 | |
| | $ 3457 | |
| %^#5.4n | $ 123.4500 | 右桁数を増加 |
| | -$ 123.4500 | |
| | $ 3456.7810 | |
| %(#5n | $ 123.45 | 別の正/負スタイルを使用 |
| | ($ 123.45) | |
| | $ 3,456.78 | |
| %!(#5n | 123.45 | 通貨記号を使用しない |
| | ( 123.45) | |
| | 3,456.78 | |