EN JA
STRFMON(3)
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 個以上続けることができる。

= f
1 バイト文字 f を数値埋め文字 (numeric fill character) にする (左精度と共に用いる。以下を参照)。指定されないと、スペース文字が用いられる。
^
現在のロケールで定義されているであろうグループ化文字 (grouping character) を一切使わない。デフォルトではグループ化は有効になっている。
( または +
( フラグは、負の数値を括弧で括ることを意味する。 + フラグは符号をデフォルトのように取り扱うことを意味する (すなわち数値の前にロケールの符号マークが置かれる。例えば正ならなにもなく、負なら'-'を置く、など)。
!
通貨シンボルを省略する。
-
すべてのフィールドを左詰めにする。デフォルトは右詰め。

次の位置には、フィールドの幅を指定できる。 10 進の数値文字列で、フィールドの最小幅をバイト単位で指定する。デフォルトは 0。結果がこの幅よりも狭くなった場合には、不足分がスペースで埋められる (左詰めフラグが指定されていなければ左側が埋められる)。

次の位置には、"#"に 10 進数値文字列を続けた形式で、左精度 (left precision) を指定できる。通貨の基数点 (radix) より左側の数値の桁数がこの指定より小さい場合は、数値埋め文字で左側が埋められる。このフィールド幅の指定では、グループ化文字はカウントされない。

次の位置には、"."に 10 進数値文字列を続けた形式で、右精度 (right precision) を指定できる。整形される数値は、整形前にこの桁数に丸められる。デフォルトではカレントロケールの frac_digitsint_frac_digits の指定を用いる。右精度が 0 の場合は、基数点文字 (radix character) は印字されない (ここでの基数点文字は LC_MONETARY で定義されており、 LC_NUMERIC の指定とは異なっていてもよい)。

最後に、変換指定は変換文字 (conversion character) で終了しなければならない。変換文字には以下の 3 つがある。

%
(この場合は指定全体が "%%"でなければならない。) 結果の文字列に'%'文字を書きこむ。
i
double 型の引き数ひとつが、ロケールの国際通貨フォーマット (international currency format) を用いて変換される。
n
double 型の引き数ひとつが、ロケールの国内通貨フォーマット (national currency format) を用いて変換される。

返り値

strfmon() 関数は、結果の文字列が終端の NULL バイトを含めて配列 s に収まった場合には、 s に書きこまれた文字数を返す。NULL バイトは文字数に入らない。それ以外の場合には、 errnoE2BIG を設定して-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 ]

関連項目

setlocale(3), sprintf(3), locale(7)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2000-12-05 Linux