Forçar ponto (“.”) Como separador decimal em java

103

Atualmente, uso o seguinte código para imprimir um duplo:

return String.format("%.2f", someDouble);

Isso funciona bem, exceto que o Java usa o separador decimal do meu Locale (uma vírgula), enquanto eu gostaria de usar um ponto. Existe uma maneira fácil de fazer isso?

dtech
fonte
Se você precisar usar o valor duplo com decimais precisos, talvez você deva usar BigDecimal em vez de double / Double. Veja este link para problemas que você pode encontrar ao usar variáveis ​​duplas. Você também pode tentar isso: System.out.println (5.1d + 1.1d); - o resultado será 6,199999999999999 em vez de 6,2. Eu acho que alguém procurando como formatar números com decimais como String deve pular variáveis ​​duplas.
razvanone

Respostas:

172

Use a sobrecarga String.formatque permite especificar a localidade:

return String.format(Locale.ROOT, "%.2f", someDouble);

Se você estiver apenas formatando um número - como você está aqui - então usar NumberFormatprovavelmente seria mais apropriado. Mas se você precisar do restante dos recursos de formatação do String.format, isso deve funcionar bem.

Jon Skeet
fonte
6
Locale.ROOT é mais neutro.
speedogoo
@speedogoo: Editado, embora eu suspeite que a formatação de números não faz nenhuma diferença.
Jon Skeet
1
Sim, mas você não precisa escolher entre EUA e Reino Unido. 😜
speedogoo
2
Locale.ROOT também é seguro contra possíveis mudanças futuras na escolha do separador decimal de um país.
Attila Tanyi,
IMO isso não responde à pergunta, em vez do Locale.setDefault (new Locale ("en", "US")); faz conforme apontado em outra resposta. É verdade que talvez tenha efeitos colaterais indesejáveis, pois é global, OTH, como programador, o que eu realmente quero é que o padrão global seja US porque em todos os outros lugares em meu código onde eu me preocupo com a localidade, faço isso explicitamente.
nyholku
21

Uma solução mais drástica é definir seu Locale no início ().

Gostar:

Locale.setDefault(new Locale("en", "US"));
Federico Giorgi
fonte
11
Esta é uma resposta muito problemática, porque tem um efeito global e, portanto, pode causar muitas outras alterações (possivelmente indesejáveis).
sleske
2
IMO esta é a resposta correta para a pergunta e além de como programador é isso que eu quero. Quero que o Java use a localidade dos EUA por padrão, pois em todos os lugares em meu código onde eu realmente preciso de localização, vou torná-la explícita em meu código. Apenas meus hábitos, talvez, mas é muito chato quando printf / format usa meu Locale local, porque então a 'vírgula' decimal é totalmente incompatível com outro software (qualquer um Matlab) que eu uso.
nyholku
10

Você pode passar um Locale adicional para java.lang.String.format, bem como para java.io.PrintStream.printf (por exemplo, System.out.printf ()):

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

Isso resulta no seguinte (no meu PC):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

Vejo String.format na API Java.

Simon A. Eugster
fonte
4
Você também pode usar out.printf((Locale)null, ...)ou out.format((Locale)null, ...)para obter uma representação independente de localidade. (e também há Locale.ROOT)
eckes
10

Muito tarde, mas como outro mencionado aqui, é um exemplo de uso de NumberFormat(e sua subclasse DecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }
VizGhar
fonte
Tenho a sensação de que a criação DecimalFormatSymbolse configuração do separador deve ser feita uma vez, antes deste método.
Linha
0

Você pode usar NumberFormat e DecimalFormat.

Dê uma olhada neste link dos Tutoriais Java LocaleSpecific Formatting

A seção intitulada Formatação sensível ao local é o que você precisa.

blong824
fonte
-3

Eu tive o mesmo problema .. 55.1transformado em 55,10. Minha solução rápida (suja?) É:

String.format("%.2f", value).replaceAll(",",".");

Fred '
fonte
1
Isso funciona apenas até que alguém tente executar seu código em um local diferente. Não é uma solução real. -1
Marco Freudenberger