STRFMON
Section: Linux Programmer's Manual (3)
Updated: 2000-12-05
Index
JM Home Page
roff page
名前
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_digits
と
int_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 バイトは文字数に入らない。
それ以外の場合には、
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 ]
関連項目
setlocale(3),
sprintf(3),
locale(7)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- 準拠
-
- 例
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:32:05 GMT, November 19, 2007