国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

C標(biāo)準(zhǔn)庫源碼解剖(10):區(qū)域設(shè)置函數(shù)locale.h

2024-07-10 13:27:17
字體:
供稿:網(wǎng)友

國家、文化和語言規(guī)則集稱為區(qū)域設(shè)置,locale.h頭文件中定義了區(qū)域設(shè)置相關(guān)的函數(shù)。setlocale函數(shù)用于設(shè)置或返回當(dāng)前的區(qū)域特性,localeconv用于返回當(dāng)前區(qū)域中的數(shù)字和貨幣信息(保存在struct lconv結(jié)構(gòu)實(shí)例中)。setlocale的第一個(gè)實(shí)參指定要改變的區(qū)域行為類別,預(yù)定義的setlocale類別有:
    LC_ALL:所有行為。
    LC_COLLATE:strcoll和strxfrm函數(shù)的行為。
    LC_CTYPE:ctype.h中的字符串處理函數(shù)行為。
    LC_MONETARY:localeconv返回的幣值信息。
    LC_NUMERIC:localeconv返回的小數(shù)點(diǎn)和非幣值信息。
    LC_TIME:strftime函數(shù)的行為。
    locale.h中內(nèi)容如下:

 

[cpp] view plaincopy
  1. /* ISO C99 Standard: 7.11 本地化   <locale.h>  */  
  2. #ifndef _LOCALE_H  
  3. #define _LOCALE_H   1  
  4. #include <features.h>  
  5. #define __need_NULL  
  6. #include <stddef.h>  
  7. #include <bits/locale.h>  
  8. __BEGIN_DECLS  
  9. /* 下面是setlocale第一個(gè)實(shí)參可能的值。代碼假設(shè)LC_*宏的最小值為0 */  
  10. #define LC_CTYPE          __LC_CTYPE  
  11. #define LC_NUMERIC        __LC_NUMERIC  
  12. #define LC_TIME           __LC_TIME  
  13. #define LC_COLLATE        __LC_COLLATE  
  14. #define LC_MONETARY       __LC_MONETARY  
  15. #define LC_MESSAGES       __LC_MESSAGES  
  16. #define LC_ALL        __LC_ALL  
  17. #define LC_PAPER      __LC_PAPER  
  18. #define LC_NAME       __LC_NAME  
  19. #define LC_ADDRESS    __LC_ADDRESS  
  20. #define LC_TELEPHONE      __LC_TELEPHONE  
  21. #define LC_MEASUREMENT    __LC_MEASUREMENT  
  22. #define LC_IDENTIFICATION __LC_IDENTIFICATION  
  23.   
  24. __BEGIN_NAMESPACE_STD  
  25. /* 獲取數(shù)字和貨幣記號的結(jié)構(gòu)  */  
  26. struct lconv  
  27. {  
  28.   /* 數(shù)字(非幣值)信息  */  
  29.   char *decimal_point;      /* 數(shù)字的小數(shù)點(diǎn)號  */  
  30.   char *thousands_sep;      /* 數(shù)字的千分組分隔符  */  
  31.   /* 每個(gè)元素為相應(yīng)組中的數(shù)字位數(shù),索引越高的元素越靠左邊。一個(gè)值為CHAR_MAX的元素表示沒有更多 
  32.       的分組了。一個(gè)值為0的元素表示前面的元素能用在靠左邊的所有分組中 */  
  33.   char *grouping;  /* 數(shù)字分組分隔符 */  
  34.   /* 貨幣信息  */  
  35.   /* 前面的三個(gè)字符ISO 4217中規(guī)定的貨幣符號,第四個(gè)字符是分隔符,第五個(gè)字符是'/0' */  
  36.   char *int_curr_symbol;  
  37.   char *currency_symbol;    /* 本地貨幣符號  */  
  38.   char *mon_decimal_point;  /* 貨幣的小數(shù)點(diǎn)號  */  
  39.   char *mon_thousands_sep;  /* 傾向的千分組分隔符  */  
  40.   char *mon_grouping;       /* 類似于grouping元素(參考上面)  */  
  41.   char *positive_sign;      /* 正幣值的符號  */  
  42.   char *negative_sign;      /* 負(fù)幣值的符號  */  
  43.   char int_frac_digits;     /* 國際幣值的小數(shù)部分  */  
  44.   char frac_digits;     /* 本地幣值的小數(shù)部分  */  
  45.   /* 如果currency_symbol放在正幣值之前則為1,否則為0  */  
  46.   char p_cs_precedes;  
  47.   /* 當(dāng)且僅當(dāng)currency_symbol與正幣值之間用空格分開時(shí)為1  */  
  48.   char p_sep_by_space;  
  49.   /* 如果currency_symbol放在負(fù)幣值之前則為1,否則為0  */  
  50.   char n_cs_precedes;  
  51.   /* 當(dāng)且僅當(dāng)currency_symbol與負(fù)幣值之間用空格分開時(shí)為1  */  
  52.   char n_sep_by_space;  
  53.   /* 正值和負(fù)值符號的定位: 
  54.      0 用圓括號括住數(shù)量和currency_symbol 
  55.      1 正負(fù)號放在數(shù)量和currency_symbol之前 
  56.      2 正負(fù)號放在數(shù)量和currency_symbol之后 
  57.      3 正負(fù)號正好放在currency_symbol之前 
  58.      4 正負(fù)號正好放在currency_symbol之后  */  
  59.   char p_sign_posn;  
  60.   char n_sign_posn;  
  61. #ifdef __USE_ISOC99  
  62.   /* 如果int_curr_symbol放在正幣值之前則為1,否則為0  */  
  63.   char int_p_cs_precedes;  
  64.   /* 當(dāng)且僅當(dāng)int_curr_symbol與正幣值之間用空格分開時(shí)為1  */  
  65.   char int_p_sep_by_space;  
  66.   /* 如果int_curr_symbol放在負(fù)幣值之前則為1,否則為0   */  
  67.   char int_n_cs_precedes;  
  68.   /* 當(dāng)且僅當(dāng)int_curr_symbol與負(fù)幣值之間用空格分開時(shí)為1  */  
  69.   char int_n_sep_by_space;  
  70.   /* 正值和負(fù)值符號的定位: 
  71.      0 用圓括號括住數(shù)量和int_curr_symbol 
  72.      1 正負(fù)號放在數(shù)量和int_curr_symbol之前 
  73.      2 正負(fù)號放在數(shù)量和int_curr_symbol之后 
  74.      3 正負(fù)號正好放在int_curr_symbol之前 
  75.      4 正負(fù)號正好放在int_curr_symbol之后  */  
  76.   char int_p_sign_posn;  
  77.   char int_n_sign_posn;  
  78. #else  
  79.   char __int_p_cs_precedes;  
  80.   char __int_p_sep_by_space;  
  81.   char __int_n_cs_precedes;  
  82.   char __int_n_sep_by_space;  
  83.   char __int_p_sign_posn;  
  84.   char __int_n_sign_posn;  
  85. #endif  
  86. };  
  87.   
  88. /* 設(shè)置或返回當(dāng)前的區(qū)域特性  */  
  89. extern char *setlocale (int __category, __const char *__locale) __THROW;  
  90. /* 返回當(dāng)前區(qū)域中的數(shù)字和貨幣信息  */  
  91. extern struct lconv *localeconv (void) __THROW;  
  92. __END_NAMESPACE_STD  
  93.   
  94. /* 下面是一些擴(kuò)展 */  
  95. __END_DECLS  
  96. #endif /* locale.h  */  

 

    setlocale函數(shù)的實(shí)現(xiàn)代碼比較復(fù)雜,這里就不解剖了。localeconv函數(shù)的代碼比較簡單,它先創(chuàng)建一個(gè)struct lconv實(shí)例result用來保存返回的信息,然后用編譯器的內(nèi)部宏來獲取數(shù)字和貨幣的各個(gè)成員值,存入result中,然后返回。如下:

 

