Jak sformatować długą liczbę całkowitą jako ciąg bez separatora w Javie?


122

Proste pytanie, ale założę się, że pytanie tutaj będzie prawdopodobnie prostsze niż próba zrozumienia dokumentacji dla MessageFormat:

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

Zaobserwowana wartość to „12 345”.

Żądana wartość to „12345”.

Odpowiedzi:


62

Po prostu użyj Long.toString(long foo)


12
LubString.valueOf(long)
rsp

6
String.valueOf () wywołuje Long.toString ()
Peter Lawrey

7
Może to błahostka, ale w tym przypadku polegasz na nieudokumentowanym zachowaniu Long.toString (foo). Z tego powodu wolę odpowiedź Daniela Fortunova.
John K

4
To nie jest nieudokumentowane. Zobacz download.oracle.com/javase/6/docs/api/java/lang/… .
Rob H

3
OK, jednak to rozwiązanie nie ma zastosowania do formatowania wiadomości w ResourceBundle. Tuto i18n
Guillaume Husta

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

1
Dzięki, próbowałem to zrobić za pomocą wstrzyknięcia właściwości MessageFormat. Dobrze, że jest na to więcej niż jeden sposób!
Philihp Busby

3
wolę ten sposób. ponieważ pozwala mi zmienić format w moim pliku właściwości języka.
Pascal

2
Idealne rozwiązanie! Pomogło mi zachować opcję format / unformat w danych referencyjnych zamiast na poziomie kodu - dzięki! I jak powiedział @SebastianRoth - to powinna być zaakceptowana odpowiedź.
Ofer Lando

9
Właściwie jestem zaskoczony, dlaczego ładowanie ciągów liczbowych jest domyślną, a nie jawną rzeczą z interfejsem API programu formatującego
Humblerookie

1
Działa to również w wybranym formacie, jeśli zacytujesz wzór:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0

1

Trochę się z tym zmagałem, próbując tworzyć wzorce „świata rzeczywistego” z internacjonalizacją, itp. W szczególności musimy użyć formatu „wyboru”, w którym wynik zależy od wyświetlanych wartości i do tego właśnie java.text.ChoiceFormatsłuży.

Oto przykład, jak to zrobić:

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

Spowoduje to wygenerowanie następującego wyniku; Mam nadzieję, że jest to pomocne dla innych, którzy próbują osiągnąć ten sam rodzaj rzeczy:

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

Jak widać, format „wybór” pozwala nam wybrać typ formatu do użycia w zależności od przekazywanej wartości do sformatowania. Małe cyfry można zastąpić tekstem (brak wyświetlania oryginalnej wartości). Liczby średniej wielkości są wyświetlane bez separatorów grupujących (bez przecinków). Największe liczby ponownie zawierają przecinki. Oczywiście jest to całkowicie wymyślony przykład pokazujący elastyczność java.text.MessageFormat.

Uwaga na temat cytatów #w tekście formatu: ponieważ używane są oba ChoiceFormati MessageFormat, między nimi występuje kolizja między metaznakami. ChoiceFormatzastosowania #jako metaznak że zasadniczo oznacza „równa się” tak, że silnik formatowania wie, że na przykład w przypadku 1#one!jesteśmy w porównaniu {0}z 1, a jeśli są one równe, używa tego konkretnego „wybór”.

Ale #ma inne znaczenie MessageFormati jest to metaznak, który ma znaczenie DecimalFormat: jest to metaznak, który oznacza „umieść tutaj liczbę”.

Ponieważ jest zawinięty w ChoiceFormatciąg, #należy go cytować. Po ChoiceFormatzakończeniu analizowania ciągu te cudzysłowy są usuwane podczas przekazywania podformatów do MessageFormat(a następnie do DecimalFormat).

Więc kiedy używasz {0,choice,...}, musisz cytować te #znaki i prawdopodobnie inne.


0

Najkrótsza droga to

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

3
I jak zawsze, to się rozszerza, new StringBuilder("").append(foo).toString()więc nie jest optymalne.
RAnders00

1
@ RAnders00 Konwersja liczby na pojedynczy ciąg jest mało prawdopodobne, aby była najbardziej optymalną opcją, w zależności od kontekstu, w którym zwykle można go całkowicie uniknąć, ale dla najprostszego wzorca, którego możesz użyć""+
Peter Lawrey

1
Masz rację, ale chciałem tylko zwrócić na to uwagę, ponieważ ludzie zawsze zwracają na to uwagę.
RAnders00

1
@ RAnders00 btw przy użyciu formatu wiadomości jest o rząd wielkości droższe i bardziej skomplikowane w tym przypadku.
Peter Lawrey

Tak, zamiast tego należy używać, Long.toString()ponieważ i tak to rozwiązanie wykorzystuje w tle :)
RAnders00

-1

Jako alternatywa String.formati java.util.Formattermoże działać również dla Ciebie ...


-6

Możesz spróbować:

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

8
Niepotrzebne tworzenie obiektów. Nigdy nie używaj nowego z klasami opakowującymi.
keiki
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.