头文件<locale.h>

头文件<locale.h>定义了特定地域的设置,如日期格式和货币符号。

<locale.h>中声明了两个函数和一个类型,并且定义了一些宏。

Linux version 2.6.32-573.el6.x86_64中的<locale.h>源码:

/* Copyright (C) 1991,1992,1995-2002,2007,2009 Free Software Foundation, Inc.
This file is part of the GNU C Library.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

/*
* ISO C99 Standard: 7.11 Localization <locale.h>
*/

#ifndef _LOCALE_H
#define _LOCALE_H 1

#include <features.h>

#define __need_NULL
#include <stddef.h>
#include <bits/locale.h>

__BEGIN_DECLS

/* These are the possibilities for the first argument to setlocale.
The code assumes that the lowest LC_* symbol has the value zero. */
#define LC_CTYPE __LC_CTYPE
#define LC_NUMERIC __LC_NUMERIC
#define LC_TIME __LC_TIME
#define LC_COLLATE __LC_COLLATE
#define LC_MONETARY __LC_MONETARY
#define LC_MESSAGES __LC_MESSAGES
#define LC_ALL __LC_ALL
#define LC_PAPER __LC_PAPER
#define LC_NAME __LC_NAME
#define LC_ADDRESS __LC_ADDRESS
#define LC_TELEPHONE __LC_TELEPHONE
#define LC_MEASUREMENT __LC_MEASUREMENT
#define LC_IDENTIFICATION __LC_IDENTIFICATION

__BEGIN_NAMESPACE_STD

/* Structure giving information about numeric and monetary notation. */
struct lconv
{

/* Numeric (non-monetary) information. */

char *decimal_point; /* Decimal point character. */
char *thousands_sep; /* Thousands separator. */
/* Each element is the number of digits in each group;
elements with higher indices are farther left.
An element with value CHAR_MAX means that no further grouping is done.
An element with value 0 means that the previous element is used
for all groups farther left. */
char *grouping;

/* Monetary information. */

/* First three chars are a currency symbol from ISO 4217.
Fourth char is the separator. Fifth char is ‘\0‘. */
char *int_curr_symbol;
char *currency_symbol; /* Local currency symbol. */
char *mon_decimal_point; /* Decimal point character. */
char *mon_thousands_sep; /* Thousands separator. */
char *mon_grouping; /* Like `grouping‘ element (above). */
char *positive_sign; /* Sign for positive values. */
char *negative_sign; /* Sign for negative values. */
char int_frac_digits; /* Int‘l fractional digits. */
char frac_digits; /* Local fractional digits. */
/* 1 if currency_symbol precedes a positive value, 0 if succeeds. */
char p_cs_precedes;
/* 1 iff a space separates currency_symbol from a positive value. */
char p_sep_by_space;
/* 1 if currency_symbol precedes a negative value, 0 if succeeds. */
char n_cs_precedes;
/* 1 iff a space separates currency_symbol from a negative value. */
char n_sep_by_space;
/* Positive and negative sign positions:
0 Parentheses surround the quantity and currency_symbol.
1 The sign string precedes the quantity and currency_symbol.
2 The sign string follows the quantity and currency_symbol.
3 The sign string immediately precedes the currency_symbol.
4 The sign string immediately follows the currency_symbol. */
char p_sign_posn;
char n_sign_posn;
#ifdef __USE_ISOC99
/* 1 if int_curr_symbol precedes a positive value, 0 if succeeds. */
char int_p_cs_precedes;
/* 1 iff a space separates int_curr_symbol from a positive value. */
char int_p_sep_by_space;
/* 1 if int_curr_symbol precedes a negative value, 0 if succeeds. */
char int_n_cs_precedes;
/* 1 iff a space separates int_curr_symbol from a negative value. */
char int_n_sep_by_space;
/* Positive and negative sign positions:
0 Parentheses surround the quantity and int_curr_symbol.
1 The sign string precedes the quantity and int_curr_symbol.
2 The sign string follows the quantity and int_curr_symbol.
3 The sign string immediately precedes the int_curr_symbol.
4 The sign string immediately follows the int_curr_symbol. */

char int_p_sign_posn;
char int_n_sign_posn;
#else
char __int_p_cs_precedes;
char __int_p_sep_by_space;
char __int_n_cs_precedes;
char __int_n_sep_by_space;
char __int_p_sign_posn;
char __int_n_sign_posn;
#endif
};

