Як я відформатую довге ціле число у вигляді рядка без роздільника на Java?


122

Просте запитання, але я думаю, що запитувати тут, ймовірно, буде більш прямо, ніж намагатися зрозуміти документацію для MessageFormat:

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

Спостережуване значення "12,345".

Бажане значення - "12345".

Відповіді:


62

Просто використовуйте Long.toString(long foo)


12
АбоString.valueOf(long)
rsp

6
String.valueOf () закликає Long.toString ()
Пітер Лорі

7
Можливо, це дрібниці, але в цьому випадку ви покладаєтесь на недокументовану поведінку Long.toString (foo). З цієї причини я віддаю перевагу відповіді Даніеля Фортунова.
Джон К

4
Це не без документації. Див. Download.oracle.com/javase/6/docs/api/java/lang/… .
Роб H

3
Гаразд, однак це рішення не застосовується до форматування повідомлень у ResourceBundle. Tuto i18n
Гійом Хуста

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

1
Дякую, я намагався зробити це за допомогою ін'єкції властивостей MessageFormat. Добре, що існує більше ніж один спосіб зробити це!
Філіхп Бусбі

3
я вважаю за краще цей спосіб. оскільки це дозволяє мені змінити формат у моєму файлі властивостей мови.
Паскаль

2
Ідеальне рішення! Допоміг мені зберегти параметр формату / неформатування в довідкових даних замість рівня коду - дякую! І як сказав @SebastianRoth - це повинна була бути прийнятою відповіддю.
Офер Ландо

9
Я насправді здивований, чому гарненькі числові рядки за замовчуванням, а не явна річ з форматером API
humblerookie

1
Це також працює у форматі вибору, якщо ви цитуєте шаблон:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0

1

Я трохи боровся з цим, намагаючись зробити інтернаціоналізацію "реального світу" тощо. Зокрема, у нас є потреба у використанні формату "вибір", коли вихід залежить від відображуваних значень, і саме java.text.ChoiceFormatдля цього потрібно.

Ось приклад того, як це зробити:

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

Це генерує такий вихід; Я сподіваюся, що це корисно для інших, хто намагається досягти одних і тих же речей:

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

Як бачимо, формат "вибір" дозволяє нам вибрати тип використовуваного формату залежно від значення, яке передається для форматування. Невеликі цифри можна замінити текстом (відсутність відображення вихідного значення). Середні величини показані без розділових груп (без коми). Найбільшу кількість знову включають коми. Очевидно, що це цілком надуманий приклад для демонстрації гнучкості java.text.MessageFormat.

Примітка про цитований #у тексті формат: оскільки обидва ChoiceFormatі MessageFormatвикористовуються, між ними виникає зіткнення метахарактерів. ChoiceFormatвикористовує в #якості метасимвола , що по суті означає «дорівнює» , так що форматування двигун знає , що , наприклад , в разі 1#one!ми порівнюємо {0}з 1, і якщо вони рівні, він використовує цей конкретний «вибір».

Але це #має інше значення MessageFormat, і це як метахарактер, який має значення для DecimalFormat: це метахарактер, що означає "поставити число сюди".

Оскільки він загорнутий у ChoiceFormatрядок, #потрібно процитувати. Коли ChoiceFormatбуде зроблено розбір рядка, ці лапки видаляються при передачі підформатів до MessageFormat(а потім у до DecimalFormat).

Тож, коли ви користуєтесь {0,choice,...}, ви повинні цитувати цих #символів та, можливо, інших.


0

Найкоротший шлях

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

3
І, як завжди, це розширюється, щоб new StringBuilder("").append(foo).toString()не було насправді оптимальним.
RAnders00

1
@ RAnders00 Перетворення числа в один рядок навряд чи буде найоптимальнішим варіантом, залежно від контексту, як правило, можна його цілком уникнути, але для найпростішого шаблону ви можете скористатися""+
Пітер Лоурі

1
Ви маєте рацію, але я просто хотів це зазначити, оскільки люди завжди прагнуть на це вказати.
RAnders00

1
@ RAnders00 btw, використовуючи формат повідомлення, на порядок дорожчий і складніший у цьому випадку.
Пітер Лорі

Так, замість цього слід використовувати, Long.toString()оскільки це все, що це рішення використовує у фоновому режимі :)
RAnders00,


-6

Ви можете спробувати:

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

8
Непотрібне створення об'єкта. Ніколи не використовуйте нове з класами обгортки.
keiki
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.