亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在C中將數字從1123456789格式化為1,123,456,789?

如何在C中將數字從1123456789格式化為1,123,456,789?

繁星點點滴滴 2019-10-10 16:59:24
如何用C語言將數字從格式化1123456789為1,123,456,789?我嘗試使用,printf("%'10d\n", 1123456789);但這不起作用。你能建議什么嗎?解決方案越簡單越好。
查看完整描述

3 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

如果您的printf支持該'標志(POSIX 2008要求printf()),則可以僅通過適當地設置區域設置來實現。例:


#include <stdio.h>

#include <locale.h>


int main(void)

{

    setlocale(LC_NUMERIC, "");

    printf("%'d\n", 1123456789);

    return 0;

}

并運行:


$ ./example 

1,123,456,789

在Mac OS X和Linux(Ubuntu 10.10)上進行了測試。


查看完整回答
反對 回復 2019-10-10
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

您可以按以下方式遞歸執行此操作(請注意,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的數字。

然后將打印該數字,我們將返回遞歸樹,在打印過程中打印逗號和下一個數字。

還有一個更簡潔的版本,盡管它在檢查每個級別的負數時進行了不必要的處理(這并不重要,因為遞歸級別的數量有限)。這是一個完整的測試程序:


#include <stdio.h>


void 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

一個不信任遞歸的迭代解決方案(盡管遞歸的唯一問題往往是堆??臻g,這在這里不會成為問題,因為即使對于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。


查看完整回答
反對 回復 2019-10-10
  • 3 回答
  • 0 關注
  • 1050 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號