strfmon() - ストリングへの通貨値の変換

標準

標準/拡張機能 C/C++ 依存項目

XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _XOPEN_SOURCE
#include <monetary.h>

ssize_t strfmon(char * __restrict__ s, size_t maxsize, 
                const char * __restrict__ format, …);

機能説明

strfmon() は、double 引数からフォーマット設定された通貨出力ストリングを生成します。 この関数は、機能が拡張されて、__isBFP() 関数を利用して浮動小数点形式引数 (16 進数浮動小数点または IEEE 2 進数浮動小数点) を判断できるようになりました。

注: IEEE 2 進数浮動小数点モードでは、非正規、無限大、および NaN の引数値は範囲外です。

format が指すストリングによって制御されるように、文字を *s が指す配列に入れます。maxsize が示す数より多い文字数を、配列に入れることはできません。

文字ストリング format には、2 つのタイプのオブジェクトが含まれています。1 つは出力配列にコピーされるプレーン文字で、もう 1 つはディレクティブです。それぞれの結果として、変換とフォーマット設定が行われるゼロ個以上の引数が取り出されます。format の引数が不十分な場合は、結果は未定義です。引数が残っているのに、format が使い尽くされている場合、余分な引数は無視されます。s および format で指定されるオブジェクトが オーバーラップしている場合、その動作は保証されません。

