亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

C標準庫源碼解剖(10):區域設置函數locale.h

2024-07-10 13:27:17
字體:
來源:轉載
供稿:網友

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

 

[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第一個實參可能的值。代碼假設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. /* 獲取數字和貨幣記號的結構  */  
  26. struct lconv  
  27. {  
  28.   /* 數字(非幣值)信息  */  
  29.   char *decimal_point;      /* 數字的小數點號  */  
  30.   char *thousands_sep;      /* 數字的千分組分隔符  */  
  31.   /* 每個元素為相應組中的數字位數,索引越高的元素越靠左邊。一個值為CHAR_MAX的元素表示沒有更多 
  32.       的分組了。一個值為0的元素表示前面的元素能用在靠左邊的所有分組中 */  
  33.   char *grouping;  /* 數字分組分隔符 */  
  34.   /* 貨幣信息  */  
  35.   /* 前面的三個字符ISO 4217中規定的貨幣符號,第四個字符是分隔符,第五個字符是'/0' */  
  36.   char *int_curr_symbol;  
  37.   char *currency_symbol;    /* 本地貨幣符號  */  
  38.   char *mon_decimal_point;  /* 貨幣的小數點號  */  
  39.   char *mon_thousands_sep;  /* 傾向的千分組分隔符  */  
  40.   char *mon_grouping;       /* 類似于grouping元素(參考上面)  */  
  41.   char *positive_sign;      /* 正幣值的符號  */  
  42.   char *negative_sign;      /* 負幣值的符號  */  
  43.   char int_frac_digits;     /* 國際幣值的小數部分  */  
  44.   char frac_digits;     /* 本地幣值的小數部分  */  
  45.   /* 如果currency_symbol放在正幣值之前則為1,否則為0  */  
  46.   char p_cs_precedes;  
  47.   /* 當且僅當currency_symbol與正幣值之間用空格分開時為1  */  
  48.   char p_sep_by_space;  
  49.   /* 如果currency_symbol放在負幣值之前則為1,否則為0  */  
  50.   char n_cs_precedes;  
  51.   /* 當且僅當currency_symbol與負幣值之間用空格分開時為1  */  
  52.   char n_sep_by_space;  
  53.   /* 正值和負值符號的定位: 
  54.      0 用圓括號括住數量和currency_symbol 
  55.      1 正負號放在數量和currency_symbol之前 
  56.      2 正負號放在數量和currency_symbol之后 
  57.      3 正負號正好放在currency_symbol之前 
  58.      4 正負號正好放在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.   /* 當且僅當int_curr_symbol與正幣值之間用空格分開時為1  */  
  65.   char int_p_sep_by_space;  
  66.   /* 如果int_curr_symbol放在負幣值之前則為1,否則為0   */  
  67.   char int_n_cs_precedes;  
  68.   /* 當且僅當int_curr_symbol與負幣值之間用空格分開時為1  */  
  69.   char int_n_sep_by_space;  
  70.   /* 正值和負值符號的定位: 
  71.      0 用圓括號括住數量和int_curr_symbol 
  72.      1 正負號放在數量和int_curr_symbol之前 
  73.      2 正負號放在數量和int_curr_symbol之后 
  74.      3 正負號正好放在int_curr_symbol之前 
  75.      4 正負號正好放在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. /* 設置或返回當前的區域特性  */  
  89. extern char *setlocale (int __category, __const char *__locale) __THROW;  
  90. /* 返回當前區域中的數字和貨幣信息  */  
  91. extern struct lconv *localeconv (void) __THROW;  
  92. __END_NAMESPACE_STD  
  93.   
  94. /* 下面是一些擴展 */  
  95. __END_DECLS  
  96. #endif /* locale.h  */  

 

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

 

[cpp] view plaincopy
  1. /* localeconv.c:localeconv函數的實現  */  
  2. #include <locale.h>  
  3. #include "localeinfo.h"  
  4. #include <shlib-compat.h>  
  5. /* 返回當前區域中的數字和貨幣信息  */  
  6. struct lconv *  
  7. __localeconv (void)  
  8. {  
  9.   static struct lconv result; /* 用于保存返回值的lconv類型實例 */  
  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  

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩午夜视频在线观看| 日韩久久精品电影| 日韩高清电影好看的电视剧电影| 成人免费在线网址| 日日骚av一区| 欧美电影院免费观看| 国产精品视频导航| 精品国产1区2区| 日韩av影视综合网| 国产精品18久久久久久首页狼| 亚洲欧美另类人妖| 亚洲缚视频在线观看| 欧美日韩免费区域视频在线观看| 日韩在线精品一区| 欧美日韩国产在线| 国产成人一区三区| 亚洲精品视频在线观看视频| 精品中文字幕久久久久久| 国产精品免费久久久久影院| 国产一区二区三区在线播放免费观看| 欧美日韩国产中文精品字幕自在自线| 91香蕉国产在线观看| 欧美大片网站在线观看| 欧美日韩视频在线| 国产91精品久久久久久久| 91网站在线看| 亚洲欧美在线免费观看| 欧美高清激情视频| 久久免费福利视频| 国产精品视频一区二区三区四| 国产99久久精品一区二区永久免费| 91老司机在线| 亚洲性猛交xxxxwww| 欧美日韩成人在线视频| 亚洲欧洲在线免费| 成人在线播放av| 国模吧一区二区| www.久久草.com| 国产成人一区二区三区小说| 成人女保姆的销魂服务| 91视频88av| 国产日韩欧美在线播放| 色偷偷av亚洲男人的天堂| 国产日韩专区在线| 中文字幕免费国产精品| 精品中文字幕乱| www日韩中文字幕在线看| 97久久久免费福利网址| 精品女同一区二区三区在线播放| 久久精品小视频| 欧洲午夜精品久久久| 久久久久成人精品| 精品国产欧美成人夜夜嗨| 欧美日韩另类在线| 91色视频在线导航| 国产精品大片wwwwww| 久久久久久久电影一区| 69av成年福利视频| 亚洲日韩中文字幕在线播放| 欧美黄色片在线观看| 伊人伊成久久人综合网站| 欧美精品videossex88| 国产在线精品一区免费香蕉| 精品亚洲一区二区| 国产精品手机播放| 亚洲第一福利视频| 亚洲国产精品高清久久久| 国产精品网站视频| 久久精品视频在线播放| 国产91ⅴ在线精品免费观看| 亚洲精选中文字幕| 国产欧美日韩精品丝袜高跟鞋| 亚洲精品白浆高清久久久久久| 伊人久久综合97精品| 日韩网站免费观看高清| 日韩中文在线不卡| 亚洲精品美女久久久| 国产69精品久久久久9| 国产精品国产三级国产专播精品人| 日韩av电影在线网| 国产视频在线观看一区二区| 国产成人av网址| 国产精品高潮呻吟久久av无限| 欧美精品成人91久久久久久久| 久久黄色av网站| 日韩av在线一区| 国产精品黄色影片导航在线观看| 91精品视频在线免费观看| 欧美第一黄网免费网站| 亚洲电影免费观看高清完整版在线观看| 国产精品久久久久不卡| 亚洲欧美激情视频| 亚洲香蕉伊综合在人在线视看| 亚洲一区二区三区视频| 欧美日韩中文在线观看| 亚洲综合在线播放| 午夜欧美大片免费观看| 日本高清久久天堂| 黑人极品videos精品欧美裸| 色综合91久久精品中文字幕| 欧美综合一区第一页| 国产精品综合网站| 在线观看久久久久久| 国产成人精品免费久久久久| 黄色成人在线免费| 伊人久久五月天| 国内免费久久久久久久久久久| 国产精品欧美亚洲777777| 国产精品18久久久久久麻辣| 亚洲女人初尝黑人巨大| 欧美美女18p| 全色精品综合影院| 疯狂蹂躏欧美一区二区精品| 91日本视频在线| 中文字幕亚洲图片| 在线精品国产欧美| 久久久国产视频91| 91久久久精品| 久久影视三级福利片| 欧美成人久久久| 国产精品99久久久久久白浆小说| 亚洲缚视频在线观看| 亚洲综合av影视| 欧美巨猛xxxx猛交黑人97人| 久久精品最新地址| 久久99久久亚洲国产| 色哟哟网站入口亚洲精品| 欧美高清在线观看| 91精品国产91久久久久久吃药| 亚洲理论片在线观看| 日韩中文字幕国产精品| 久久精品99久久香蕉国产色戒| 亚洲午夜久久久久久久| 国产不卡视频在线| 亚洲性无码av在线| 日韩欧美视频一区二区三区| 热久久这里只有精品| 日韩在线观看免费全集电视剧网站| 国产aⅴ夜夜欢一区二区三区| 韩国日本不卡在线| 亚洲欧美日韩直播| 欧美成人精品激情在线观看| 日韩美女主播视频| 亚洲一区二区三区久久| 亚洲视频在线播放| 日韩精品在线免费观看视频| 精品国产91久久久久久| 91精品免费久久久久久久久| 欧美亚洲国产成人精品| 亚洲japanese制服美女| 亚洲偷熟乱区亚洲香蕉av| 国产精品96久久久久久| 日韩精品小视频| 国产一区二区三区高清在线观看| 亚洲天堂日韩电影| 555www成人网| 国产精品欧美日韩| 最近2019中文免费高清视频观看www99| 成人av番号网| 视频在线观看一区二区| 久久国产精品亚洲| 不卡av在线播放| 国产精品狠色婷| 欧美最顶级丰满的aⅴ艳星|