boost::locale::format()Nachkommastellen von Gleitkommazahlen
-
Hallo zusammen
Irgendwas mache ich falsch.
Ich möchte eigentlich nur mit der der format funktion von boost eine Gleitkommazahl ausgeben. So dass diese immer exakt 3 nachkommastellen hat.
https://www.boost.org/doc/libs/1_76_0/libs/locale/doc/html/localized_text_formatting.html
wenn ich die Erklärung richtig verstanden habe muss ich die Präzision angeben:precision or p – set precision (requires parameter).
Requires Parameter: Schade dass da kein Beispiel angegeben ist
ich habe verschiedenste Dinge versucht unter anderem:
const auto message = (boost::locale::format("Number: '{1, p=0.3}'.") % 20.123456).str();
kann mir jemand sagen wie ich genau 3 Nachkommastellen hin bekomme. Danke.
-
Hast du schon einfach
p=3
probiert?
-
@Th69 sagte in boost::locale::format()Nachkommastellen von Gleitkommazahlen:
Hast du schon einfach p=3
Hei, ja habe ich, aber immer selbes Ergebnis:
20.123456 -> endet in 20.1235
-
Was ist mit
{1, num=fixed,p=3}
?
-
Ich würde fmt verwenden:
#include <fmt/format.h> #include <locale> int main() { std::locale::global(std::locale("en_US.UTF-8")); fmt::print("{:.3Lf}\n", 1235.4567); }
Gibt
1,235.457
aus.Oder eben ohne das "L" im Formatstring, wenn du kein locale willst.
-
@wob sagte in boost::locale::format()Nachkommastellen von Gleitkommazahlen:
#include <fmt/format.h>
In Zukunft als
<format>
undstd::format
verfügbar. C++20 ftw!
-
@DocShoe sagte in boost::locale::format()Nachkommastellen von Gleitkommazahlen:
{1, num=fixed,p=3}
Dann erhalte ich "20.1"
-
@wob sagte in boost::locale::format()Nachkommastellen von Gleitkommazahlen:
#include <fmt/format.h>
#include <locale>Ja aber ich verwende zusätzlich noch die Übersetzung von boost. Und da habe ich das kombiniert.
-
gibts es doch nicht muss doch eine Möglichkeit geben das zu formatieren.
-
Die Zahl mit 1000 multipliziert in einen ausreichend großen Integer konvertieren, einen String reservieren (Länge der Zahl+1, +2 wenn <1000 und eine 0 vorangestellt werden soll) und diese Zahl zuweisen, anschließend den Trenner und evtl. die 0 an der richtigen Stelle einfügen. Fertig.
-
@yahendrik sagte in boost::locale::format()Nachkommastellen von Gleitkommazahlen:
Fertig.
Nein. Dann rundest du nicht richtig. Zumindest nicht, wenn du "Konvertiere in Integer" als Cast umsetzt. Und "die Trenner mal eben einfügen" - da kann auch einiges schief gehen. Erstmal muss man die Trenner herausfinden, dann deren Position(en). Erscheint mir zu viel Aufwand für ein gelöstes Problem, um das selbst zu implementieren. Wenn man es selbst macht, fehlt auch noch "Tests schreiben". Auch mal negative Zahlen, 0 etc. testen. Und findest du so leicht immer genügend große Integer?
-
@yahendrik
Nun ja ich will ja nicht anfangen zahlen zu verändern. Und da brauche ich auch keine Infos dazu wie das geht. Mich interessiert wie die boost Funktion arbeitet. Das war die Frage. Bisher kommen nur Antworten zu alternativen Formatierungsmöglichkeiten.
-
Ich nutze die lib nicht, aber von der Doku wäre ich von sowas als Format String ausgegangen:
%1$f0.3
oder so. Aber ich habe gerade keine Möglichkeit das auszuprobieren
-
Laut Sourcecode locale/format.cpp ist
precision
ein Integer (s. Zeile 164).
Und im Header locale/format.hpp findet sich auch ein Beispiel dazu (Zeile 153):cout << format("The height of water at {1,time} is {2,num=fixed,precision=3}") % time % height;
Dieser Wert wird dann einfach an std::ios_base::precision weitergereicht.
Edit: Entferne mal das Leerzeichen nach dem Komma:
{1,num=fixed,p=3}
.
Es gibt wohl keinenelse
Fall, falls ein Formatierungswert nicht geparst werden konnte...