C言語入門講座。関数、サンプル集を参考にして、 C言語をマスターしよう。初心者から上級者まで。

ロケール(地域と言語)の設定に関する詳細情報を取得する

2012.08.10

localeconv関数は、現在のロケールの数値書式に関する詳細情報を取得します。

この情報は、lconv型の構造体に格納されます。

#include <locale.h>
struct lconv *localeconv( void );

引数はありません。

戻り値として、lconv型の構造体のポインタが返されます。

このポインタの指すメモリは関数内で確保されるため、実体を準備する必要はありません。

lconv型の構造体のメンバを以下に記載します。

これらの値は、以降の処理で書き換えられる可能性があるため、直接変更しないでください。












































































char *decimal_point 通貨以外の数値で使用する小数点の文字
char *thousands_sep 通貨以外の数値で使用する整数部の桁を区切る文字
char *grouping 通貨以外の数値の区切りを入れる桁数を示す値の入った配列

以下の値をとります。

「CHAR_MAX」: 区切りをいれません。

「0」: 残りの各桁の区切りは直前の要素の桁数を使用します。

「n」(1以上): 区切りを入れる桁数。

char *int_curr_symbol 国際通貨記号

以下の規則に則って解釈します。

・最初の3文字は、ISO4217規格で定義されている英字の国際通貨記号

・4番目の文字(NULL文字の直前にある文字)は、国際通貨記号と通貨値を区切る記号

char *currency_symbol 通貨記号
char *mon_decimal_point 通貨で使用する小数点の文字
char *mon_thousands_sep 通貨で使用する整数部の数字の桁を区切る文字
char *mon_grouping 通貨の区切りを入れる桁数を示す値の入った配列

以下の値をとります。

「CHAR_MAX」: 区切りをいれません。

「0」: 残りの各桁の区切りは直前の要素の桁数を使用します。

「n」(1以上): 区切りを入れる桁数。

char *positive_sign 0及び正の通貨値の、符号を示す文字列
char *negative_sign 負の通貨値の、符号を表す文字列
char int_frac_digits 国際的な通貨書式の小数部の桁数
char frac_digits 通貨書式の小数部の桁数
char p_cs_precedes 通貨記号が、

0及び正の通貨値の前にある場合は「1」

0及び正の通貨値の後ろにある場合は「0」

char p_sep_by_space 通貨記号と0及び正の通貨値が、

空白で区切られている場合は「1」

空白で区切られていない場合は「0」

char n_cs_precedes 通貨記号が、

負の通貨値の前にある場合は「1」

負の通貨値の後ろにある場合は「0」

char n_sep_by_space 通貨記号と負の通貨値が、

空白で区切られている場合は「1」

空白で区切られていない場合は「0」

char p_sign_posn 0及び正の通貨書式の符号の位置

以下の値をとります。

「0」: 数値と通貨記号をかっこで囲む

「1」: 符号文字列が、数値と通貨記号の前にある

「2」: 符号文字列が、数値と通貨記号の後ろにある

「3」: 符号文字列が、通貨記号の直前にある

「4」: 符号文字列が、通貨記号の直後にある

char n_sign_posn 負の通貨書式の符号の位置

以下の値をとります。

「0」: 数値と通貨記号をかっこで囲む

「1」: 符号文字列が、数値と通貨記号の前にある

「2」: 符号文字列が、数値と通貨記号の後ろにある

「3」: 符号文字列が、通貨記号の直前にある

「4」: 符号文字列が、通貨記号の直後にある


※char * 型メンバは文字ではなく文字列へのポインタです。また、char *decimal_point以外で ” に等しいメンバは、長さが0か、現在のロケールでサポートされていないものです。

※構造体の char型メンバは、0以上の数値を表しますが、CHAR_MAXと等しいメンバがあった場合、そのメンバは現在のロケールでサポートされていないことを示しています。

プログラム 例

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

int main(void)
{
    char *loc;
    struct lconv *stLc;

    /* ロケール情報を'jpn'(日本)に設定し、取得 */
    loc = setlocale(LC_ALL, 'jpn');
    printf('locale = %sn', loc);

    /* ロケールに関する詳細情報を取得 */
    stLc = localeconv();
    printf(' decimal_point = %sn', stLc->decimal_point);
    printf(' thousands_sep = %sn', stLc->thousands_sep);
    printf(' grouping[0] = %dn', stLc->grouping[0]);
    printf(' grouping[1] = %dn', stLc->grouping[1]);
    printf(' int_curr_symbol = %sn', stLc->int_curr_symbol);
    printf(' currency_symbol = %sn', stLc->currency_symbol);
    printf(' mon_decimal_point = %sn', stLc->mon_decimal_point);
    printf(' mon_thousands_sep = %sn', stLc->mon_thousands_sep);
    printf(' mon_grouping[0] = %dn', stLc->mon_grouping[0]);
    printf(' mon_grouping[1] = %dn', stLc->mon_grouping[1]);
    printf(' positive_sign = %sn', stLc->positive_sign);
    printf(' negative_sign = %sn', stLc->negative_sign);
    printf(' int_frac_digits = %dn', stLc->int_frac_digits);
    printf(' frac_digits = %dn', stLc->frac_digits);
    printf(' p_cs_precedes = %dn', stLc->p_cs_precedes);
    printf(' p_sep_by_space = %dn', stLc->p_sep_by_space);
    printf(' n_cs_precedes = %dn', stLc->n_cs_precedes);
    printf(' n_sep_by_space = %dn', stLc->n_sep_by_space);
    printf(' n_sign_posn = %dn', stLc->n_sign_posn);

    printf('n');

    /* ロケール情報を'us'(米国)に設定し、取得 */
    loc = setlocale(LC_ALL, 'us');
    printf('locale = %sn', loc);

    /* ロケールに関する詳細情報を取得 */
    stLc = localeconv();
    printf(' int_curr_symbol = %sn', stLc->int_curr_symbol);
    printf(' currency_symbol = %sn', stLc->currency_symbol);
    /* 他メンバは抜粋します */

    return 0;
}

例の実行結果

> localeconv.exe
locale = Japanese_Japan.932
 decimal_point = .
 thousands_sep = ,
 grouping[0] = 3
 grouping[1] = 0
 int_curr_symbol = JPY
 currency_symbol = 
 mon_decimal_point = .
 mon_thousands_sep = ,
 mon_grouping[0] = 3
 mon_grouping[1] = 0
 positive_sign =
 negative_sign = -
 int_frac_digits = 2
 frac_digits = 0
 p_cs_precedes = 1
 p_sep_by_space = 0
 n_cs_precedes = 1
 n_sep_by_space = 0
 n_sign_posn = 3

locale = English_United States.1252
 int_curr_symbol = USD
 currency_symbol = $

※Windows環境でのみ動作確認しております。LINUX環境などでは動作が異なる場合がありますので、その場合は環境に合わせてカスタマイズしてください。

Copyright © 2011 katsumi Handa All Rights Reserved.

関連記事