/* Set and/or return the current locale. */
extern char *setlocale (int __category, __const char *__locale) __THROW;

/* Return the numeric/monetary information for the current locale. */
extern struct lconv *localeconv (void) __THROW;

__END_NAMESPACE_STD

#ifdef __USE_XOPEN2K8
/* The concept of one static locale per category is not very well
thought out. Many applications will need to process its data using
information from several different locales. Another application is
the implementation of the internationalization handling in the
upcoming ISO C++ standard library. To support this another set of
the functions using locale data exist which have an additional
argument.

Attention: all these functions are *not* standardized in any form.
This is a proof-of-concept implementation. */

/* Get locale datatype definition. */
# include <xlocale.h>

/* Return a reference to a data structure representing a set of locale
datasets. Unlike for the CATEGORY parameter for `setlocale‘ the
CATEGORY_MASK parameter here uses a single bit for each category,
made by OR‘ing together LC_*_MASK bits above. */
extern __locale_t newlocale (int __category_mask, __const char *__locale,
__locale_t __base) __THROW;

/* These are the bits that can be set in the CATEGORY_MASK argument to
`newlocale‘. In the GNU implementation, LC_FOO_MASK has the value
of (1 << LC_FOO), but this is not a part of the interface that
callers can assume will be true. */
# define LC_CTYPE_MASK (1 << __LC_CTYPE)
# define LC_NUMERIC_MASK (1 << __LC_NUMERIC)
# define LC_TIME_MASK (1 << __LC_TIME)
# define LC_COLLATE_MASK (1 << __LC_COLLATE)
# define LC_MONETARY_MASK (1 << __LC_MONETARY)
# define LC_MESSAGES_MASK (1 << __LC_MESSAGES)
# define LC_PAPER_MASK (1 << __LC_PAPER)

# define LC_NAME_MASK (1 << __LC_NAME)
# define LC_ADDRESS_MASK (1 << __LC_ADDRESS)
# define LC_TELEPHONE_MASK (1 << __LC_TELEPHONE)
# define LC_MEASUREMENT_MASK (1 << __LC_MEASUREMENT)
# define LC_IDENTIFICATION_MASK (1 << __LC_IDENTIFICATION)
# define LC_ALL_MASK (LC_CTYPE_MASK \
| LC_NUMERIC_MASK \
| LC_TIME_MASK \
| LC_COLLATE_MASK \
| LC_MONETARY_MASK \
| LC_MESSAGES_MASK \
| LC_PAPER_MASK \
| LC_NAME_MASK \
| LC_ADDRESS_MASK \
| LC_TELEPHONE_MASK \
| LC_MEASUREMENT_MASK \
| LC_IDENTIFICATION_MASK \
)

/* Return a duplicate of the set of locale in DATASET. All usage
counters are increased if necessary. */
extern __locale_t duplocale (__locale_t __dataset) __THROW;

/* Free the data associated with a locale dataset previously returned
by a call to `setlocale_r‘. */
extern void freelocale (__locale_t __dataset) __THROW;

/* Switch the current thread‘s locale to DATASET.
If DATASET is null, instead just return the current setting.
The special value LC_GLOBAL_LOCALE is the initial setting
for all threads and can also be installed any time, meaning
the thread uses the global settings controlled by `setlocale‘. */
extern __locale_t uselocale (__locale_t __dataset) __THROW;

/* This value can be passed to `uselocale‘ and may be returned by it.
Passing this value to any other function has undefined behavior. */
# define LC_GLOBAL_LOCALE ((__locale_t) -1L)

#endif

__END_DECLS

#endif /* locale.h */

1、宏:

LC_ALL  设置下面的所有选项。

LC_COLLATE  影响 strcoll 和 strxfrm 函数。

LC_CTYPE  影响所有字符函数

LC_MONETARY  影响 localeconv 函数提供的货币信息。

LC_NUMERIC  影响 localeconv 函数提供的小数点格式化和信息。

LC_TIME  影响 strftime 函数。

2、结构:

