JavaRush /Java-Blog /Random-DE /Formatieren Sie die Ausgabe von Zahlen in Java

Formatieren Sie die Ausgabe von Zahlen in Java

Veröffentlicht in der Gruppe Random-DE
Hallo zusammen! Oft enthalten unsere Methoden Zahlen, die in einem speziellen Format angezeigt werden müssen. Es scheint eine Kleinigkeit zu sein, aber wie würden Sie diese Aufgabe umsetzen? Formatieren Sie die Ausgabe von Zahlen in Java - 1Wir laden Sie ein, heute ein wenig darüber nachzudenken. Um in die Zahlenformatierung in Java einzutauchen, erinnern wir uns zunächst an die Formatmethode der String- Klasse : public static String format(String format, Object... args) – gibt einen String zurück, der aus dem Formatstring unter Verwendung der verbleibenden Argumente args formatiert wurde . Und nur ein Beispiel:
String str = String.format(„Hallo – %s! Wie geht es dir %s?“, „Sascha“, "bei der Arbeit");
System.out.println(str);
Als Ergebnis erhalten wir die Ausgabe in der Konsole:
Hallo Sascha! Wie läuft es bei der Arbeit?

printf- und format-Methoden

String.format() ist nicht die einzige Methode zum Formatieren einer Zeichenfolge. Seine Analoga sind System.out.printf() und System.out.format(); . Wir können also den vorherigen Code ersetzen durch:
System.out.printf(„Hallo – %s! Wie geht es dir %s?“, „Sascha“, "bei der Arbeit");
oder
System.out.format(„Hallo – %s! Wie geht es dir %s?“, „Sascha“, "bei der Arbeit");
Die Ausgabe in der Konsole bleibt gleich. Der einzige Unterschied besteht darin, dass diese Methoden im Gegensatz zu String.format() den Wert sofort in der Konsole anzeigen . Aber String.format() gefällt mir besser, da wir das Ergebnis nicht immer in der Konsole anzeigen müssen, also werden wir diese Methode weiterhin verwenden. Kehren wir zu unserem Beispiel zurück. Was sehen wir? Und Tatsache ist, dass an den Stellen, an denen die Zeichen %s standen , die Zeilen „Sasha“ und „at work“ eingefügt wurden . Wie kann uns das bei der Entwicklung helfen? Stellen Sie sich vor, Sie haben einen großen Vorlagentext, aber an einigen Stellen müssen Sie Werte einfügen, die unterschiedlich sein können und als Argumente von außen kommen. Hier bietet sich diese Formatierung an. Formatbezeichner beginnen mit einem Prozentzeichen (%) und enden mit einem Zeichen, das den Typ des zu formatierenden Arguments angibt. Und wie Sie wahrscheinlich wissen, wird %s zum Einfügen von Objekten – Zeichenfolgen – verwendet. Wenn wir jedoch versuchen, beispielsweise ein Double an der Stelle einzufügen, an der das String-Objekt registriert ist:
String str = String.format(„Hallo – %s! Wie geht es dir %s?“, 55.6, "bei der Arbeit");
das wird auch funktionieren. double wird in einen String umgewandelt und wir erhalten:
Hallo - 55,6! Wie läuft es bei der Arbeit?
Neben Strings und Gleitkommazahlen gibt es in Java noch andere Typen, oder? Werfen wir also einen Blick auf das gesamte Arsenal:
Typ des zu formatierenden Werts Beispiel
%S Jeder Typ, der in eine Zeichenfolge umgewandelt wird
String.format("Sein!","Welt")
Ergebnis:
Hallo Welt!
%B Jeder Typ, der in einen booleschen Wert umgewandelt wird : true – wenn der Wert nicht null ist, false – wenn null
String.format(„Hallo %b!“,null)
Ergebnis:
Hallo falsch
%H Sie können jedes Objekt übergeben, das von der Methode hashCode() in eine hexadezimale Wertzeichenfolge umgewandelt wird
String.format(„Hallo %h!“,"Welt")
Ergebnis:
Hallo 106c44!
%C Wird verwendet, um ein Unicode-Zeichen ( char ) anzugeben.
String.format(„Hallo m%cr!“,'Und')
Ergebnis:
Hallo Welt!
%D Es wird eine Ganzzahl angegeben ( int. byte, short, int, long, BigInteger )
String.format(„Ich bin schon %d!“,20)
Ergebnis:
Ich bin schon 20!
%F Wird verwendet, um eine Gleitkommazahl anzugeben
String.format(„PI ist – %f!“, 3.14159)
Ergebnis:
Die PI-Nummer ist - 3.141590!
%e Gleitkommazahlen in wissenschaftlicher Notation
String.format(„PI ist – %e!“, 3.14159);
Ergebnis:
Die PI-Nummer ist - 3.141590e+00!
%A Gleitkommazahlen werden hexadezimal dargestellt
String.format(„PI ist – %a!“, 3.14159)
Ergebnis:
Die PI-Nummer ist - 0x1.921f9f01b866ep1!
%X Es wird eine Ganzzahl übergeben ( int. byte, short, int, long, BigInteger ), das Formatierungsergebnis ist das Zeichen mit der angegebenen Zahl in der ASCII-Tabelle
String.format(„Ich bin schon %x!“,25)
Ergebnis:
Ich bin schon 19!
Eine Ganzzahl ( int. byte, short, int, long, BigInteger ) wird akzeptiert und als Oktalzahl dargestellt
String.format(„Ich schon %o!“,25);
Ergebnis:
Ich bin schon 31!
%T Präfix für Datums- und Uhrzeitkonvertierungen. Für die Formatierung sind zusätzliche Flags erforderlich
String.format(„Heute ist %tA“,new Date())
Ergebnis:
Heute ist Samstag
%N Plattformspezifischer Zeilentrenner. Analog\n
String.format(„Hallo %n Hallo“)
Ergebnis:
Hallo Hallo
Lassen Sie uns ein geeigneteres Format für double verwenden:
String str = String.format(„Die Entfernung von Kiew nach Odessa beträgt %f. Nicht so kurz, oder?“, 475.4d);
System.out.println(str);
Konsolenausgabe:
Die Entfernung von Kiew nach Odessa beträgt 475,400000. Nicht so wenig, oder?
Wie Sie vielleicht bemerkt haben, wäre %f ein besser geeigneter Spezifizierer für Gleitkommazahlen, zu denen in Java Datentypen wie Double und Float gehören . Mit diesem Spezifizierer können wir eine Gleitkommazahl formatieren:
String str = String.format(„Die Entfernung von Kiew nach Odessa beträgt %.2f. Nicht so kurz, oder?“, 475.4d);
Durch Einfügen von .2 in diesen Spezifizierer wird die Anzahl der Dezimalstellen auf zwei gekürzt und wir erhalten die Ausgabe:
Die Entfernung von Kiew nach Odessa beträgt 475,40. Nicht so wenig, oder?
.2 ist nicht die einzige Änderung an den Spezifikationen. Die Kombination dieser Teileinstellungen wird als Anweisung bezeichnet . Formatieren Sie die Ausgabe von Zahlen in Java - 2Die allgemeine Form der Anleitung ist wie folgt:
%[argument_index][flags][width][.precision]Typspezifizierer
Lassen Sie uns nun alles der Reihe nach entschlüsseln:
  • [argument_index] ist eine Ganzzahl, die die Position in der Argumentliste angibt. Beispielsweise ist der Link zum ersten Argument $1, der Link zum zweiten Argument ist $2 usw. Wenn die Position nicht angegeben wurde, müssen die Argumente in derselben Reihenfolge vorliegen, in der sie in der Formatzeichenfolge referenziert werden.
  • [Flags] sind Sonderzeichen zur Formatierung. Zum Beispiel:
    • + -Flag, das angibt, dass ein positiver numerischer Wert ein +-Zeichen enthalten muss
    • - bedeutet, das Ergebnis nach links auszurichten
    • , legt das Tausendertrennzeichen für Ganzzahlen fest
  • [Breite] ist eine positive dezimale Ganzzahl, die die Mindestanzahl der auszugebenden Zeichen angibt. Steht dieser Zahl eine 0 voran, so werden die fehlenden Zeichen mit 0 aufgefüllt, steht keine 0, dann mit Leerzeichen.
  • [.accuracy] ist eine nicht negative Ganzzahl, der ein Punkt vorangestellt ist. Wird normalerweise verwendet, um die Anzahl der Zeichen zu begrenzen. Das spezifische Verhalten hängt vom spezifischen Typ des Spezifizierers ab.
