Come formatto un intero lungo come stringa senza separatore in Java?


122

Domanda semplice, ma scommetto che chiedere qui sarà probabilmente più semplice che cercare di capire la documentazione per MessageFormat:

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

Il valore osservato è "12.345".

Il valore desiderato è "12345".

Risposte:


62

12
OppureString.valueOf(long)
rsp

6
String.valueOf () chiama Long.toString ()
Peter Lawrey il

7
Forse questo è insignificante, ma in questo caso ti affidi a un comportamento non documentato di Long.toString (foo). Per questo motivo, preferisco la risposta di Daniel Fortunov.
John K

4
Non è priva di documenti. Vedi download.oracle.com/javase/6/docs/api/java/lang/… .
Rob H

3
OK, tuttavia questa soluzione non è applicabile alla formattazione dei messaggi in ResourceBundle. Tuto i18n
Guillaume Husta

332
MessageFormat.format("{0,number,#}", foo);

1
Grazie, stavo cercando di farlo con l'iniezione delle proprietà MessageFormat. Meno male che c'è più di un modo per farlo!
Philihp Busby

3
Preferisco così. poiché mi consente di modificare il formato nel file delle proprietà della lingua.
Pascal

2
Soluzione perfetta! Mi ha aiutato a mantenere l'opzione format / unformat nei dati di riferimento invece che a livello di codice - grazie! E come ha detto @SebastianRoth, questa avrebbe dovuto essere la risposta accettata.
Ofer Lando

9
In realtà sono sorpreso del motivo per cui abbellire le stringhe numeriche è un valore predefinito e non una cosa esplicita con l'API del formattatore
humblerookie

1
Funziona anche all'interno di un formato a scelta se citi lo schema:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0

1

Ho lottato un po 'con questo quando ho provato a creare modelli "del mondo reale" con l'internazionalizzazione, ecc. Nello specifico, abbiamo bisogno di utilizzare un formato "a scelta" in cui l'output dipende dai valori visualizzati, ed è a questo che java.text.ChoiceFormatserve.

Ecco un esempio su come ottenere questo risultato:

    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));
    }

Questo genera il seguente output; Spero che sia utile per gli altri che stanno cercando di realizzare gli stessi tipi di cose:

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

Come puoi vedere, il formato "scelta" ci permette di scegliere il tipo di formato da utilizzare a seconda del valore che viene passato per essere formattato. I numeri piccoli possono essere sostituiti con testo (nessuna visualizzazione del valore originale). I numeri di medie dimensioni vengono visualizzati senza separatori di raggruppamento (senza virgole). I numeri più grandi includono le virgole, ancora una volta. Ovviamente, questo è un esempio del tutto artificioso per dimostrare la flessibilità di java.text.MessageFormat.

Una nota sul citato #nel testo in formato: poiché vengono utilizzati entrambi ChoiceFormate MessageFormat, c'è una collisione tra i metacaratteri tra i due. ChoiceFormatusi #come metacarattere che essenzialmente significa "uguale" in modo che il motore di formattazione sa che ad esempio nel caso di 1#one!stiamo confrontando {0}con 1, e se sono uguali, esso utilizza quella particolare "scelta".

Ma #ha un altro significato MessageFormat, ed è come un metacarattere che ha un significato per DecimalFormat: è un metacarattere che significa "metti un numero qui".

Poiché è racchiuso in una ChoiceFormatstringa, il valore #deve essere citato. Al ChoiceFormattermine dell'analisi della stringa, tali virgolette vengono rimosse quando si passano i sottoformati a MessageFormat(e quindi a DecimalFormat).

Quindi, quando lo usi {0,choice,...}, devi citare quei #personaggi e possibilmente altri.


0

La via più breve è

long foo = 12345;
String s = ""+foo;

3
E, come sempre, questo si espande, new StringBuilder("").append(foo).toString()quindi non è davvero ottimale.
RAnders00

1
@ RAnders00 È improbabile che la conversione di un numero in una singola stringa sia l'opzione ottimale, a seconda del contesto di solito puoi evitarla del tutto, ma per il modello più semplice che puoi usare""+
Peter Lawrey

1
Hai ragione, ma volevo solo farlo notare poiché le persone tendono sempre a farlo notare.
RAnders00

1
@ RAnders00 btw l'utilizzo di un formato di messaggio è un ordine di grandezza più costoso e più complicato in questo caso.
Peter Lawrey

Sì, si dovrebbe invece usare Long.toString()poiché è ciò che questa soluzione utilizza comunque in background :)
RAnders00

-1

In alternativa String.formate java.util.Formatterpotrebbe funzionare anche per te ...


-6

Potresti provare:

String s = new Long(foo).toString();

8
Creazione di oggetti non necessari. Non usare mai new con classi wrapper.
keiki
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.