struct lconv {
char *decimal_point;  //用于非货币值的小数点字符。
char *thousands_sep;  //用于非货币值的千位分隔符。
char *grouping;   //表示非货币量中每组数字大小的字符串。值为 0 意味着前一个值将应用于剩余的分组。
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;    //如果等于 1,则 currency_symbol 出现在正货币值之前。如果等于 0,则 currency_symbol 出现在正货币值之后。
char p_sep_by_space;    //如果等于 1,则 currency_symbol 和正货币值之间使用空格分隔。如果等于 0,则 currency_symbol 和正货币值之间不使用空格分隔。
char n_cs_precedes;    //如果等于 1,则 currency_symbol 出现在负货币值之前。如果等于 0,则 currency_symbol 出现在负货币值之后。
char n_sep_by_space;    //如果等于 1,则 currency_symbol 和负货币值之间使用空格分隔。如果等于 0,则 currency_symbol 和负货币值之间不使用空格分隔。
char p_sign_posn;    //表示正货币值中正号的位置。
char n_sign_posn;    //表示负货币值中负号的位置。
} ;

3、函数:

3.1函数setlocale被用来修改或查询程序当前的整个区域设置或者其中的一部分

char * setlocale(int category,const char *locale);

参数:category为LC_ALL,LC_COLLATE等。locale若是空字符串 "",则会使用系统环境变量的 locale 。若 locale 为零(NULL),则不会改变地域化配置,返回当前的地域值,若系统尚未实作则返回 false。

返回值:成功,返回相应设置的地域化信息。字符串可能分配在静态存储区。失败,返回NULL

3.2函数localeconv获得包含本地数字及货币信息格式的数组

struct lconv *localeconv(void);

功能:返回当前地域设置的信息

返回值:返回一个指向struct lconv 类型结构体的指针。

例:

#include <assert.h>
#include <limits.h>
#include <locale.h>
#include <stdio.h>
#include <string.h>

static void testclocale(struct lconv *p)
{
assert(strcmp(p->currency_symbol,"")==0);
assert(strcmp(p->decimal_point,".")==0);
assert(strcmp(p->grouping,"")==0);
assert(strcmp(p->int_curr_symbol,"")==0);
assert(strcmp(p->mon_decimal_point,"")==0);
assert(strcmp(p->mon_grouping,"")==0);
assert(strcmp(p->mon_thousands_sep,"")==0);
assert(strcmp(p->negative_sign,"")==0);
assert(strcmp(p->positive_sign,"")==0);
assert(strcmp(p->thousands_sep,"")==0);
assert(p->frac_digits==CHAR_MAX);
assert(p->int_frac_digits==CHAR_MAX);
assert(p->n_cs_precedes==CHAR_MAX);
assert(p->n_sep_by_space==CHAR_MAX);
assert(p->n_sign_posn==CHAR_MAX);
assert(p->p_cs_precedes==CHAR_MAX);
assert(p->p_sep_by_space==CHAR_MAX);
assert(p->p_sign_posn==CHAR_MAX);
}

int main()
{
static int cats[]={LC_ALL,LC_COLLATE,LC_CTYPE,LC_MONETARY,LC_NUMERIC,LC_TIME};
struct lconv *p=NULL;
char buf[32],*s;

assert((p=localeconv())!=NULL);
testclocale(p);
assert((s=setlocale(LC_ALL,NULL))!=NULL);
assert(localeconv()!=NULL);
assert((s=setlocale(LC_MONETARY,"C"))!=NULL);
puts(strcmp(s,"C")?"Native local differs from \"C\"":"Native locale same as \"C\"");
assert(setlocale(LC_NUMERIC,"C")!=NULL);
assert((p=localeconv())!=NULL);
testclocale(p);
assert(setlocale(LC_ALL,buf)!=NULL);
assert((p=localeconv())!=NULL);
testclocale(p);
puts("sucess testing <locale.h>");
return (0);
}

时间: 2024-08-10 13:30:30

头文件<locale.h>的相关文章

头文件&lt;stddef.h&gt;

头文件<stddef.h>定义了各种变量类型和宏.这些定义中的大部分也出现在其它头文件中. 1.类型:ptrdiff_t 是指两个指针相减的结果的有符号整数类型size_t 是sizeof操作符的结果的无符号整数类型wchar_t 是一个整值类型,它范围内的值可以表示最大扩展字符集中所有成员的不用编码值,而该字符集是由支持它的区域设置指定的.空字符的编码值应该为02.宏:NULL 展开为实现定义的空指针常量 offsetof 展开为一个size_t类型的整值常量表达式,它的值是从结构的起始位置

头文件&lt;stdio.h&gt;

