Wie schön format Fließkomma-zahlen auf String-ohne unnötige dezimal 0?
Einem 64-bit-double-integer darstellen kann +/- 253 genau
Angesichts dieser Tatsache, die ich wählen zu verwenden einen double-Typ, wie ein einziger Typ für alle meine Arten, da meine größte Ganzzahl ohne Vorzeichen 32-bit.
Aber jetzt habe ich zum ausdrucken dieser pseudo-Ganzzahlen, aber das problem ist, Sie sind auch gemischt mit tatsächlichen verdoppelt.
So wie Drucke ich diese Doppel-schön in Java?
Habe ich versucht String.format("%f", value)
, die in der Nähe ist, außer ich bekomme eine Menge der Nullen bei kleinen Werten.
Hier ist ein Beispiel für die Ausgabe des von %f
232.00000000 0.18000000000 1237875192.0 4.5800000000 0.00000000 1.23450000
Was ich will, ist:
232 0.18 1237875192 4.58 0 1.2345
Sicher kann ich eine Funktion schreiben, trim, jene Nullen, das ist aber viel performance-Verlust durch String-manipulation. Kann ich besser mit einem anderen format-code?
BEARBEITEN
Den Antworten von Tom E. und Jeremy S. inakzeptabel sind, da Sie sowohl willkürlich Runden auf 2 Nachkommastellen. Verstehen Sie das problem, bevor Sie antwortet.
EDIT 2
Bitte beachten Sie, dass String.format(format, args...)
ist locale-abhängige (siehe Antworten unten).
Da einige Werte sind tatsächlich verdoppelt
Einige Fälle, in denen dieses problem auftrat wurde ein Fehler behoben, der in JDK 7: stackoverflow.com/questions/7564525/...
Geht es nur mir so oder ist JavaScript 100% besser bei der Zahl-zu-string-Konvertierung als Java?
InformationsquelleAutor Pyrolistical | 2009-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Idee ist, zu drucken Ganzzahlen gespeichert als verdoppelt, als wenn Sie ganze zahlen sind, und ansonsten drucken Sie das Doppel mit dem minimum an notwendiger Präzision:
Produziert:
Und sich nicht auf string-Manipulationen.
int
.Vereinbart, dies ist eine schlechte Antwort, verwenden Sie es nicht. Es funktioniert nicht mit einem
double
größer als die maximaleint
Wert. Auch mitlong
es würde immer noch nicht für sehr große zahlen. Weiter wird es wieder ein String in exponentieller form, z.B. "1.0E10", für große Werte, das ist wahrscheinlich nicht das, was der Fragesteller will. Verwenden%f
statt%s
in der zweiten format-string, um das zu beheben.Die OP erklärt ausdrücklich, dass Sie nicht wollen formatierten Ausgabe mit
%f
. Die Antwort ist spezifisch für die situation beschrieben, und die gewünschte Ausgabe. Die OP vorgeschlagen, Ihren maximalen Wert war ein 32-bit-unsigned-int, die ich nahm, um zu bedeuten, dassint
war akzeptabel (nicht signierter nicht Real existierende, in Java, und kein Vorbild, das war problematisch), aber ändernint
zulong
ist ein trivial zu beheben, wenn die situation anders ist.String.format("%s",d)
??? Sprechen Sie über einen unnötigen overhead. VerwendenDouble.toString(d)
. Für die anderen:Long.toString((long)d)
.Das problem ist, dass
%s
funktioniert nicht mit Locales. Im deutschen verwenden wir ein "," statt einem "." in dezimal-zahlen. WährendString.format(Locale.GERMAN, "%f", 1.5)
gibt "1,500000",String.format(Locale.GERMAN, "%s", 1.5)
gibt "1.5" – mit einem ".", was ist falsch in der deutschen Sprache. Gibt es eine locale-abhängige version von "%s"?InformationsquelleAutor JasonD
Wie schon in den Kommentaren, das ist nicht die richtige Antwort auf die ursprüngliche Frage.
Das heißt, es ist eine sehr nützliche Möglichkeit zum formatieren von zahlen ohne unnötige Nullen.
Und wenn Sie zufällig eine bestimmte Anzahl von abschließenden Nullen (z.B. wenn Sie Geld zu drucken, Mengen), dann kannst du '0' statt '#' (d.h. new DecimalFormat("0.00").format(amount);) das ist nicht das, was der OP wollte, aber vielleicht nützlich für die Referenz.
Ja, wie der ursprüngliche Autor der Frage das ist die FALSCHE Antwort. Lustig, wie viele Stimmen es gibt. Das problem mit dieser Lösung ist es willkürlich Runden auf 2 Nachkommastellen.
da kann man immer pass in einem schwebenden deutete mit mehr Nachkommastellen als das format. Das schreiben von code, arbeiten die meisten der Zeit, aber nicht alle Sonderfälle.
IMHO, es gibt viele upvotes, weil, obwohl dies die falsche Lösung für dich, es ist die richtige Lösung für 99%+ von denen, die finden diese F&A: normalerweise werden die letzten Ziffern einer Doppel - "Lärm",, die Unordnung der Ausgabe, stören die Lesbarkeit. Damit der Programmierer legt fest, wie viele Ziffern sind von Vorteil für die person, die das Lesen der Ausgabe und gibt an, dass viele. Eine häufige situation ist der kleine mathematische Fehler angesammelt haben, so könnte der Wert sein 12.000000034, würde aber lieber Runden auf 12, und die Anzeige kompakt als "12". Und "12.340000056" => "12.34".
InformationsquelleAutor Tom Esterez
Unten gestimmt, da die Frage zu Fragen strip alle Nullen und diese Antwort wird immer lassen zwei schwebende Punkte, unabhängig davon ob es null ist.
Ich glaube, du kannst mit der nachgestellte Nullen korrekt mit g statt f.
Ich habe diese Lösung in einem Produktions-system mit "%.5f", und es ist wirklich sehr schlimm ist, verwenden Sie es nicht... weil es gedruckt: 5.12 E-4 statt 0.000512
200+ positive Ergebnisse für eine falsche Antwort, yay!
InformationsquelleAutor Jeremy Slade
Kurz:
Wenn Sie möchten, um loszuwerden, nachgestellte Nullen und Locale-Probleme, dann sollten Sie verwenden :
Erklärung:
Warum andere Antworten nicht zu mir passen :
Double.toString()
oderSystem.out.println
oderFloatingDecimal.toJavaFormatString
mit wissenschaftlichen Notationen, wenn double ist in weniger als 10^-3 oder größer als oder gleich 10^7mithilfe
%f
die Standard-Nachkommastellen ist 6, sonst können Sie hart Kodieren, aber es führt zu zusätzlichen Nullen Hinzugefügt, wenn Sie weniger Dezimalstellen. Beispiel :mithilfe
setMaximumFractionDigits(0);
oder%.0f
entfernen Sie alle Nachkommastellen, das ist gut für Integer/Long, aber nicht für Doppel -durch die Verwendung von DecimalFormat, Sie sind lokal abhängig. Im französischen Gebietsschema, das Dezimaltrennzeichen ist ein Komma, kein Punkt :
Mit dem Gebietsschema " ENGLISCH macht Sie sicher, Sie erhalten einen Punkt für das Dezimaltrennzeichen, wo dein Programm laufen
Warum mit 340 dann für
setMaximumFractionDigits
?Zwei Gründen :
setMaximumFractionDigits
akzeptiert eine Ganzzahl, aber Ihre Umsetzung hat eine maximale Ziffern erlaubtDecimalFormat.DOUBLE_FRACTION_DIGITS
entspricht 340Double.MIN_VALUE = 4.9E-324
so mit 340 Ziffern, die Sie sicher sind, nicht über Ihren Doppel-und lose PräzisionDanke, habe ich behoben, die Antwort unter Verwendung der Muster
0
statt#.
Sie sind nicht mit den ständigen
DecimalFormat.DOUBLE_FRACTION_DIGITS
aber Sie sind mit dem Wert 340, die Sie dann geben Sie einen Kommentar für, um zu zeigen, dass es gleichDecimalFormat.DOUBLE_FRACTION_DIGITS
. Warum nicht einfach die Konstante???Denn dieses Attribut ist nicht öffentlich ... es ist das Paket "freundlich"
Danke! In der Tat, diese Antwort ist die einzige, die wirklich erfüllt alle genannten Anforderungen in den Frage – ist es nicht zeigen, unnötige Nullen, nicht Runde die zahlen-und locale-abhängig. Super!!!
InformationsquelleAutor JBE
Warum nicht:
Sollte diese Arbeit mit der extremen Werte Verdoppeln. Erträge:
InformationsquelleAutor Valeriu Paloş
Meine 2 Cent:
return String.format(Locale.US, (n % 1 == 0 ? "%.0f" : "%.1f"), n);
.fehlschlagen, wenn 23.00123 ==> 23.00
InformationsquelleAutor Fernando Gallego
Auf meinem Rechner, die folgende Funktion ist in etwa 7 mal schneller als die Funktion von JasonD Antwort, da es vermeidet
String.format
:InformationsquelleAutor Rok Strniša
Nee, never mind.
Performance-Verlust durch String-manipulation ist null.
Und hier ist der code, um schneiden Sie die enden nach
%f
Ich habe, weil ich habe das gleiche problem, und niemand scheint hier das problem zu verstehen.
Downvoted als DecimalFormat erwähnt in Toms post ist genau das, was Sie suchen. Es Streifen Nullen Recht effektiv.
Zu den oben genannten, vielleicht will er kürzen der Nullen OHNE Rundung? P. S. @Pyrolistical, sicher können Sie nur Nummer verwenden.replaceAll(".?0*$", ""); (nach contains(".") natürlich)
Ok, dann, wie würden Sie in der Lage sein, um zu erreichen mein Ziel mit dem DecimalFormat?
InformationsquelleAutor Pyrolistical
InformationsquelleAutor fop6316
Bitte beachten Sie, dass
String.format(format, args...)
ist locale-abhängige, weil es Formate über das Standardgebietsschema des Benutzers, das ist wohl mit Kommata und auch Leerzeichen wie 123 456,789 oder 123,456.789, die vielleicht nicht genau, was Sie erwarten.Können Sie es vorziehen, verwenden Sie
String.format((Locale)null, format, args...)
.Beispielsweise
Drucke
und das ist es, was
String.format(format, args...)
tun in verschiedenen Ländern.EDIT Ok, da hat es eine Diskussion über Formalitäten:
Kommentare erlauben nicht die Länge oder das format dieser Nachtrag. Da fügt es möglicherweise hilfreiche Informationen, ich denke, es sollte erlaubt sein, so wie Sie ist, anstatt gelöscht.
InformationsquelleAutor 18446744073709551615
Machte ich einen
DoubleFormatter
effizient zu konvertieren eine große Anzahl von double-Werten, um einen schönen/ansehnlich String:ansonsten Anzeige im normalen format 124.45678.
Hier der code:
Hinweis: ich habe 2 Funktionen aus der GUAVA library. Wenn Sie nicht verwenden, GUAVE, code it yourself:
InformationsquelleAutor Hiep
Dieser wird den job zu erledigen schön, ich weiß das Thema ist alt, aber ich war kämpfen mit dem gleichen Problem, bis ich kam zu diesem. Ich hoffe, dass jemand es nützlich finden.
InformationsquelleAutor Bialy
InformationsquelleAutor Hossein Hajizadeh
InformationsquelleAutor kamal
Verwenden
DecimalFormat
undsetMinimumFractionDigits(0)
InformationsquelleAutor vlazzle
Spät Antworte, aber...
Sagte Sie, dass Sie wählen Sie zum speichern von Nummern mit der Typ double. Ich denke, das könnte die Wurzel des Problems, weil es Sie zwingt zu speichern Ganzzahlen in Doppel - (und verlieren somit die ersten Informationen über den Wert der Natur). Was Sie über die Speicherung Ihrer zahlen in den Instanzen der Anzahl Klasse (Superklasse von beiden Double und Integer) und verlassen Sie sich auf Polymorphismus zu bestimmen, das richtige format für jede Zahl ?
Ich weiß, es kann nicht akzeptabel sein, umgestalten, einen ganzen Teil des Codes durch, aber es konnte erzeugen Sie die gewünschte Ausgabe ohne extra code/casting/parsing.
Beispiel:
Erzeugt die folgende Ausgabe:
Können Sie erklären, ein bisschen mehr zu deiner Aussage ? Es ist nicht ganz klar für mich... 🙂
InformationsquelleAutor Spotted
Musste ich diese Ursache
d == (long)d
gab mir die Verletzung in der sonar-BerichtInformationsquelleAutor ShAkKiR
Dies ist, was ich kam mit:
Einfache one-liner, wirft nur auf int, wenn wirklich brauchen, um
InformationsquelleAutor keisar
Hier sind zwei Möglichkeiten, es zu erreichen. Erste, die kürzere (und wahrscheinlich bessere) Möglichkeit:
Und hier ist die längere und wahrscheinlich schlechter Weg:
Beginnen sollte man mit einfachen und nachdem Sie bestimmt haben, Sie haben ein performance-problem ist, dann und nur dann sollte man optimieren. Code ist für den Menschen zu Lesen, wieder und wieder. Machen Sie es schnell zu laufen, ist zweitrangig. Durch die nicht-Verwendung der standard-API, Wann immer möglich, sind Sie eher, um die Einführung bugs und macht es nur schwieriger, sich in der Zukunft ändern.
Ich würde behaupten, dass code, den Sie schreiben, wie die wird NICHT schneller. Die JVM ist sehr schlau und Sie wissen gar nicht, wie schnell oder wie langsam etwas ist, bis Sie Profil. Performance-Probleme können erkannt und behoben werden, wenn es zum problem wird. Sollte man nicht vorzeitig optimieren. Schreibe code für Menschen zu Lesen, nicht wie Sie sich vorstellen, die Maschine laufen zu lassen. Einmal wird es ein performance-problem, schreiben Sie code mit einem profiler.
Jemand anderes bearbeitet, die Antwort zu verbessern die code-Formatierung. Ich war die überprüfung von einigen Dutzend Bearbeitungen für die Genehmigung und ging zu genehmigen, Ihre edit hier, aber die änderungen waren inkonsistent, so dass ich fixierte Sie. Ich verbesserte auch die Grammatik von text-snippets.
Ich verstehe es nicht. Wenn Sie sagten, dass die Formatierung egal ist, warum haben Sie verbringen die Zeit, es zu ändern zurück?
InformationsquelleAutor android developer
Hier ist eine Antwort, die tatsächlich funktioniert (Kombination der anderen Antworten hier)
if(f == (int)f) das übernimmt.
Schlägt auf f = 9999999999.00
InformationsquelleAutor Martin Klosi
Ich weiß, das ist ein wirklich Alter thread.. Aber ich denke, der beste Weg, dies zu tun ist wie folgt:
Ausgabe:
Die einzige Ausgabe ist die Letzte, wo die .0 nicht entfernt zu bekommen. Aber wenn Sie damit Leben können, dass dann das am besten funktioniert. %.2f wird die Runde der letzten 2 Dezimalstellen. So wird DecimalFormat. Wenn Sie brauchen alle Dezimalstellen, aber nicht die nachgestellten Nullen, dann funktioniert dies am besten.
System.out.println(new java.text.DecimalFormat("#.##").format(1.0005));
drucken1
das ist mein Punkt. Was, wenn Sie wollen, dass die 0.0005 angezeigt, wenn es eine gibt. Sie Runden mit 2 Dezimalstellen.
Die OP ist zu Fragen, wie print integer-Werte gespeichert, die im Doppel 🙂
oh ja 🙂 so sah,.. ich dachte an mein eigenes problem.. Sorry..
Es Formate "0.00028571" in der wissenschaftlichen notation.
InformationsquelleAutor sethu
Diese machen den string zum löschen der tailing-0-s.
Achten Sie darauf, Ihre Lösung zu konvertieren 1000 in 1, das ist falsch.
InformationsquelleAutor Kadi