Como definir o separador de milhares em Java?

129

Como definir o separador de milhares em Java?
Eu tenho representação String de um BigDecimal que eu quero formatar com um separador de milhares e retornar como String.

Tempo de diversão
fonte
você está obtendo esses valores do DB?
Morto programador

Respostas:

110

Isso deve funcionar (não testado, com base no JavaDoc):

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

De acordo com o JavaDoc, o elenco na primeira linha deve ser salvo para a maioria das localidades.

Andreas Dolk
fonte
16
Comentário não foi testado sobre isso: Javadoc para getDecimalFormatSymbols()diz: Returns: a copy of the desired DecimalFormatSymbols. Então você deve usar setDecimalFormatSymbols(theCopy)depois de alterar a cópia.
Java.is.for.desktop 5/09/11
6
Os documentos para bd.longValue () dizem "qualquer parte fracionária será descartada". Então eu não sei se esta é a melhor maneira de fazer isso, se você se preocupa com precisão
codinguser
2
Eu acho que você pode usar newe configurá-lo novamente para o formatador: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong
Eu acho que você gostaria de usar \ u00a0 (espaço sem quebra) como separador de agrupamento. É o padrão para alguns códigos de idioma.
ACV
3
Por que você chama longValue? A questão era definir milhares de operadores para o BigDecimal, não muito tempo.
FINDarkside
232

Você pode usar a função de formatação com ",";

int no = 124750;
String str = String.format("%,d", no);

//str = 124,750

"," inclui caracteres de agrupamento específicos do código do idioma.

docs

syloc
fonte
11
E se eu quiser usar um .como separador?
Enissay
Como eu normalmente uso o String.format, é o melhor e mais fácil para mim!
Ali
16
@Enissay Chamada format()com um local explícita ( Local.USé conhecida a utilização ,como um separador) e, em seguida, substituir ,com o seu separador personalizado: String.format(Locale.US, "%,d", n).replace(',', '.').
Minipif 26/05
java.util.IllegalFormatConversionException:% d não pode formatar argumentos java.lang.String
Iman Marashi
1
@ImanMarashi Transmiti-lo para um int. Ou a long. Ou a BigInteger. E use f se quiser usar double, floatou BigDecimal.
Adowrath 5/09/16
56
BigDecimal bd = new BigDecimal(300000);

NumberFormat formatter = NumberFormat.getInstance(new Locale("en_US"));

System.out.println(formatter.format(bd.longValue()));

EDITAR

Para obter um separador de agrupamento personalizado, como espaço, faça o seguinte:

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setGroupingSeparator(' ');

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));
adarshr
fonte
Eu sei que eu preciso usar DecimalFormatSymbols setGroupingSeparator, mas eu não sei como aplicá-lo no meu BigDecimal
Funtime
1
@ Tempo de execução: você não "aplica no seu BigDecimal". Você cria um NumberFormatobjeto com as propriedades desejadas e o usa para formatar o seu BigDecimal. Um BigDecimaltem apenas um valor especificado, não possui um formato especificado.
Joachim Sauer
1
Note que o separador de milhares é geralmente um espaço rígido (quando é um espaço)
cquezel
Teve que alterar a linha superior na 2ª opção para símbolos DecimalFormatSymbols = new DecimalFormatSymbols (); para que isso funcione.
PaperThick
14

tente este código para formatar como usado no Brasil:

    DecimalFormat df = new DecimalFormat(
      "#,##0.00", 
      new DecimalFormatSymbols(new Locale("pt", "BR")));

    BigDecimal value = new BigDecimal(123456.00);

    System.out.println(df.format(value.floatValue()));

    // results: "123.456,00"
dellasavia
fonte
2
Você também tenta isso, no caso de JasperReports, forçando o formato correto: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); Envie este parâmetro para o relatório.
precisa saber é o seguinte
8

Se você estiver usando o separador de milhar para o tipo de dados Inteiro, use 1.

  1. Para dados inteiros Tipo

String.format ("%, d \ n", 58625) e a saída será 58.625

  1. Para dados de ponto flutuante, digite String.format ("% ,. 2f", 58625.21) e a saída será 58.625,21
Waqas Ahmed
fonte
Isso foi uma epifania. No entanto, você realmente precisa enfatizar que "," é apenas uma bandeira, não o caractere usado como separador de grupo. (Levei algum tempo para encontrar o problema.) Consulte docs.oracle.com/javase/7/docs/api/java/util/Formatter.html
Vankog
5
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setDecimalSeparator('|');
formatSymbols.setGroupingSeparator(' ');

String strange = "#,##0.###";
DecimalFormat df = new DecimalFormat(strange, formatSymbols);
df.setGroupingSize(4);

String out = df.format(new BigDecimal(300000).doubleValue());

System.out.println(out);
Programador morto
fonte
4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);
Gab
fonte
3

A resposta aceita deve ser realmente alterada, caso contrário não funcionará. O getDecimalFormatSymbols faz uma cópia defensiva. Portanto,

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

A nova linha é esta: formatter.setDecimalFormatSymbols (symbols);

Amio.io
fonte
2

Para decimais :

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
DecimalFormat dfDecimal = new DecimalFormat("###########0.00###");
dfDecimal.setDecimalFormatSymbols(symbols);
dfDecimal.setGroupingSize(3);
dfDecimal.setGroupingUsed(true);
System.out.println(dfDecimal.format(number));
akelec
fonte
1

Como mencionado acima, o link a seguir fornece o código do país específico para permitir que o Java localize o número. Todo país tem seu próprio estilo.

No link acima, você encontrará o código do país que deve ser colocado aqui:

...(new Locale(<COUNTRY CODE HERE>));

A Suíça, por exemplo, formata os números da seguinte forma:

1000,00 -> 1'000,00

Código do país

Para conseguir isso, os seguintes códigos funcionam para mim:

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("de","CH"));
nf.setMaximumFractionDigits(2);
DecimalFormat df = (DecimalFormat)nf;
System.out.println(df.format(1000.00));

O resultado é o esperado:

1'000.00
0xjacobb
fonte
1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20


Kadir Erturk
fonte
Embora esse código possa fornecer uma solução para a pergunta, é melhor adicionar contexto ao porquê / como ele funciona. Isso pode ajudar os usuários futuros a aprender e aplicar esse conhecimento ao seu próprio código. Também é provável que você tenha um feedback positivo dos usuários na forma de upvotes, quando o código é explicado.
borchvm 17/03