数值字符的格式化

转载自:http://blog.csdn.net/gzlyb/article/details/801796


记得有朋友在CSDN里问如何格式化一个数值字符串,比如"457354745",格式化成"457,354,745.00"。其中有很多朋友给出了自己的解析函数。其实win32 中有现在的api可以解决这个问题。这个api函数就是:

   int GetNumberFormat(
     LCID
 
Locale,                     // locale
     DWORD 
dwFlags,                 // options
     LPCTSTR 
lpValue,                // input number string
     CONST NUMBERFMT *
lpFormat,  // formatting information
     LPTSTR 
lpNumberStr,            // output buffer
     int 
cchNumber                    // size of output buffer
  );

  Locale数值字符的本地格式化。有两个值:

  

LOCALE_SYSTEM_DEFAULTDefault system locale.
LOCALE_USER_DEFAULTDefault user locale

  dwFlags:可以控制函数的行为。如果lpFormat为null,那这个参数必须设置为NULL。

       如果lpFormat为NULL,则可以设置这个参数为LOCALE_NOUSEROVERRIDE来调用系统默认的数值字符格式化。

  比如:

                   char szBuf[100];

                    GetBumberFormat(LOCALE_USER_DEFAULT,
                                                       LOCALE_NOUSEROVERRIDE,
                                                      "57684347",
                                                      0,szBuf,100);

  结果szBuf返回值"57,684,347.00"

   lpFormat:指向NUMBERFMT结构的指针。下面再详细解释.

        lpNumberStr指针一个字符缓冲区,返回已经格式化好的字符。

  cchNumber : lpNumberStr指向的字符缓冲区的大小,以字符计算。

  现在来详细的介绍一下NUMBERFMT结构的成员:

  typedef struct _numberfmt { 
      UINT      
NumDigits
      UINT      
LeadingZero
      UINT      
Grouping
      LPTSTR    
lpDecimalSep
      LPTSTR    
lpThousandSep
      UINT      
NegativeOrder
  } NUMBERFMT, *LPNUMBERFMT;

  NumDigits:小数点的个数

  LeadingZero:前导零。"0001"的前三个零就是前导零.

  Grouping:几个数作为一组。比如"54,678"是三个为一组隔开;"45,67896"是五个为一组...

  lpDecimalSep:指向一个NULL结束的字符串,表示小数和整数部分以什么符号串隔开。

  lpThousandSep:指向一个NULL结束的字符串,表示组与组之间以为什么字符串分开。比如上面是逗号。

  NegativeOrder:负数的模式。有四种,一般设置为1。

  举个例子:

        char szNum[ ] = "785686754";

        char szBuf[100];

  NUMBERFMT nf;

        nf.NumDigits = 2;

        nf.LeadingZero = false;

        nf.Grouping = 4;

        nf.lpThousandSep = ".";

        nf.NegativeOrder = 1;

         GetNumberFormat(LOCALE_USER_DEFAULT,
                                            0,
                                            szNum,
                                            &nf,
                                            szBuf,
                                            100);
     结果szBuf =="7,8568,6754.00"

  更详细的说明请参见msdn,太晚了,明天要上班,睡了先。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值