Ich möchte auch darauf hinweisen, dass alle oben genannten Elemente der Anleitung optional sind und alles ohne sie funktioniert. Als Beispiel für die Verwendung von Teilmengen stellen wir uns vor, dass wir eine bestimmte Ausgabe der Zahl Pi benötigen:
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
Und dementsprechend die Ausgabe in der Konsole:
+03.14159
Scheint einfach zu sein, oder? Aber wenn es um die Formatierung einer Zahl geht, können Sie DecimalFormat nicht ignorieren . Lassen Sie uns herausfinden, was das bedeutet.

DecimalFormat

DecimalFormat ist eine Klasse zum Formatieren beliebiger Zahlen in Java, sei es eine Ganzzahl oder eine Gleitkommazahl. Wenn ein DecimalFormat- Objekt erstellt wird , können Sie direkt im Konstruktor eine Vorlage zum Formatieren eingehender Zahlen angeben. So würde unser Beispiel mit DecimalFormat aussehen :
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
Konsolenausgabe:
72.224
Die Zeile #.### ist ein Muster, das angibt, dass wir den übergebenen Wert auf 3 Dezimalstellen formatieren. Welche weiteren Symbole gibt es für Muster? Hier sind einige davon:
  • # – Ziffer, führende Nullen werden weggelassen;
  • 0 – die Ziffer wird immer angezeigt, auch wenn die Zahl weniger Ziffern hat (in diesem Fall wird 0 angezeigt);
  • . — Dezimaltrennzeichen;
  • , – Gruppierungszeichen für Trennzeichen (z. B. Tausendertrennzeichen);
  • ; — trennt Formate;
  • - — markiert das Präfix einer negativen Zahl;
  • % – multipliziert mit 100 und zeigt die Zahl als Prozentsatz an;
  • ? — multipliziert mit 1000 und zeigt die Zahl in ppm an;
  • E – Trennt Mantisse und Exponent für die wissenschaftliche Notation.
