Wie formatiert C++ eine Zahl als string mit Kommas?
(Bonus wäre zu handhaben doubles auch.)
mögliches Duplikat von Wie fügt man Leerzeichen in eine große Zahl ein, um sie besser lesbar zu machen?
– Rob Kennedy
1. September 11 um 22:09 Uhr
Mögliches Duplikat von Wie stellen Sie das cout-Gebietsschema so ein, dass Kommas als Tausendertrennzeichen eingefügt werden?
– Matthias M.
02.09.11 um 07:16 Uhr
Was an diesen doppelten Aussagen lahm ist, ist, dass ich nach dieser Frage gesucht habe, bevor ich die offensichtlichsten Suchbegriffe verwendet habe, und keine dieser Fragen gefunden habe. Mein Titel ist besser und treffender und ich mag die akzeptierte Antwort auf meine Frage besser als die Antworten auf alle diese.
– Nutzer
02.09.11 um 14:09 Uhr
Wenn hohe Leistung ein Problem ist, können Sie meine verwandte Frage sehen: Wie kann ich die Formatierung von Zahlen mit Kommasleistung verbessern?
Haftungsausschluss: Portabilität könnte ein Problem sein und Sie sollten sich wahrscheinlich ansehen, welches Gebietsschema wann verwendet wird "" ist bestanden
Diese Funktion hat für mich keine Kommas gesetzt. Welches Gebietsschema soll ich einstellen? Welches Gebietsschema soll ich von meinen Benutzern verlangen? Scheitern.
– Jonny
28. Mai ’15 um 9:35 Uhr
Die Antwort ist ohne ein Beispiel für die Verwendung eines bestimmten Gebietsschemas nicht vollständig. Um es zum Laufen zu bringen, müssen Sie die gesamte lokale Maschinerie lernen.
– Reb.Kabine
1. September 15 um 13:13 Uhr
Genauer gesagt hat die Antwort abgelehnt, dass die Portabilität ein Problem sein könnte, und Sie sollten sich wahrscheinlich ansehen, welches Gebietsschema verwendet wird, wenn “” übergeben wird. Es stellt sich heraus, dass diese Antwort auf meinem Mac nicht sofort einsatzbereit ist, aber “nachsehen, welches Gebietsschema verwendet wird”, erfordert, dass Sie das Gebietsschema-Kaninchenloch hinuntergehen. Siehe diese Frage für eine bessere Antwort, die sofort funktioniert: stackoverflow.com/questions/3479485
– Reb.Kabine
1. September 15 um 13:29 Uhr
Spuckt die Zahl mit Kommas in UK im Jahr 2021 aus mit ‘gcc version 10.3.0 (Ubuntu 10.3.0-1ubuntu1)’
– ahcox
2. September 21 um 23:25 Uhr
Knoten
Sie können tun, was Jacob vorgeschlagen hat, und imbue mit dem "" locale – aber dies wird den Systemstandard verwenden, der nicht garantiert, dass Sie das Komma erhalten. Wenn Sie das Komma erzwingen möchten (unabhängig von den Standardgebietsschemaeinstellungen des Systems), können Sie dies tun, indem Sie Ihr eigenes angeben numpunct Facette. Beispielsweise:
#include <locale>
#include <iostream>
#include <iomanip>
class comma_numpunct : public std::numpunct<char>
{
protected:
virtual char do_thousands_sep() const
{
return ',';
}
virtual std::string do_grouping() const
{
return "3";
}
};
int main()
{
// this creates a new locale based on the current application default
// (which is either the one given on startup, but can be overriden with
// std::locale::global) - then extends it with an extra facet that
// controls numeric output.
std::locale comma_locale(std::locale(), new comma_numpunct());
// tell cout to use our new locale.
std::cout.imbue(comma_locale);
std::cout << std::setprecision(2) << std::fixed << 1000000.1234;
}
Ich bin nur neugierig, ob Sie Ihr Beispiel lange bearbeiten können, anstatt zu schweben, da ich danach gesucht habe (und das ist es, was die Frage stellt.)
– Mitreisender
29. Oktober 12 um 11:58 Uhr
@FellowTraveler es ist dasselbe, mach es einfach std::cout << myLongValue;.
– Knoten
29. Oktober 12 um 13:23 Uhr
Warum funktioniert das für die Longs auch ohne Piping std::fixed? (Ich habe die Doppel nicht ausprobiert).
– aje
16. April 14 um 17:36 Uhr
Das ist toll! Jetzt müssen Sie sich nicht mehr mit UTF-8-Locales herumschlagen!
– ForceBru
1. April 16 um 15:00 Uhr
Bei weitem eine der besten Möglichkeiten, dies zu tun
– Vivic
1. November 17 um 15:04 Uhr
carljalal
Ich halte die folgende Antwort für einfacher als die anderen:
#include <iostream>
int main() {
auto s = std::to_string(7654321);
int n = s.length() - 3;
while (n > 0) {
s.insert(n, ",");
n -= 3;
}
std::cout << (s == "7,654,321") << std::endl;
}
Dadurch werden Kommas schnell und korrekt in Ihre Ziffernfolge eingefügt.
Dies funktioniert nicht mit Werten mit vorangestellten Nullen wie 010100
– PapaDiHatti
6. Mai 17 um 0:32 Uhr
@Homer6 Das Problem mit negativen Zahlen könnte durch eine geringfügige Anpassung des Codes überwunden werden. Wenn die Zahl negativ ist, sollte das While-Schleifenkriterium insertPosition>1 sein … für -106 würde insertPosition bei 1 beginnen und es würde kein Komma eingefügt werden.
– Cardiff-Weltraummann
14. Juni 17 um 19:27 Uhr
@Kapil-Nummern mit vorangestellten Nullen wie 010100 würden funktionieren: Sie würden zu Beginn insertPosition == 3 erhalten, Ihr Komma würde zwischen der 3. und 4. Ziffer stehen und das war’s. Könnten Sie weiter erklären, wie eine solche Ziffernfolge fehlschlagen würde?
– Cardiff-Weltraummann
14. Juni 17 um 19:30 Uhr
@arljalal Ich mag den Code sehr. Der einzige Fehler meiner Meinung nach ist, wenn wirklich lange Zahlen üblich sind, ist es O (Länge zum Quadrat). Die While-Schleife läuft O(Länge) Mal und überträgt jedes Mal O(Länge) Ziffern. Ein Algorithmus, der mit durch Kommas getrennten Blöcken arbeitet, könnte insgesamt O (Länge) sein. Die meisten von uns werden 32-Bit- oder 64-Bit-Zahlen formatieren, daher ist das Problem gering.
– Cardiff-Weltraummann
14. Juni 17 um 19:33 Uhr
@cardiffspaceman Die größte Zahl, die Sie in einem uint64_t speichern können, ist 18.446.744.073.709.551.615. Das sind 20 Ziffern. Wenn Sie mit größeren Zahlen arbeiten und diese tatsächlich lesbar haben möchten, ist die wissenschaftliche Notation wahrscheinlich der richtige Weg. Die 18-stellige Nummer ist schwer genug zu lesen. tl;dr: Ich glaube nicht, dass die große O-Laufzeit hier wirklich relevant ist. Vielleicht, wenn Sie mit Zahlen arbeiten, die Millionen von Ziffern lang sind und Sie Genauigkeit bis auf die Einerstelle benötigen.😸
– Justin T. Conroy
23. September 21 um 18:31 Uhr
Tom Serink
Das ist ziemlich altmodisch, ich verwende es in großen Schleifen, um zu vermeiden, dass ein weiterer Zeichenfolgenpuffer instanziiert wird.
void tocout(long a)
{
long c = 1;
if(a<0) {a*=-1;cout<<"-";}
while((c*=1000)<a);
while(c>1)
{
int t = (a%c)/(c/1000);
cout << (((c>a)||(t>99))?"":((t>9)?"0":"00")) << t;
cout << (((c/=1000)==1)?"":",");
}
}
Tro
Wenn Sie Qt verwenden, können Sie diesen Code verwenden:
Ich habe die Lösung gefunden! Kopieren Sie dies einfach in eine Ihrer Funktionen, diese Funktion ist in einer statischen Funktion geschrieben.
// Convert 100000000 to 100,000,000, put commas on the numbers!
std::string AppManager::convertNumberToString(int number) {
std::string s = std::to_string(number);
std::string result = "";
std::string tempResult = "";
unsigned long n = s.length() - 3;
int j = 0;
for (int i=s.size()-1; i>=0; i--) {
if (j%3 == 0) {
result.append(",");
}
result.append(s, i, 1);
j++;
}
result = result.substr(1, result.size()-1);
//now revert back
for (int i=result.size()-1; i>=0; i--) {
tempResult.append(result, i, 1);
}
return tempResult;
}
Hier ist das Ergebnis dieses Codes:
.
8218000cookie-checkc++: Zahl mit Kommas formatieren?yes
mögliches Duplikat von Wie fügt man Leerzeichen in eine große Zahl ein, um sie besser lesbar zu machen?
– Rob Kennedy
1. September 11 um 22:09 Uhr
Mögliches Duplikat von Wie stellen Sie das cout-Gebietsschema so ein, dass Kommas als Tausendertrennzeichen eingefügt werden?
– Matthias M.
02.09.11 um 07:16 Uhr
Was an diesen doppelten Aussagen lahm ist, ist, dass ich nach dieser Frage gesucht habe, bevor ich die offensichtlichsten Suchbegriffe verwendet habe, und keine dieser Fragen gefunden habe. Mein Titel ist besser und treffender und ich mag die akzeptierte Antwort auf meine Frage besser als die Antworten auf alle diese.
– Nutzer
02.09.11 um 14:09 Uhr
Wenn hohe Leistung ein Problem ist, können Sie meine verwandte Frage sehen: Wie kann ich die Formatierung von Zahlen mit Kommasleistung verbessern?
– Nutzer
25. Oktober 12 um 18:28 Uhr