C標準ライブラリ -<locale.h>
概要
<locale.h>locale.h は C 標準ライブラリ内のヘッダファイルであり、プログラムの国際化とローカライゼーションをサポートします。日付、時刻、通貨、数値形式などのプログラムのローカライズ情報を設定または照会するための一連の関数とマクロを提供します。
次に、いくつかのマクロと、重要な構造体を紹介します。struct lconvおよび2つの重要な関数について説明します。
ライブラリマクロ
以下に、ヘッダファイル locale.h で定義されているマクロを示します。これらのマクロは、次の2つの関数で使用されます:
| 番号 | マクロ & 説明 |
|---|---|
| 1 | LC_ALL すべてのローカライズカテゴリを設定または照会するために使用されます。 |
| 2 | LC_COLLATE 文字列比較のローカライズ情報を設定または照会するために使用されます。 |
| 3 | LC_CTYPE 文字処理のローカライズ情報を設定または照会するために使用されます。 |
| 4 | LC_MONETARY 通貨形式のローカライズ情報を設定または照会するために使用されます。 |
| 5 | LC_NUMERIC 数値形式のローカライズ情報(例:小数点の記号)を設定または照会するために使用されます。 |
| 6 | LC_TIME 時刻形式のローカライズ情報を設定または照会するために使用されます。 |
| 7 | locale_t ロケール情報の型を表します。 |
ライブラリ関数
以下に、ヘッダファイル locale.h で定義されている関数を示します:
| 番号 | 関数 & 説明 |
|---|---|
| 1 | char *setlocale(int category, const char *locale) ロケール情報を設定または読み取ります。 |
| 2 | struct lconv *localeconv(void) ロケール情報を設定または読み取ります。 |
| 3 | locale_t newlocale(int category_mask, const char *locale, locale_t base) 新しいローカライズオブジェクトを作成します。 |
| 4 | freelocale(locale_t locale) ローカライズオブジェクトを解放します。 |
| 5 | locale_t uselocale(locale_t newloc) スレッドのローカライズオブジェクトを設定または照会します。 |
例
ローカライズ情報の設定と照会:
例
#include <stdio.h>
#include <locale.h>
int main() {
// ローカライズ情報をユーザー環境変数のデフォルト設定に設定します
setlocale(LC_ALL, "");
// 現在のローカライズ情報を取得して出力します
printf("Current locale for LC_ALL: %s\n", setlocale(LC_ALL, NULL));
printf("Current locale for LC_TIME: %s\n", setlocale(LC_TIME, NULL));
printf("Current locale for LC_NUMERIC: %s\n", setlocale(LC_NUMERIC, NULL));
return 0;
}
#include <locale.h>
int main() {
// ローカライズ情報をユーザー環境変数のデフォルト設定に設定します
setlocale(LC_ALL, "");
// 現在のローカライズ情報を取得して出力します
printf("Current locale for LC_ALL: %s\n", setlocale(LC_ALL, NULL));
printf("Current locale for LC_TIME: %s\n", setlocale(LC_TIME, NULL));
printf("Current locale for LC_NUMERIC: %s\n", setlocale(LC_NUMERIC, NULL));
return 0;
}
コンパイル出力結果は次のとおりです:
Current locale for LC_ALL: zh_CN.UTF-8 Current locale for LC_TIME: zh_CN.UTF-8 Current locale for LC_NUMERIC: zh_CN.UTF-8
数値および通貨形式の情報を取得:
例
#include <stdio.h>
#include <locale.h>
int main() {
// ローカライズ情報をユーザー環境変数のデフォルト設定に設定します
setlocale(LC_ALL, "");
// ローカライズされた数値および通貨形式の情報を取得します
struct lconv *lc = localeconv();
// 数値および通貨形式の情報を出力します
printf("Decimal point character: %s\n", lc->decimal_point);
printf("Thousands separator: %s\n", lc->thousands_sep);
printf("Currency symbol: %s\n", lc->currency_symbol);
return 0;
}
#include <locale.h>
int main() {
// ローカライズ情報をユーザー環境変数のデフォルト設定に設定します
setlocale(LC_ALL, "");
// ローカライズされた数値および通貨形式の情報を取得します
struct lconv *lc = localeconv();
// 数値および通貨形式の情報を出力します
printf("Decimal point character: %s\n", lc->decimal_point);
printf("Thousands separator: %s\n", lc->thousands_sep);
printf("Currency symbol: %s\n", lc->currency_symbol);
return 0;
}
コンパイル出力結果は次のとおりです:
Decimal point character: . Thousands separator: , Currency symbol: ¥
カスタムローカライズオブジェクトの使用:
例
#include <stdio.h>
#include <locale.h>
#include <xlocale.h>
int main() {
// "en_US.UTF-8" ロケールを使用して、新しいローカライズオブジェクトを作成します
locale_t newloc = newlocale(LC_ALL_MASK, "en_US.UTF-8", (locale_t)0);
// 現在のスレッドのローカライズオブジェクトを新しいローカライズオブジェクトに設定します
locale_t oldloc = uselocale(newloc);
// 現在のスレッドのローカライズ情報を取得して出力します
printf("Current locale for LC_NUMERIC: %s\n", setlocale(LC_NUMERIC, NULL));
// 新しいローカライズオブジェクトを解放します
uselocale(oldloc);
freelocale(newloc);
return 0;
}
#include <locale.h>
#include <xlocale.h>
int main() {
// "en_US.UTF-8" ロケールを使用して、新しいローカライズオブジェクトを作成します
locale_t newloc = newlocale(LC_ALL_MASK, "en_US.UTF-8", (locale_t)0);
// 現在のスレッドのローカライズオブジェクトを新しいローカライズオブジェクトに設定します
locale_t oldloc = uselocale(newloc);
// 現在のスレッドのローカライズ情報を取得して出力します
printf("Current locale for LC_NUMERIC: %s\n", setlocale(LC_NUMERIC, NULL));
// 新しいローカライズオブジェクトを解放します
uselocale(oldloc);
freelocale(newloc);
return 0;
}
コンパイル出力結果は次のとおりです:
Current locale for LC_NUMERIC: C
ライブラリ構造体
typedef struct {
char *decimal_point;
char *thousands_sep;
char *grouping;
char *int_curr_symbol;
char *currency_symbol;
char *mon_decimal_point;
char *mon_thousands_sep;
char *mon_grouping;
char *positive_sign;
char *negative_sign;
char int_frac_digits;
char frac_digits;
char p_cs_precedes;
char p_sep_by_space;
char n_cs_precedes;
char n_sep_by_space;
char p_sign_posn;
char n_sign_posn;
} lconv
以下は各フィールドの説明です:
| 番号 | フィールド & 説明 |
|---|---|
| 1 | decimal_point 非通貨値に使用される小数点文字。 |
| 2 | thousands_sep 非通貨値に使用される桁区切り文字。 |
| 3 | grouping 非通貨量における各桁グループのサイズを表す文字列。各文字は整数値を表し、各整数は現在のグループの桁数を指定します。値が 0 の場合は、前の値が残りのグループに適用されることを意味します。 |
| 4 | int_curr_symbol 国際通貨記号に使用される文字列。最初の3文字は ISO 4217:1987 によって指定され、4番目の文字は通貨記号と通貨量を区切るために使用されます。 |
| 5 | currency_symbol 通貨に使用されるローカル記号。 |
| 6 | mon_decimal_point 通貨値に使用される小数点文字。 |
| 7 | mon_thousands_sep 通貨値に使用される桁区切り文字。 |
| 8 | mon_grouping 通貨値における各桁グループのサイズを表す文字列。各文字は整数値を表し、各整数は現在のグループの桁数を指定します。値が 0 の場合は、前の値が残りのグループに適用されることを意味します。 |
| 9 | positive_sign 正の通貨値に使用される文字。 |
| 10 | negative_sign 負の通貨値に使用される文字。 |
| 11 | int_frac_digits 国際通貨値で小数点以下に表示する桁数。 |
| 12 | frac_digits 通貨値で小数点以下に表示する桁数。 |
| 13 | p_cs_precedes 1 に等しい場合、currency_symbol は正の通貨値の前に表示されます。0 に等しい場合、currency_symbol は正の通貨値の後に表示されます。 |
| 14 | p_sep_by_space 1 に等しい場合、currency_symbol と正の通貨値の間はスペースで区切られます。0 に等しい場合、currency_symbol と正の通貨値の間はスペースで区切られません。 |
| 15 | n_cs_precedes 1 に等しい場合、currency_symbol は負の通貨値の前に表示されます。0 に等しい場合、currency_symbol は負の通貨値の後に表示されます。 |
| 16 | n_sep_by_space 1 に等しい場合、currency_symbol と負の通貨値の間はスペースで区切られます。0 に等しい場合、currency_symbol と負の通貨値の間はスペースで区切られません。 |
| 17 | p_sign_posn 正の通貨値における正号の位置を表します。 |
| 18 | n_sign_posn 負の通貨値における負号の位置を表します。 |
以下の値は次の用途に使用されますp_sign_posnとn_sign_posn:
| 值 | 説明 |
|---|---|
| 0 | 値と currency_symbol を囲む括弧。 |
| 1 | 値と currency_symbol の前に配置される記号。 |
| 2 | 値と currency_symbol の後に配置される記号。 |
| 3 | 値と currency_symbol の直前に配置される記号。 |
| 4 | 値と currency_symbol の直後に配置される記号。 |