Como formatar um número inteiro longo como uma sequência sem separador em Java?

122

Pergunta simples, mas aposto que perguntar aqui provavelmente será mais direto do que tentar entender a documentação para MessageFormat:

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

O valor observado é "12.345".

O valor desejado é "12345".

Daniel Fortunov
fonte

Respostas:

62

Apenas use Long.toString(long foo)

Rob H
fonte
12
OuString.valueOf(long)
rsp
6
String.valueOf () chama Long.toString ()
Peter Lawrey
7
Talvez isso seja insignificante, mas neste caso você está confiando em um comportamento não documentado de Long.toString (foo). Por esse motivo, prefiro a resposta de Daniel Fortunov.
John K
4
Não é indocumentado. Consulte download.oracle.com/javase/6/docs/api/java/lang/… .
Rob H
3
OK, no entanto, esta solução não é aplicável à formatação de mensagens no ResourceBundle. Tuto i18n
Guillaume Husta
332
MessageFormat.format("{0,number,#}", foo);
Daniel Fortunov
fonte
1
Obrigado, eu estava tentando fazer isso com a injeção de propriedades MessageFormat. Ainda bem que há mais de uma maneira de fazer isso!
Philihp Busby
3
eu prefiro assim. pois ele me permite alterar o formato no meu arquivo de propriedades de idioma.
Pascal
2
Solução perfeita! Ajudou-me a manter a opção de formatar / não-formatar nos dados de referência, e não no nível do código - obrigado! E como o @SebastianRoth disse - essa deveria ter sido a resposta aceita.
Ofer Lando
9
Na verdade, estou surpreso por prettying cadeias numéricas um padrão e não uma coisa explícita com o formatador API
humblerookie
1
Isso também funciona dentro de um formato de escolha se você citar o padrão:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0
1

Lutei um pouco com isso ao tentar fazer padrões do "mundo real" com internacionalização, etc. Especificamente, precisamos usar um formato de "escolha" em que a saída dependa dos valores exibidos, e java.text.ChoiceFormaté para isso.

Aqui está um exemplo de como fazer isso:

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

Isso gera a seguinte saída; Espero que seja útil para outras pessoas que estão tentando realizar os mesmos tipos de coisas:

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

Como você pode ver, o formato "escolha" nos permite escolher o tipo de formato a ser usado, dependendo do valor que está sendo passado para ser formatado. Números pequenos podem ser substituídos por texto (sem exibição do valor original). Números de tamanho médio são mostrados sem separadores de agrupamento (sem vírgulas). Os números maiores incluem vírgulas novamente. Obviamente, este é um exemplo totalmente artificial para demonstrar a flexibilidade de java.text.MessageFormat.

Uma nota sobre a citada #no texto formato: uma vez que ambos ChoiceFormate MessageFormatestão sendo usados, há uma colisão entre metacharacters entre os dois. ChoiceFormatusa #como um metacaractere que significa essencialmente "iguais" para que o mecanismo de formatação saiba que, por exemplo, no caso de 1#one!comparações {0}com 1, e se forem iguais, ele usa essa "escolha" específica.

Mas #tem outro significado para MessageFormat, e isso é como um metacaractere que tem significado para DecimalFormat: é um metacaractere que significa "coloque um número aqui".

Por estar embrulhado em uma ChoiceFormatsequência, é #necessário citar. Quando a ChoiceFormatanálise é feita, essas aspas são removidas ao passar os subformatos para MessageFormat(e depois para DecimalFormat).

Então, quando você estiver usando {0,choice,...}, precisará citar esses #caracteres e possivelmente outros.

Christopher Schultz
fonte
0

O caminho mais curto é

long foo = 12345;
String s = ""+foo;
Peter Lawrey
fonte
3
E, como sempre, isso se expande para new StringBuilder("").append(foo).toString()que não seja realmente ideal.
precisa saber é o seguinte
1
@ RAnders00 Converter um número em uma única seqüência é improvável que seja a opção mais ideal, dependendo do contexto normalmente você pode evitá-lo completamente, mas para o padrão mais simples que você pode usar""+
Peter Lawrey
1
Você está certo, mas eu só queria salientar, já que as pessoas sempre tendem a apontar.
precisa saber é o seguinte
1
@ RAnders00 btw usando um formato de mensagem é uma ordem de magnitude mais cara e mais complicada nesse caso.
Peter Lawrey
Sim, um deve usar Long.toString()uma vez que é o que esta solução usa no fundo de qualquer maneira :)
RAnders00
-1

Como alternativa String.formate java.util.Formatterpode funcionar para você também ...

Frank Grimm
fonte
-6

Você poderia tentar:

String s = new Long(foo).toString();
mportiz08
fonte
8
Criação de objeto desnecessária. Nunca use new com classes de wrapper.
keiki