STRFMON(3) | Linux Programmer's Manual | STRFMON(3) |
strfmon - 金額の値を文字列に変換する
#include <monetary.h>
ssize_t strfmon(char *s, size_t max, const char *format, ...);
strfmon() 関数は、指定された数量を format で指定されたフォーマットにしたがって整形し、 結果をサイズ max の文字配列 s に書きこむ。
format 中の通常の文字は、変換されずにそのまま s にコピーされる。変換指定は '%' 文字で始まる。 この直後には、以下のフラグを 0 個以上続けることができる。
次の位置には、フィールドの幅を指定できる。 10 進の数値文字列で、フィールドの最小幅をバイト単位で指定する。 デフォルトは 0。 結果がこの幅よりも狭くなった場合には、 不足分がスペースで埋められる (左詰めフラグが指定されていなければ左側が埋められる)。
次の位置には、"#" に 10 進数値文字列を続けた形式で、 左精度 (left precision) を指定できる。 通貨の基数点 (radix) より左側の数値の桁数がこの指定より小さい場合は、 数値埋め文字で左側が埋められる。 このフィールド幅の指定では、グループ化文字はカウントされない。
次の位置には、"." に 10 進数値文字列を続けた形式で、 右精度 (right precision) を指定できる。 整形される数値は、整形前にこの桁数に丸められる。 デフォルトではカレントロケールの frac_digits と int_frac_digits の指定を用いる。 右精度が 0 の場合は、基数点文字 (radix character) は印字されない (ここでの基数点文字は LC_MONETARY で定義されており、 LC_NUMERIC の指定とは異なっていてもよい)。
最後に、変換指定は変換文字 (conversion character) で終了しなければならない。 変換文字には以下の 3 つがある。
strfmon() 関数は、結果の文字列が終端のヌルバイトを含めて配列 s に収まった場合には、 s に書きこまれた文字数を返す。ヌルバイトは文字数に入らない。 それ以外の場合には、 errno に E2BIG を設定して -1 を返す。 この場合の配列の内容は未定義である。
POSIX.1-2001 にはない。 他のいくつかのシステムに存在する。
次のような関数コール
strfmon(buf, sizeof(buf), "[%^=*#6n] [%=*#6i]",
1234.567, 1234.567);
は、オランダのロケールでは以下のような出力になる。
[ fl **1234,57] [ NLG **1 234,57]
(fl は "florijnen" の意。NLG は
Netherlands Guilder。)
グループ化文字を用いると非常に醜くなる。
同時に間違いなく混乱の原因にもなってしまうだろう。
これは数値の半分以下の幅であるべきだが、
数値と同じだけの幅を取ってしまうからである。
ひどいことに、 "fl"
の前後にはスペースが入ってしまい、
また "NLG" の前には 1
つ、後には 2
つのスペースが置かれている。
これはロケールファイルのバグであろう。
イタリア、オーストラリア、スイス、ポルトガルの
各ロケールでの結果は以下のようになる。
[ L. **1235] [ ITL **1.235]
[ $**1234.57] [ AUD **1,234.57]
[Fr. **1234,57] [CHF **1.234,57]
[ **1234$57Esc] [ **1.234$57PTE ]
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2000-12-05 | Linux |