[cpp] view plaincopy
  1. /* localeconv.c:localeconv函數(shù)的實(shí)現(xiàn)  */  
  2. #include <locale.h>  
  3. #include "localeinfo.h"  
  4. #include <shlib-compat.h>  
  5. /* 返回當(dāng)前區(qū)域中的數(shù)字和貨幣信息  */  
  6. struct lconv *  
  7. __localeconv (void)  
  8. {  
  9.   static struct lconv result; /* 用于保存返回值的lconv類型實(shí)例 */  
  10.   result.decimal_point = (char *) _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT);  
  11.   result.thousands_sep = (char *) _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP);  
  12.   result.grouping = (char *) _NL_CURRENT (LC_NUMERIC, GROUPING);  
  13.   if (*result.grouping == CHAR_MAX || *result.grouping == (char) -1)  
  14.     result.grouping = (char *) "";  
  15.   result.int_curr_symbol = (char *) _NL_CURRENT (LC_MONETARY, INT_CURR_SYMBOL);  
  16.   result.currency_symbol = (char *) _NL_CURRENT (LC_MONETARY, CURRENCY_SYMBOL);  
  17.   result.mon_decimal_point = (char *) _NL_CURRENT (LC_MONETARY,  
  18.                            MON_DECIMAL_POINT);  
  19.   result.mon_thousands_sep = (char *) _NL_CURRENT (LC_MONETARY,  
  20.                            MON_THOUSANDS_SEP);  
  21.   result.mon_grouping = (char *) _NL_CURRENT (LC_MONETARY, MON_GROUPING);  
  22.   if (*result.mon_grouping == CHAR_MAX || *result.mon_grouping == (char) -1)  
  23.     result.mon_grouping = (char *) "";  
  24.   result.positive_sign = (char *) _NL_CURRENT (LC_MONETARY, POSITIVE_SIGN);  
  25.   result.negative_sign = (char *) _NL_CURRENT (LC_MONETARY, NEGATIVE_SIGN);  
  26.   result.int_frac_digits = *(char *) _NL_CURRENT (LC_MONETARY,  
  27.                           INT_FRAC_DIGITS);  
  28.   result.frac_digits = *(char *) _NL_CURRENT (LC_MONETARY, FRAC_DIGITS);  
  29.   result.p_cs_precedes = *(char *) _NL_CURRENT (LC_MONETARY, P_CS_PRECEDES);  
  30.   result.p_sep_by_space = *(char *) _NL_CURRENT (LC_MONETARY, P_SEP_BY_SPACE);  
  31.   result.n_cs_precedes = *(char *) _NL_CURRENT (LC_MONETARY, N_CS_PRECEDES);  
  32.   result.n_sep_by_space = *(char *) _NL_CURRENT (LC_MONETARY, N_SEP_BY_SPACE);  
  33.   result.p_sign_posn = *(char *) _NL_CURRENT (LC_MONETARY, P_SIGN_POSN);  
  34.   result.n_sign_posn = *(char *) _NL_CURRENT (LC_MONETARY, N_SIGN_POSN);  
  35.   result.int_p_cs_precedes = *(char *) _NL_CURRENT (LC_MONETARY,  
  36.                             INT_P_CS_PRECEDES);  
  37.   result.int_p_sep_by_space = *(char *) _NL_CURRENT (LC_MONETARY,  
  38.                              INT_P_SEP_BY_SPACE);  
  39.   result.int_n_cs_precedes = *(char *) _NL_CURRENT (LC_MONETARY,  
  40.                             INT_N_CS_PRECEDES);  
  41.   result.int_n_sep_by_space = *(char *) _NL_CURRENT (LC_MONETARY,  
  42.                              INT_N_SEP_BY_SPACE);  
  43.   result.int_p_sign_posn = *(char *) _NL_CURRENT (LC_MONETARY,  
  44.                           INT_P_SIGN_POSN);  
  45.   result.int_n_sign_posn = *(char *) _NL_CURRENT (LC_MONETARY,  
  46.                           INT_N_SIGN_POSN);  
  47.   return &result;  
  48. }  
  49. versioned_symbol (libc, __localeconv, localeconv, GLIBC_2_2);  
  50. #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)  
  51. strong_alias (__localeconv, __localeconv20)  
  52. compat_symbol (libc, __localeconv20, localeconv, GLIBC_2_0);  
  53. #endif  

 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 江源县| 达日县| 通江县| 临潭县| 白水县| 河源市| 辉县市| 西青区| 弥渡县| 法库县| 镇坪县| 长宁县| 深泽县| 象山县| 宝丰县| 新密市| 贵定县| 淳化县| 沁源县| 秀山| 建水县| 肇东市| 兖州市| 英德市| 大邑县| 宽甸| 攀枝花市| 甘德县| 高安市| 南陵县| SHOW| 闽清县| 东莞市| 平果县| 万山特区| 澄江县| 平舆县| 东平县| 北辰区| 衡阳县| 清涧县|