コンテンツにスキップ

C言語/標準ライブラリ/locale.h

出典: フリー教科書『ウィキブックス(Wikibooks)』

ヘッダー <locale.h> は、2つの関数と1つの型を宣言し、いくつかのマクロを定義しています[1]

[編集]

ヘッダー <locale.h> で定義される型 struct lconv で、数値のフォーマットに関連するメンバーを含む。この構造体は、少なくとも以下のメンバーを任意の順序で含まなければならない。メンバーのセマンティクスとその正常範囲は、#localeconv関数 で説明します。C "ロケールでは、メンバーはコメントで指定された値を持ちます。

char *decimal_point;     // "."
char *thousands_sep;     // ""
char *grouping;          // ""
char *mon_decimal_point; // ""
char *mon_thousands_sep; // ""
char *mon_grouping;      // ""
char *positive_sign;     // ""
char *negative_sign;     // ""
char *currency_symbol;   // ""
char frac_digits;        // CHAR_MAX
char p_cs_precedes;      // CHAR_MAX
char n_cs_precedes;      // CHAR_MAX
char p_sep_by_space;     // CHAR_MAX
char n_sep_by_space;     // CHAR_MAX
char p_sign_posn;        // CHAR_MAX
char n_sign_posn;        // CHAR_MAX
char *int_curr_symbol;   // ""
char int_frac_digits;    // CHAR_MAX
char int_p_cs_precedes;  // CHAR_MAX
char int_n_cs_precedes;  // CHAR_MAX
char int_p_sep_by_space; // CHAR_MAX
char int_n_sep_by_space; // CHAR_MAX
char int_p_sign_posn;    // CHAR_MAX
char int_n_sign_posn;    // CHAR_MAX


struct lconv のメンバー

[編集]
char *decimal_point
通貨以外の量のフォーマットに使用される小数点を表す文字。 
char *thousands_sep
通貨以外の量のフォーマットにおいて、小数点文字の前の数字のグループを区切るための文字。

マクロ

[編集]

ヘッダー <locale.h> で定義されるマクロは、NULL と

LC_ALL
LC_COLLATE;
LC_CTYPE
LC_MONETARY
LC_NUMERIC
LC_TIME

で、値が明確な整数の定数式に展開され、setlocale関数の第一引数として使用するのに適しています。また、LC_ と大文字で始まる追加のマクロ定義も実装によって指定できます。

概要

[編集]
#include <locale.h>

char *setlocale(int category, const char *locale);
struct lconv *localeconv(void);

解説

[編集]

setlocale関数

[編集]

setlocale()関数は、プログラムの現在のロケールを設定または照会するために使用します。

localeNULLでない場合、プログラムの現在のロケールは引数に応じて引数に応じて変更されます。 引数 category は、プログラムの現在のロケールのどの部分を修正するかを決めます。

localeNULLの場合、現在のロケールは問い合わせをするだけで変更はません。

localeconv関数

[編集]

localeconv()関数は、現在のロケールの構造体lconvへのポインタを返します。

この構造体は次のセクションで示され、ロケールカテゴリ LC_NUMERIC' および LC_MONETARY に関連するすべての値を含みます。

プログラムでは、関数printf()strfmon()を使用することもできますが、これらは実際に使用されているロケールに応じて動作します。

lconv構造体

[編集]

The struct lconv contains the following fields:


struct lconvには、以下のフィールドがあります。

(非貨幣性)数値情報

[編集]
char *decimal_point;

小数点を表す文字。

char *thousands_sep;

小数点の左にある桁グループの区切り文字。

char *grouping;

各要素はグループ内の桁数であり、インデックスが大きい要素はさらに左になります。

CHAR_MAXという値を持つ要素は、それ以上のグループ化が行われないことを意味します。

0の値を持つ要素は、前の要素が左隣のすべてのグループに使用されることを意味します。

通貨情報

[編集]
char *int_curr_symbol;

最初の3文字は通貨記号 ISO 4217の通貨記号です。

4番目の文字は セパレータです。

5文字目は'0'です。

char *currency_symbol;

現地通貨記号。

char *mon_decimal_point;

上記 decimal_point に同じ。

char *mon_thousands_sep;

上記 thousands_sep に同じ。

char *mon_grouping;

上記 grouping に同じ。

char *positive_sign;

正の値を示す符号。

char *negative_sign;

負の値を示す符号。

char  int_frac_digits;

国際的な小数点以下の桁数。

char  frac_digits;

ローカルな小数点以下の数字。

char  p_cs_precedes;

currency_symbolの前に正の値がある場合は1、成功した場合は0とります。

char  p_sep_by_space;

正の金額のとき、通貨記号と金額をスペースで区切るなら、currency_symbol1とします。

char  n_cs_precedes;

負の金額のとき、通貨記号が符号に前置するならばcurrency_symbol1に、さもなければ 0 になります。

char  n_sep_by_space;

負の金額をセパレータで区切る場合、currency_symbol1に、さもなければ 0 になります。

char  p_sign_posn;
char  n_sign_posn;

正負の符号位置:

  • 0: 括弧で囲まれた数量と currency_symbol
  • 1: 符号文字列が数量の前にあり、つづいてcurrency_symbol
  • 2: 符号文字列は、数量と currency_symbol に続く
  • 3: 符号文字列は、currency_symbolの直前にあります。
  • 4: 符号文字列は、currency_symbolの直後に

[編集]
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(void)
{
    /* Locale is set to "C" before this. This call sets it
       to the "current locale" by reading environment variables: */
    setlocale(LC_ALL, "");

    const struct lconv * const currentlocale = localeconv();

    printf("In the current locale, the default currency symbol is: %s\n",
        currentlocale->currency_symbol);

    return EXIT_SUCCESS;
}


外部リンク

[編集]
  1. locale.h by OpenGroup
  2. localeconv by OpenGroup
  3. setlocale by OpenGroup
  1. ^ N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. p. 223, §7.11 Localization <locale.h>. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf.