从可我怎么用C语言格式的数字1123456789
来1,123,456,789
?我试过使用,printf("%'10d\n", 1123456789);
但这不起作用.
你能告诉我什么吗?解决方案越简单越好.
如果你的printf支持该'
标志,你可以通过适当地设置你的语言环境来做到这一点.例:
#include#include int main(void) { setlocale(LC_NUMERIC, ""); printf("%'d\n", 1123456789); return 0; }
并构建和运行:
$ ./example 1,123,456,789
在Mac OS X和Linux(Ubuntu 10.10)上测试过.
您可以按如下方式递归执行(请注意,INT_MIN
如果您使用的是两个补码,则需要额外的代码来管理它):
void printfcomma2 (int n) { if (n < 1000) { printf ("%d", n); return; } printfcomma2 (n/1000); printf (",%03d", n%1000); } void printfcomma (int n) { if (n < 0) { printf ("-"); n = -n; } printfcomma2 (n); }
一个总结:
用户调用printfcomma
一个整数,负数的特殊情况通过简单地打印" - "并使数字为正(这是不能使用的位INT_MIN
)来处理.
当您输入时printfcomma2
,只有少于1,000的数字才会打印并返回.
否则递归将在下一级调用(因此1,234,567将被调用1,234,然后是1),直到找到小于1,000的数字.
然后将打印该数字,我们将返回递归树,打印逗号和下一个数字.
还有更简洁的版本虽然它在检查每个级别的负数时都做了不必要的处理(并不是因为递归级别的数量有限,这很重要).这是一个完整的测试程序:
#includevoid printfcomma (int n) { if (n < 0) { printf ("-"); printfcomma (-n); return; } if (n < 1000) { printf ("%d", n); return; } printfcomma (n/1000); printf (",%03d", n%1000); } int main (void) { int x[] = {-1234567890, -123456, -12345, -1000, -999, -1, 0, 1, 999, 1000, 12345, 123456, 1234567890}; int *px = x; while (px != &(x[sizeof(x)/sizeof(*x)])) { printf ("%-15d: ", *px); printfcomma (*px); printf ("\n"); px++; } return 0; }
输出是:
-1234567890 : -1,234,567,890 -123456 : -123,456 -12345 : -12,345 -1000 : -1,000 -999 : -999 -1 : -1 0 : 0 1 : 1 999 : 999 1000 : 1,000 12345 : 12,345 123456 : 123,456 1234567890 : 1,234,567,890
对于那些不信任递归的人来说,这是一个迭代解决方案(尽管递归的唯一问题往往是堆栈空间,这在这里不会成为问题,因为即使对于64位整数,它也只有几个级别):
void printfcomma (int n) { int n2 = 0; int scale = 1; if (n < 0) { printf ("-"); n = -n; } while (n >= 1000) { n2 = n2 + scale * (n % 1000); n /= 1000; scale *= 1000; } printf ("%d", n); while (scale != 1) { scale /= 1000; n = n2 / scale; n2 = n2 % scale; printf (",%03d", n); } }
这两个都产生2,147,483,647
了INT_MAX
.
这是一个非常简单的实现.此功能包含任何错误检查,缓冲区大小必须由调用进行验证.它也不适用于负数.这些改进留给读者练习.
void format_commas(int n, char *out) { int c; char buf[20]; char *p; sprintf(buf, "%d", n); c = 2 - strlen(buf) % 3; for (p = buf; *p != 0; p++) { *out++ = *p; if (c == 1) { *out++ = ','; } c = (c + 1) % 3; } *--out = 0; }
Egads!我一直这样做,在linux上使用gcc/g ++和glibc,是的,'运算符可能是非标准的,但我喜欢它的简单性.
#include#include int main() { int bignum=12345678; setlocale(LC_ALL,""); printf("Big number: %'d\n",bignum); return 0; }
给出的输出:
大数:12,345,678
只需记住那里的'setlocale'调用,否则它不会格式化任何东西.