ディレクティブ (変換指定) は、次のシーケンスで構成 されます。
  1. % 文字
  2. オプション・フラグ: =f、^、!、次に +、C、または (
  3. オプション・フィールド幅 (前に w がある場合がある)
  4. オプション左方精度: #n
  5. オプション右方精度: .p
  6. 実行する必要がある変換を示す必須変換文字: i または n
次のリストで説明しているように、各ディレクティブは 該当する文字で置き換えられます。
%i
二重引数は、ロケールの国際通貨形式 (例えば米国では 、USD 1,234.56) に応じて、フォーマット設定されます。4 文字の各国語通貨ストリングではなく、@euro コード・セット修飾子を 使用して「EUR」を要求することができます。
%n
二重引数は、ロケールの国際通貨形式 (例えば米国では 、$1,234.56) に応じて、フォーマット設定されます。@euro コード・セット修飾子を使用して、<currency> ではなく <euro-sign> を取得できます。

%% は % で置き換えられます。引数は変換されません。

次のオプションの変換指定は、ディレクティブの初期 % の直後に 続く場合があります。
=f
最大桁数指定 #n (以下を参照) との結合に使用されるフラグにより、文字 f を数字充てん文字として使用するよう指定されます。デフォルトの数字充てん文字は、空白文字です。このオプション は、常に空間を充てん文字として使用するその他の充てん演算には 影響しません。
^
フラグ。通貨額を、千の位のグループ文字でフォーマット設定しないでください。デフォルトでは、通貨ロケールで定義されていた場合には、グループ 文字に挿入されることになります。
注: ^ 文字のコード・ポイントは、現行の LC_SYNTAX カテゴリーに応じて、決定されます。
+ | C | (
正および負の通貨額を表示するスタイルを指定するフラグ です。+C、または ( の 1 つ だけを指定できます。+ が指定されると、+ および - のロケールの同値が使用されます (例えば米国では、正の場合には、空 (NULL) ストリングで、負の場合には、-)。C が指定されると、負では DB のロケールの同値、正では CR のそれが使用されます。( が指定された場合には、括弧内の負の額のロケール の同値が使用されます。このオプションが含まれていない場合には、現行ロケールで 指定されたデフォルトが使用されます。
[-]w
フィールド幅。10 進数ストリング w により、変換の結果が右寄せ (またはオプションのフラグ「-」が指定されている場合には左寄せ) の最小フィールド幅が指定されます。
#n
左方精度。10 進数ストリング n により、基数文字の左方にフォーマット設定される最大桁数が指定されます。このオプションを使用して、strfmon() への複数回の呼び出しからの フォーマット設定された出力を、同じ列に位置合わせしたままにしておくことができます。またこれを使用して、$***123.45 などの特殊文字で未使用の位置 を充てんすることもできます。このオプションによって、n で指定された桁数があるかのように、金額をフォーマット設定できます。指定された数より多くの桁位置が必要な場合には、変換指定は 無視されます。実際に必要な数より多い桁位置は、数字充てん文字で充てんされます (上記の =f 指定を参照してください)。
千単位のグループ化が使用可能な場合、その動作は以下のようになります。
  1. n 桁数であるかのように、数をフォーマット設定する。
  2. 充てん文字を左端の桁の左方に挿入する (例えば 、$0001234.56 または $***1234.56)。
  3. 区切り文字を挿入する (例えば、$0,001,234.56 または $*,**1,234.56)。
  4. 充てん文字がゼロ桁でない場合には、区切り が充てん文字で置き換えられる (例えば、$****1,234.56)。

確実に位置合わせをするために、フォーマット設定された出力において、数の前後に表示されるどのような文字も (通貨または符号シンボルなど)、その正または負の形式を等しい長さにするために、必要に応じて、空白文字が埋め込まれます。

注: # 文字 (#n) の コード・ポイントは、現行 LC_SYNTAX カテゴリーに応じて、決定されます。
.p
右方精度。10 進数ストリング p により、基数文字のあとに桁数が指定されます。精度 p の値がゼロの場合は、基数文字は表示されません。このオプションが含まれていない場合には、現行ロケールで 指定されたデフォルトが使用されます。フォーマット設定されている金額は、フォーマット設定前の指定桁数に丸められます。
!
出力変換からの通貨記号を抑制するのに使用されるフラグです。
注: ! 文字のコード・ポイントは、現行 LC_SYNTAX カテゴリーに応じて、決定されます。

プログラムのロケールの LC_MONETARY カテゴリーは、次の ものを組み込むこの関数の動作に影響します。通貨基数文字 (これは、LC_NUMERIC カテゴリーによって影響される数字の基数文字とは 異なります)、千の位 (または代替グループ) の区切り、通貨記号 および形式。国際通貨記号は、通貨および資金の表示のために、ISO4217 コード で指定されたものと一致していることが必要です。

LC_MONETARY カテゴリーには、国内と国際の両方の通貨数量を出力するためのフォーマット設定の選択肢が指定されています。 国内フォーマットは、p_cs_precedes、n_cs_precedes、p_sign_posn、n_sign_posn、p_sep_by_space、および n_sep_by_space の設定値によって決定されます。ISO/IEC 標準への準拠のために、同等な国際フォーマット用のメンバーのセットが追加されています。 国際フォーマットについて詳しくは、locale.hを参照してください。

次の表は、sep_by_space と sign_posn のさまざまな組み合わせに対して予期される結果を示しています。すべての例は、正の通貨数量 123.00、正符号「+」、および通貨記号「$」を基にしています。フォーマット設定規則は、負の値と負でない値、および国内フォーマットと国際フォーマットのいずれに対しても同等であることに注意してください。
表 1. cs_precedes = 1 の場合の通貨フォーマット
sep_by_space sign_posn
  0 1 2 3 4
0 ($123.00) +$123.00 $123.00+ +$123.00 $+123.00
1 ($ 123.00) +$ 123.00 $ 123.00+ +$ 123.00 $+ 123.00
2 ($123.00) + $123.00 $123.00 + + $123.00 $ +123.00
表 2. cs_precedes = 0 の場合の通貨フォーマット
sep_by_space sign_posn
  0 1 2 3 4
0 (123.00$) +123.00$ 123.00$+ 123.00+$ 123.00$+
1 (123.00 $) +123.00 $ 123.00 $+ 123.00 +$ 123.00 $+
2 (123.00$) + 123.00$ 123.00$ + 123.00+ $ 123.00$ +
cs_precedes
0
通貨記号は値の後に付きます。
1
通貨記号は値の前に付きます。
sep_by_space
0
通貨記号と値はスペースによって区切られません。
1
通貨記号と符号ストリングが隣接している場合は、これらの記号と値がスペースによって分離されます。そうでなければ、通貨記号と値がスペースによって分離されます。
2
通貨記号と符号ストリングが隣接している場合は、これらの記号が互いにスペースによって分離されます。そうでなければ、符号ストリングと値がスペースによって分離されます。
sign_posn
0
数量と currency_symbol または int_curr_symbol は括弧で囲まれます。
1
符号ストリングは、数量と currency_symbol または int_curr_symbol の前に付きます。
2
符号ストリングは、数量と currency_symbol または int_curr_symbol の後に付きます。
3
符号ストリングは、currency_symbol または int_curr_symbol の直前に付きます。
4
符号ストリングは、currency_symbol または int_curr_symbol の直後に付きます。

戻り値

終了 NULL 文字を組み込む結果バイトの合計数が maxsize 以下である場合、strfmon() は、s が指す配列に入れられたバイト数 (終了 NULL 文字を含まない) を戻します。

正常に実行されなかった場合、配列の内容は不確かで、strfmon() は -1 を戻し、errno を以下の値のいずれかに設定します。
エラー・コード
説明
E2BIG
バッファーのスペース不足のために停止された変換

CELEBS41
⁄* CELEBS41 *⁄                                   
#include <localdef.h>                                                           
#include <monetary.h>                                                           
#include <stdio.h>                                                              
#include <stdlib.h>                                                             
                                                                                
int main(void)                                                                  
{                                                                               
   char   string[100];     ⁄* hold the string returned from strfmon() *⁄        
   double money = 1234.56;                                                      
                                                                                
   if (setlocale(LC_ALL, "En_US") == NULL) {                                    
      printf("Unable to setlocale().¥n");
      exit(1);                                                                  
   }                                                                            
                                                                                
   strfmon(string, 100, "%i", money);                                           
   printf("%s¥n",string);
   strfmon(string, 100, "%n", money);                                           
   printf("%s¥n",string);
}                                                                               

以下の例は、ユーロ通貨サポートを表しています。
/* EUROSAMP
   This example sets the locale to Fr_BE.IBM-1148
   and Fr_BE.IBM-1148@euro and prints a value with
   the locales national and international currency
   format.
*/

#include <localdef.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char string[100];
  double money = 1234.56;

if (setlocale(LC_ALL,"Fr_BE.IBM-1148") == NULL) {
    printf("Unable to setlocale().¥n");
    exit(1);
}

strfmon(string,100,"%i",money);
printf("%s¥n",string);
strfmon(string,100,"%n",money);
printf("%s¥n",string);

if (setlocale(LC_ALL,"Fr_BE.IBM-1148@euro") == NULL) {
    printf("Unable to setlocale().¥n");
    exit(1);
}

strfmon(string,100,"%i",money);
printf("%s¥n",string);
strfmon(string,100,"%n",money);
printf("%s¥n",string);
}

出力

1.234,56 BEF
1.234,56 BF
1.234,56 EUR
1.234,56 <euro-sign>

関連情報