104 Stimmen

Wie formatiert man eine Zahl von 1123456789 bis 1.123.456.789 in C?

Wie kann ich in der Sprache C eine Zahl von 1123456789 a 1,123,456,789 ? Ich habe versucht, mit printf("%'10d\n", 1123456789); aber das funktioniert nicht.

Können Sie etwas empfehlen? Je einfacher die Lösung ist, desto besser.

1voto

Frank Abbing Punkte 31
#include <stdio.h>

void punt(long long n){
    char s[28];
    int i = 27;
    if(n<0){n=-n; putchar('-');} 
    do{
        s[i--] = n%10 + '0';
        if(!(i%4) && n>9)s[i--]='.';
        n /= 10;
    }while(n);
    puts(&s[++i]);
}

int main(){
    punt(2134567890);
    punt(987);
    punt(9876);
    punt(-987);
    punt(-9876);
    punt(-654321);
    punt(0);
    punt(1000000000);
    punt(0x7FFFFFFFFFFFFFFF);
    punt(0x8000000000000001); // -max + 1 ...
}

In meiner Lösung wird ein . statt eines , Es bleibt dem Leser überlassen, dies zu ändern.

1voto

user1683793 Punkte 1155

Diese Frage ist alt und es gibt viele Antworten, aber die Frage war nicht "wie kann ich eine Routine schreiben, um Kommas hinzuzufügen", sondern "wie kann das in C gemacht werden"? Die Kommentare wiesen in diese Richtung, aber auf meinem Linux-System mit GCC funktioniert das bei mir:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
    unsetenv("LC_ALL");
    setlocale(LC_NUMERIC, "");
    printf("%'lld\n", 3141592653589);
}

Wenn dies ausgeführt wird, erhalte ich:

$ cc -g comma.c -o comma && ./comma
3,141,592,653,589

Wenn ich die Option LC_ALL vor der Ausführung des Programms die Variable unsetenv ist nicht erforderlich.

1voto

Roland Pihlakas Punkte 4010

Meine Antwort formatiert das Ergebnis nicht genau so wie die Illustration in der Frage, aber kann den tatsächlichen Bedarf decken in einigen Fällen mit einem einfachen Einzeiler oder Makro. Man kann es erweitern, um mehr Tausendergruppen zu erzeugen.

Das Ergebnis sieht dann zum Beispiel wie folgt aus:

Value: 0'000'012'345

Der Code:

printf("Value: %llu'%03lu'%03lu'%03lu\n", (value / 1000 / 1000 / 1000), (value / 1000 / 1000) % 1000, (value / 1000) % 1000, value % 1000);

0voto

K.tin Punkte 357

Ich bin neu in der C-Programmierung. Hier ist mein einfacher Code.

int main()
{
    //  1223 => 1,223
    int n;
    int a[10];
    printf(" n: ");
    scanf_s("%d", &n);
    int i = 0;
    while (n > 0)
    {
        int temp = n % 1000;
        a[i] = temp;
        n /= 1000;
        i++;
    }
    for (int j = i - 1; j >= 0; j--)
    {
        if (j == 0) 
        {
            printf("%d.", a[j]);
        }
        else printf("%d,",a[j]);
    }
    getch();
    return 0;
}

0voto

chqrlie Punkte 110208

Hier ist eine einfache portable Lösung, die sich auf sprintf :

#include <stdio.h>

// assuming out points to an array of sufficient size
char *format_commas(char *out, int n, int min_digits) {
    int len = sprintf(out, "%.*d", min_digits, n);
    int i = (*out == '-'), j = len, k = (j - i - 1) / 3;
    out[j + k] = '\0';
    while (k-- > 0) {
        j -= 3;
        out[j + k + 3] = out[j + 2];
        out[j + k + 2] = out[j + 1];
        out[j + k + 1] = out[j + 0];
        out[j + k + 0] = ',';
    }
    return out;
}

Der Code lässt sich leicht für andere Integer-Typen anpassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X