Schauen wir uns ein paar Beispiele an:
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
Konsolenausgabe:
74.554.542,22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
Konsolenausgabe:
%72,35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
Konsolenausgabe:
042.224
Es ist nicht erforderlich, jedes Mal ein neues DecimalFormat- Objekt zu erstellen , um eine neue Vorlage zu definieren. Es reicht aus, die Methoden applyPattern und applyLocalizedPattern zu verwenden :
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
Wenn wir über die Formatierung einer Gleitkommazahl sprechen, sind wir doch sehr an der Rundung interessiert, nicht wahr? Wenn Sie also eine Zahl mit Dezimalstellen außerhalb des angegebenen Musters kürzen, rundet DecimalFormat die Zahl auf, wenn die letzte gekürzte Zahl größer als 5 ist. Was passiert, wenn die letzte gekürzte Zahl 5 ist? Tatsächlich liegt diese Zahl in diesem Fall genau in der Mitte zwischen den nächsten ganzen Zahlen. Formatieren Sie die Ausgabe von Zahlen in Java - 3In diesem Fall wird die bisherige Nummer berücksichtigt. Wenn die vorherige Zahl gerade ist, wird gerundet:
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
Konsolenausgabe:
56.459
Wenn es ungerade ist, wird es nicht ausgeführt:
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
Konsolenausgabe:
56.459
Der Unterschied zwischen der Formatierung von Gleitkommazahlen mit String.format() und DecimalFormat.format() besteht darin, dass im ersten Fall nachgestellte Nullen vorhanden sind, auch wenn kein Bruchteil vorhanden ist. Zum Beispiel:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
Konsolenausgabe:
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
Konsolenausgabe:
9
Wie Sie sehen können, gibt die format()- Methode der String- Klasse bei der Formatierung der Zahl 9.00001273 mit einer Genauigkeit von vier Dezimalstellen den Wert 9.0000 aus , während die ähnliche format()- Methode von DecimalFormat 9 ausgibt .

BigDecimal und BigInteger

Da wir das Thema des Rundens von Zahlen in Java angesprochen haben, sprechen wir über die Verwendung der BigDecimal- Klasse für solche Operationen . Diese Klasse konzentriert sich auf die Arbeit mit wirklich GROSSEN Zahlen: Dafür sind die maximalen Double- und Float -Werte zu klein. Diese Klasse verfügt über viele verschiedene Einstellungen für die Gleitkommarundung sowie viele Methoden für arithmetische Operationen. Es gibt eine ähnliche Klasse, die sich jedoch auf die Arbeit mit GROSSEN Ganzzahlen konzentriert – BigInteger . Weitere Informationen zu BigDecimal und BigInteger finden Sie in diesem Artikel .

