Как отформатировать длинное целое число как строку без разделителя в 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/… .
Роб Х
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, кстати, использование формата сообщения на порядок дороже и в данном случае сложнее.
Питер Лоури
Да, вместо этого следует использовать, Long.toString()поскольку это решение в любом случае использует в фоновом режиме :)
RAnders00
-1

В качестве альтернативы String.formatи java.util.Formatterможет работать для вас , а также ...

Фрэнк Гримм
источник
-6

Вы можете попробовать:

String s = new Long(foo).toString();
mportiz08
источник
8
Создание ненужного объекта. Никогда не используйте new с классами-оболочками.
keiki