头文件<stdio.h>声明了三种类型,一些宏和很多执行输入输出的函数.1.类型:FILE 它是一个对象类型,可以记录控制流需要的所有信息,包括它的文件定位符.指向相关的缓冲的指针.记录是否发生了读/写错误的错误指示符和记录文件是否结束的文件结束符.fpos_t 它是一个对象类型,可以唯一指定文件中的每一个位置所需的所有信息.size_t 这是无符号整数类型,它是sizeof关键字的结果.2.宏:NULL 这个宏是一个空指针常量的值._IOFBF._IOLBF.IONBF 这些宏扩展了带有特定

头文件&lt;setjmp.h&gt;

头文件<setjmp.h>定义了宏setjmp,并且为了绕过正常的函数调用和返回规则声明了一个函数和一个类型. 1.类型jmp_buf 它是一个数组类型,适合存储恢复一个调用环境所需的信息. 2.宏setjmp int setjmp(jmp_buf env); 说明:宏setjmp将它的调用环境保存在它的jmp_buf类型的参数中,以供后面longjmp使用. 返回值:如果返回一个来自直接的调用,则宏setjmp返回0:如果返回一个来自longjmp的调用,则宏setjmp返回一个非0值. 3

头文件&lt;ctype.h&gt;

头文件<ctype.h>声明了可以用于识别和转换字符的函数. 一.字符判断函数: 1.函数isalnum int isalnum(int c); 功能:判断变量c是否为字母或数字 返回值:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零. 2.函数isalpha int isalpha(int c); 功能:判断变量c是否为英文字母 返回值:字母返回非0,不是字母返回0. 3.函数iscntrl int iscntrl(int c); 功能:判断字符c是否为控制字符 返回值:当c

C++中#include包含头文件带 .h 和不带 .h 的区别

C++中#include包含头文件带 .h 和不带 .h 的区别? 如 #include <iostream> 和 #include <iostream.h> 包含的东西有哪些不同? 之前在写C++程序的时候只知道使用 #include <iostream> 的时候,使用函数前要用 using namespace std; 导入命名空间,而 #include <iostream.h> 则不用,这个得看C+ +标准化过程为C++开发者做了哪些有意义的工作. (

c 头文件&lt;ctype.h&gt;(一)

头文件<ctype.h>中声明了一些测试字符的函数. 每个函数的参数均为int类型,参数的值必须是EOF或可用unsigned char类型表示的字符,函数返回值为int类型. 如果参数c满足指定的条件,则函数返回非0值(表示真),否则返回0(表示假). 这些函数包括: 1.isalnum(c) 函数isalpha(c)或isdigit(c)为真 2.isalpha(c) 函数isupper(c)或者islower(c)为真 3.iscntrl(c) c为控制符 4.isdigit(c) c为

头文件&lt;stdlib.h&gt;

头文件<stdlib.h>被发明的目的是为了定义和声明那些没有明显的归属地宏和函数.它声明了4中类型和几个具有一般功能的函数,还定义了几个宏1.类型:size_t 这是无符号整数类型,它是sizeof关键字的结果.wchar_t 这是一个宽字符常量大小的整数类型.div_t 这是div函数返回的结构.ldiv_t 这是ldiv函数返回的结构.2.宏:NULL 这个宏是一个空指针常量的值.EXIT_FAILURE 这是 exit 函数失败时要返回的值.EXIT_SUCCESS 这是 exit 函

头文件&lt;math.h&gt;

头文件<math.h>声明了一些数学函数并定义了一个宏. 1.函数acos double acos(double x); 说明:acos计算x的三角反余弦函数主值,如果x不在[-1,+1]内,则发生定义域错误 返回值:返回[0,180]范围内的x的反余弦值. 2.函数asin double asin(double x); 说明:asin计算x的三角反正弦函数主值,如果x不在[-1,+1]内,则发生定义域错误 返回值:返回[-90,+90]范围内的x的反正弦值. 3.函数atan double

头文件&lt;string.h&gt;

头文件<string.h>声明了一种类型和几个函数,并且定义了一个宏.1.类型:size_t 这是无符号整数类型,它是 sizeof 关键字的结果.2.宏:NULL 这个宏是一个空指针常量的值.3.函数:3.1复制函数void *memcpy(void *dest,const void *src,size_t n);说明:从 src 复制 n 个字符到 dest.参数:dest -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针. src -- 指向要复制的数据源,类型强制