prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 12.11

Q如何打印千位分隔的数字?
货币格式的数字呢?


A中的函数<locale.h>开始提供一些支持,但没有标准的 C 函数来完成这两项任务。(在标准 C 中,唯一一项printf响应自定义区域设置所做的操作是更改其小数点字符。)

POSIX 指定了一个strfmon函数,用于以符合区域设置的方式格式化货币数量,并且数字的撇号标志printf格式说明符(例如%'d, %'f)要求逗号分隔的数字。

这是一个用于格式化逗号分隔数字的小例程,如果可用,它会使用区域设置的千位分隔符

#include <locale.h>

char *commaprint(unsigned long n)
{
	static int comma = '\0';
	static char retbuf[30];
	char *p = &retbuf[sizeof(retbuf)-1];
	int i = 0;

	if(comma == '\0') {
		struct lconv *lcp = localeconv();
		if(lcp != NULL) {
			if(lcp->thousands_sep != NULL &&
				*lcp->thousands_sep != '\0')
				comma = *lcp->thousands_sep;
			else	comma = ',';
		}
	}

	*p = '\0';

	do {
		if(i%3 == 0 && i != 0)
			*--p = comma;
		*--p = '0' + n % 10;
		n /= 10;
		i++;
	} while(n != 0);

	return p;
}
(更好的实现将使用grouping字段lconv结构,而不是假定三位一组。一个更安全的尺寸retbuf可能是4*(sizeof(long)*CHAR_BIT+2)/3/3+1;请参阅问题 12.21。)

参考:ISO Sec. 7.4
H&S Sec. 11.6 pp. 301-4


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管