8

我的程序打印出巨大的数字——比如 100363443,高达一万亿——而且有点难以阅读,所以我想以易于阅读的形式打印任何数字。

现在我用

printf ("%10ld", number);

格式

我会很感激使用 printf 得到的数字。我的大部分代码都是 c++,但我不想引入 std::cout,因为我已经有了 printf

谢谢

4

6 回答 6

12

apostrophe如果您有该选项可用并且不介意失去一点可移植性,请在 printf 格式字符串中使用非标准标志。

根据我的文档,该标志自 1997 年以来'可用于POSIX系统。

如果你在 Unix、Linux、Mac 上……你应该没问题
如果你在 Windows、DOS、iSeries、Android 上……所有的赌注都没有(但也许你可以在你的系统上安装一个 POSIX 层) .

#include <locale.h>
#include <stdio.h>

int main(void) {
  long int x = 130006714000000;

  setlocale(LC_NUMERIC, "en_US.utf-8"); /* important */
  while (x > 0) {
    printf("# %%'22ld: %'22ld\n", x); /* apostrophe flag */
    x *= 2; /* on my machine, the Undefined Behaviour for overflow
            // makes the number become negative with no ill effects */
  }
  return 0;
}

在我的系统上,这个程序产生:

# %'22ld:    130,006,714,000,000
# %'22ld:    260,013,428,000,000
# %'22ld:    520,026,856,000,000
# %'22ld:  1,040,053,712,000,000
# %'22ld:  2,080,107,424,000,000
# %'22ld:  4,160,214,848,000,000
# %'22ld:  8,320,429,696,000,000
# %'22ld: 16,640,859,392,000,000
# %'22ld: 33,281,718,784,000,000
# %'22ld: 66,563,437,568,000,000
# %'22ld: 133,126,875,136,000,000
# %'22ld: 266,253,750,272,000,000
# %'22ld: 532,507,500,544,000,000
# %'22ld: 1,065,015,001,088,000,000
# %'22ld: 2,130,030,002,176,000,000
# %'22ld: 4,260,060,004,352,000,000
# %'22ld: 8,520,120,008,704,000,000
于 2009-09-30T17:35:58.230 回答
9

您可以使用使用 k、m 等后缀的 humanize_number() 来省略低位数字。这不是一个标准的例程,所以你应该 d/l 我链接到的来源。(2 条款 BSD 许可证,允许任何类型的使用。)

Humanize_number 手册页

来自NetBSD的Humanize_number 源代码

HUMANIZE_NUMBER(3)      NetBSD Library Functions Manual     HUMANIZE_NUMBER(3)

NAME
     dehumanize_number, humanize_number -- format a number into a human read-
     able form and viceversa

SYNOPSIS
     #include <stdlib.h>

     int
     dehumanize_number(const char *str, int64_t *result);

     int
     humanize_number(char *buf, size_t len, int64_t number,
         const char *suffix, int scale, int flags);

这通过附加后缀来工作,如下所示:

       Suffix    Description    Multiplier
       k         kilo           1024
       M         mega           1048576
       G         giga           1073741824
       T         tera           1099511627776
       P         peta           1125899906842624
       E         exa            1152921504606846976
于 2009-09-30T16:23:02.440 回答
7

简单的方法可能是在输出之前转换为双精度并使用 %e 以指数科学记数法打印它们。尝试这个:

double n = (double)number;
printf("%10.0e", n);
于 2009-09-30T16:19:32.237 回答
6
std::cout << std::setprecision(5) << std::scientific << 100363443.0;

请注意,数字是浮点数

编辑:或者如果你不喜欢科学,我在网上找到了这个:

struct comma : public std::numpunct<char>
{ 
    protected: std::string do_grouping() const { return "\003" ; } 
};

std::cout.imbue( std::locale( std::cout.getloc(), new comma ) );
std::cout << 100363443 << std::endl;

编辑 2:正如 Jerry 所指出的,您不需要上面的逗号类,这本身似乎就足够了(尽管可能存在根本不格式化大数字的语言环境?):

std::cout.imbue( std::locale( "" ) );
std::cout << 100363443 << std::endl;
于 2009-09-30T16:26:13.057 回答
3

记住本地化(特别是如果您正在编写库)。
在欧洲(英国除外),它将是 1.000.000 而不是 1,000,000

于 2009-09-30T16:26:52.307 回答
1

这是我使用语言环境以直接 C 语言编写的示例。仅适用于积极因素。(来自“DiscoVlad”的很多帮助)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <strings.h>


void my_reverse ( char* s ) {
    int c, i, j;
    for (i=0, j= strlen(s)-1;i<j;i++,j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}


char* insert_commas(unsigned long long input ) {
    int i, intlen;
    char* buffer;
    char* formatted;

    intlen = (int) ceil(log10(input * 1.0));
    buffer = (char *) malloc((intlen + 1) * sizeof(char));

    sprintf(buffer, "%llu", input);  // build buffer
    formatted = (char *) malloc((intlen + (int) ceil(intlen/3.0)) * sizeof(char));  // malloc output buffer
    my_reverse(buffer);

    for(i=intlen; i>=0; i--) {
        formatted[strlen(formatted)] = buffer[i];
        if (i%3 == 0 && i<intlen && i > 0) {
            formatted[strlen(formatted)] = ',';
        }
    }
    free(buffer);

    return formatted;
}


int main() {
    char* formatted;

    // don't forget to free(formatted) after each call.
    formatted = insert_commas(123);
    printf("output %s\n", formatted);
    // output 123

    formatted = insert_commas(1234);
    printf("output %s\n", formatted);
    // output 1,234

    formatted = insert_commas(123456);
    printf("output %s\n", formatted);
    // output 123,456

    formatted = insert_commas(1234567);
    printf("output %s\n", formatted);
    // output 1,234,567

    formatted = insert_commas(123456789);
    printf("output %s\n", formatted);
    // output 123,456,789

    formatted = insert_commas(12345678901234567890ull);
    printf("output %s\n", formatted);
    // output 12,345,678,901,234,567,890

}
于 2009-09-30T18:08:39.523 回答