3 Stimmen

Gibt es eine integrierte Funktion, die eine Zahl in C, C++ oder JavaScript durch Komma trennt?

Gegeben eine Zahl 12456789 muss ich Folgendes ausgeben 12,456,789 ohne viel Kodierung. Gibt es irgendwelche eingebauten Funktionen in C, C++ oder JavaScript, die ich dafür verwenden kann?

24voto

Martin York Punkte 245363

Ja, dies kann in C++ automatisch geschehen, indem die richtige Facette für das Gebietsschema eingestellt wird.

#include <iostream>
#include <locale>
#include <string>

template<typename CharT>
struct Sep : public std::numpunct<CharT>
{
    virtual std::string do_grouping()      const   {return "\003";}
};

int main()
{
    std::cout.imbue(std::locale(std::cout.getloc(), new Sep <char>()));

    std::cout << 123456789 << "\n";

}

Hinweis: Die C-Locale (die Locale, die verwendet wird, wenn Ihre Anwendung keine Locale festlegt) verwendet kein Tausendertrennzeichen. Wenn Sie das Gebietsschema Ihrer Anwendung auf eine bestimmte Sprache einstellen, wird sie die sprachenspezifische Methode der Gruppierung übernehmen (ohne dass Sie etwas Ausgefallenes wie oben tun müssen). Wenn Sie das Gebietsschema auf die aktuellen Spracheinstellungen Ihres Rechners (wie vom Betriebssystem definiert) und nicht auf ein bestimmtes Gebietsschema festlegen möchten, verwenden Sie "" (leere Zeichenfolge) als Gebietsschema.

So legen Sie das Gebietsschema auf der Grundlage der spezifischen Einstellungen Ihres Betriebssystems fest:

int main()
{
    std::cout.imbue(std::locale(""));

    std::cout << 123456789 << "\n";
}

0 Stimmen

Besser als die hier akzeptierte Antwort stackoverflow.com/questions/7276826/c-format-number-with-commas Das funktioniert nicht ohne ausführliches Studium und Tüftelei.

15voto

Jerry Coffin Punkte 452852

In C++ würde man normalerweise etwas wie dieses verwenden:

std::locale loc("");
std::cout.imbue(loc);

std::cout << 1234567;

Das Gebietsschema mit einem leeren Namen, wie es hier verwendet wird, formatiert die Zahl nicht unbedingt genau so, wie Sie es oben angegeben haben. Stattdessen wird das Gebietsschema vom Rest des Systems übernommen und entsprechend formatiert. Bei mir (mit meinem für die USA eingerichteten System) würde es also "1.234.567" ergeben, aber wenn das System für (die meisten Teile) Europas eingerichtet wäre, würde es stattdessen "1.234.567" ergeben.

0 Stimmen

+1 Einfacher geht es nicht :) Ich mag C++ ^^

0 Stimmen

Diese Frage ist nicht eindeutig zu beantworten, da sie von der Standard-Sprachumgebung des Systems abhängt. std::locale loc("en_US.UTF-8"); kann robuster sein.

1 Stimmen

@prehistoricpenguin: Ich nehme an, das hängt davon ab, wie Sie "robust" definieren. Wenn du meinst, dass "manchmal etwas Wünschenswertes tun kann, aber manchmal komplett versagt", dann ja, das wäre korrekt (z.B. versagt mit minGW). Aber der Sinn der Antwort ist, dass man die meiste Zeit versuchen sollte, die Ausgabe auf die Wünsche des Benutzers zuzuschneiden, was das namenlose Gebietsschema zu bieten versucht.

3voto

Michael Burr Punkte 320591

In einigen C-Compiler-Implementierungen ist eine Erweiterung für die printf Funktionsfamilie, so dass ein einzelnes Anführungszeichen/Apostroph, das als Modifizierer in einem numerischen Formatbezeichner verwendet wird, eine "Tausendergruppierung" bewirkt:

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

int main(void)
{
    printf( "%'d\n", 1234567);

    setlocale(LC_NUMERIC, "en_US");
    printf( "%'d\n", 1234567);

    return 0;
}

erzeugt (mit GCC 4.4.1 sowieso):

1234567
1,234,567

Leider ist die Unterstützung für diese Erweiterung nicht besonders groß.

2voto

kennebec Punkte 98551

// Eine weitere Javascript-Methode, funktioniert mit Zahlen

Number.prototype.withCommas= function(){    
    return String(this).replace(/\B(?=(?:\d{3})+(?!\d))/g,',')
}

var n=12456789.25;
alert(n.withCommas());

/* Rückgabewert: (String) 12,456,789.25 */

2voto

user541686 Punkte 196656

Für C++ können Sie es versuchen:

std::locale get_numpunct_locale(std::locale locale = std::locale(""))
{
#if defined(_MSC_VER) && defined(_ADDFAC) && (!defined(_CPPLIB_VER) || _CPPLIB_VER < 403)
    // Workaround for older implementations
    std::_ADDFAC(locale, new std::numpunct<char>());
    return locale;
#else
    return std::locale(locale, new std::numpunct<TCHAR>());
#endif
}

template<class T>
std::string nformat(T value)
{
    std::ostringstream ss;
    ss.imbue(get_numpunct_locale());
    ss << value;
    return ss.str();
}

0 Stimmen

Ich bin auf VS19 und ich habe einen Fehler, der sagt _"Fehler C2039: _ADDFAC : ist kein Mitglied von std "_ . Wissen Sie, warum?

0 Stimmen

@SandraK: Was ist Ihr _CPPLIB_VER ?

0 Stimmen

Ich bin nicht sicher, wie kann ich das überprüfen?

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