Wie formatiere ich eine lange Ganzzahl als Zeichenfolge ohne Trennzeichen in Java?

122

Einfache Frage, aber ich wette, dass das Fragen hier wahrscheinlich einfacher ist als der Versuch, die Dokumentation zu verstehen für MessageFormat:

long foo = 12345;
String s = MessageFormat.format("{0}", foo);

Der beobachtete Wert ist "12.345".

Gewünschter Wert ist "12345".

Daniel Fortunov
quelle

Antworten:

62

Benutz einfach Long.toString(long foo)

Rob H.
quelle
12
OderString.valueOf(long)
rsp
6
String.valueOf () ruft Long.toString ()
Peter Lawrey am
7
Vielleicht ist das eine Kleinigkeit, aber in diesem Fall verlassen Sie sich auf ein undokumentiertes Verhalten von Long.toString (foo). Aus diesem Grund bevorzuge ich die Antwort von Daniel Fortunov.
John K
4
Es ist nicht undokumentiert. Siehe download.oracle.com/javase/6/docs/api/java/lang/… .
Rob H
3
OK, diese Lösung gilt jedoch nicht für die Nachrichtenformatierung in ResourceBundle. Tuto i18n
Guillaume Husta
332
MessageFormat.format("{0,number,#}", foo);
Daniel Fortunov
quelle
1
Vielen Dank, ich habe versucht, dies mit der Injektion von MessageFormat-Eigenschaften zu tun. Gut, dass es mehr als einen Weg gibt!
Philihp Busby
3
Ich bevorzuge diesen Weg. da es mir erlaubt, das Format in meiner Spracheigenschaftendatei zu ändern.
Pascal
2
Perfekte Lösung! Hat mir geholfen, die Option Format / Unformat in Referenzdaten anstatt auf Codeebene beizubehalten - danke! Und wie @SebastianRoth sagte - dies hätte die akzeptierte Antwort sein sollen.
Ofer Lando
9
Ich bin tatsächlich überrascht, warum das Verschönern numerischer Zeichenfolgen mit der Formatierungs-API
humblerookie
1
Dies funktioniert auch in einem Auswahlformat, wenn Sie das Muster zitieren:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0
1

Ich hatte ein wenig Probleme damit, als ich versuchte, "reale" Muster mit Internationalisierung usw. zu erstellen. Insbesondere müssen wir ein "Auswahl" -Format verwenden, bei dem die Ausgabe von den angezeigten Werten abhängt, und dafür java.text.ChoiceFormatist es gedacht.

Hier ist ein Beispiel, wie dies erreicht werden kann:

    MessageFormat fmt = new MessageFormat("{0,choice,0#zero!|1#one!|1<{0,number,'#'}|10000<big: {0}}");

    int[] nums = new int[] {
            0,
            1,
            100,
            1000,
            10000,
            100000,
            1000000,
            10000000
    };

    Object[] a = new Object[1];
    for(int num : nums) {
        a[0] = num;
        System.out.println(fmt.format(a));
    }

Dies erzeugt die folgende Ausgabe; Ich hoffe, es ist hilfreich für andere, die versuchen, die gleichen Dinge zu erreichen:

zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000

Wie Sie sehen können, können wir im Format "Auswahl" den zu verwendenden Formattyp in Abhängigkeit von dem zu formatierenden Wert auswählen. Kleine Zahlen können durch Text ersetzt werden (keine Anzeige des Originalwerts). Mittelgroße Zahlen werden ohne Gruppentrennzeichen (ohne Kommas) angezeigt. Die größten Zahlen enthalten wieder die Kommas. Offensichtlich ist dies ein völlig erfundenes Beispiel, um die Flexibilität von zu demonstrieren java.text.MessageFormat.

Ein Hinweis zu dem #im Format zitierten Text: Da beide ChoiceFormatund MessageFormatverwendet werden, kommt es zu einer Kollision zwischen Metazeichen zwischen den beiden. ChoiceFormatVerwendungen #als metacharacter , dass im Wesentlichen bedeutet „gleich“ , so dass die Formatierung Motor weiß , dass zum Beispiel im Fall 1#one!vergleichen wir {0}mit 1, und wenn sie gleich sind, verwendet es diese bestimmte „Wahl“.

Aber #hat eine andere Bedeutung MessageFormat, und das ist als Metazeichen, das Bedeutung hat für DecimalFormat: Es ist ein Metazeichen, das bedeutet "hier eine Zahl setzen".

Da es in eine ChoiceFormatZeichenfolge eingewickelt ist , #muss das in Anführungszeichen gesetzt werden. Wenn ChoiceFormatdas Parsen der Zeichenfolge abgeschlossen ist, werden diese Anführungszeichen entfernt, wenn die Unterformate an MessageFormat(und dann an DecimalFormat) übergeben werden.

Wenn Sie also verwenden {0,choice,...}, müssen Sie diese #und möglicherweise andere Zeichen zitieren .

Christopher Schultz
quelle
0

Der kürzeste Weg ist

long foo = 12345;
String s = ""+foo;
Peter Lawrey
quelle
3
Und wie immer wird dies erweitert, new StringBuilder("").append(foo).toString()sodass es nicht wirklich optimal ist.
RAnders00
1
@ RAnders00 Das Konvertieren einer Zahl in eine einzelne Zeichenfolge ist wahrscheinlich nicht die optimalste Option. Abhängig vom Kontext können Sie dies normalerweise vollständig vermeiden, aber für das einfachste Muster, das Sie verwenden können""+
Peter Lawrey
1
Sie haben Recht, aber ich wollte nur darauf hinweisen, da die Leute immer dazu neigen, darauf hinzuweisen.
RAnders00
1
@ RAnders00 Übrigens ist die Verwendung eines Nachrichtenformats um eine Größenordnung teurer und in diesem Fall komplizierter.
Peter Lawrey
Ja, man sollte stattdessen verwenden, Long.toString()da es das ist, was diese Lösung sowieso im Hintergrund verwendet :)
RAnders00
-1

Als Alternative String.formatund java.util.Formatterkönnte auch für Sie arbeiten ...

Frank Grimm
quelle
-6

Du könntest es versuchen:

String s = new Long(foo).toString();
mportiz08
quelle
8
Unnötige Objekterstellung. Verwenden Sie niemals neu mit Wrapper-Klassen.
Keiki