Datum und Uhrzeit formatieren

Oben wurde nur erwähnt, dass man mit format() der String- Klasse auch Uhrzeit und Datum formatieren kann. Formatieren Sie die Ausgabe von Zahlen in Java - 4Schauen wir uns mal an, wie es gemacht wird. Zunächst möchten wir Sie daran erinnern, dass der Formatbezeichner %t für Datumsangaben verwendet wird . Zweitens sind beim Formatieren einer Vorlage zusätzliche Formatierungsflags für jeden Formatbezeichner für Datumsangaben erforderlich. Hier sind die möglichen Formatierungsflags für Datumsangaben:
Flaggen Beschreibung
%tB Vollständiger Name des Monats, zum Beispiel Januar, Februar usw.
%tb Abgekürzter Name des Monats, zum Beispiel Jan, Feb usw.
%tA Vollständiger Name des Wochentags, zum Beispiel Sonntag, Montag
%ta Abgekürzter Name des Wochentags, zum Beispiel So, Mo usw.
%tY Jahr im 4-stelligen Format, z. B. 0000 bis 9999
%ty Jahr im 2-stelligen Format, zum Beispiel von 00 bis 99
%tm Der Monat wird mit Null am Anfang formatiert, zum Beispiel 01 bis 12
%tc Datum und Uhrzeit im Format %ta %tb %td %tT %tZ %tY, zum Beispiel Mo, 17. Februar 03:56:12 PST 2020
%tD Datum im %tm/%td/%ty-Format
%td Tag des Monats im zweistelligen Format, zum Beispiel 01 bis 31
%te Tag des Monats im Format ohne führende 0, zum Beispiel von 1 bis 31
%tT Zeit im 24-Stunden-Format, zum Beispiel %tH:%tM:%tS
%tH Tageszeit im 24-Stunden-Format, von 00 bis 23
%tI Tageszeit für ein 12-Stunden-Format, z. B. 01 bis 12
%tM Die Minuten in der Stunde werden mit einer führenden Null formatiert, zum Beispiel 00 bis 59
%tS Sekunden in einer Minute, bestehend aus zwei Ziffern, zum Beispiel von 00 bis 59
%tZ Abkürzung der Zeitzone, z. B. PST, UTC usw.
Dies ist eine verkürzte Liste möglicher Flags zur Datumsformatierung – es gibt viele davon für jeden Geschmack. Eine vollständige Liste davon und mögliche Spezifizierer finden Sie unter diesem Link . Schauen wir uns an, wie man das nutzt. Dieses Mal verwenden wir nicht String.format() , sondern sofort System.out.printf() .

Beispiel 1

Darüber hinaus legen wir die Ergebnissprache fest, indem wir sie als erstes Argument an die Methode übergeben:
Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
Konsolenausgabe:
11. Oktober 2020
Ohne Angabe einer Sprache wird die Standardsprache verwendet (z. B. ich habe Russisch).

Beispiel 2

Lassen Sie uns ein vollständigeres Datum anzeigen:
Date date = new Date();
System.out.printf(„%td %tB %tY von %n%tH:%tM:%tS“,date,date,date,date,date,date,date);
Und die Ausgabe in der Konsole:
11. Oktober 2020 13:43:22
Dasselbe Date-Objekt so oft als Argument übergeben ... Das sieht nicht sehr gut aus, oder? Lassen Sie uns die interne Teilmenge von $ verwenden , um das Argument anzugeben, das wir verwenden möchten:
System.out.printf(„%1$td %1$tB %1$tY des Jahres %n%1$tH:%1$tM:%1$tS“,date);
Die Ausgabe in unserer Konsole wird sich nicht ändern. Es gibt andere ebenso interessante Möglichkeiten, Datumsangaben zu formatieren. In diesem Material können Sie darüber und etwas mehr über Zeit und Datum in Java lesen . Das ist alles für heute, vielen Dank für Ihre Aufmerksamkeit!Formatieren Sie die Ausgabe von Zahlen in Java - 5
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION