转载自: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_DEFAULT | Default system locale. |
LOCALE_USER_DEFAULT | Default 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,太晚了,明天要上班,睡了先。