importjava.util.Scanner;importjava.util.Locale;importjava.text.NumberFormat;publicclassTesteDeFormatoDeNumero{privateScannerentrada=newScanner(System.in);/* * Método para ler o valor */privateStringgetValor(){System.out.print("Informe o valor: ");returnentrada.next();}/* * Método para converter o padrão ###.###,## para o padrão ######.## da String */privateStringformatarPadraoUS(){StringpadraoUS_p1=getValor().replace(".","");StringpadraoUS_p2=padraoUS_p1.replace(",",".");returnpadraoUS_p2;}publicstaticvoidmain(String[]args){//Instancia da classe TesteDeFormatoDeNumeroTesteDeFormatoDeNumeroteste=newTesteDeFormatoDeNumero();//Obtém o valor Double da String retornada pelo método formatarPadraoUSDoublevalorInformado=Double.valueOf(teste.formatarPadraoUS());System.out.println("Original: "+valorInformado);/* * Obtém o valor monetário 'forçando' que se seja do Brasil. * 1 - format(Double d): formata o valor Double para String; * 2 - new Locale(String language, String country): instancia uma localização com os parâmetros de idioma (português) e país Brasil; * 3 - getCurrencyInstance(Locale locale): retorna o valor formatado na moeda do locale */StringvalorFormatado=NumberFormat.getCurrencyInstance(newLocale("pt","BR")).format(valorInformado);System.out.println("Formatado: "+valorFormatado);}}
Rodando…
A
Albertassi88
você esta formatando o valor Double para String…
Eu preciso que seja o inverso, o meu valor 110.045,42 esta em string e preciso colocar ele em NumberFormat com as casas decimais…
Perceba que a saída é 540564**.52** !
Agora se tu quer pegar 540.564.52 ou formatar para valor monetário, vai ter que adaptar o que Iohannes falou.
Mas você também tá fazendo isso!
String > NumberFormat > Double
Você tá trabalhando com valor monetário?
A
Albertassi88
@Jelson1 Eu precisava que o valor retornasse com o ponto, dessa forma 540.564.52, não precisa ter o R$… só com o ponto mesmo, tem alguma outra forma?
S
staroski
No seu exemplo o valor não é 110.045,42 e sim 110.045.42.
A
Albertassi88
@staroski sim digitei errado, preciso que seja com 2 pontos dessa forma 110.045.42, como fazer?
J
Jelson1
Bom dia @Albertassi88, pegar a string “110.045.42”, do jeito que está e converter para Double não tem como. Você tem que remover o ponto, mas na hora de exibir você pode devolvê-lo!:
importjava.text.NumberFormat;importjava.util.Locale;publicclassMyClass{publicstaticvoidmain(Stringargs[])throwsException{Stringnum="540.564.52";num=num.replaceFirst("[.]","");//540564.52NumberFormatnf=NumberFormat.getInstance(newLocale("en","US"));//Agora tá em Double, posso somar, mutiplica...doublen=nf.parse(num).doubleValue();//na hora de exibir na tela coloco o ponto novamenteSystem.out.println(nf.format(n).replace(",","."));//540.564.42}}
A
Albertassi88
@Jelson1 muito boa a sua explicação, mais agora surgiu outra dúvida pois esse valor de 110.045.42 eu estou extraindo ele de um texto e no mesmo texto tem valores como por exemplo 545.42, todos os valores eu estou jogando em um array de double, só que os valores desse tipo 545.42, estão vindo convertidos errados por causa disso aqui: num = num.replaceFirst("[.]","");
Como fazer para receber os valores 110.045.42 e 545.42 convertidos na mesma variável corretamente?
J
Jelson1
Uma solução mais genérica usando expressão regular:
publicclassMyClass{publicstaticvoidmain(Stringargs[])throwsException{Stringnum="444.564.52";if(!num.matches("\\d*[.]\\d*")){num=num.replaceFirst("[.]","");}NumberFormatnf=NumberFormat.getInstance(newLocale("en","Us"));//Agora tá em Double, posso somar, mutiplica...doublen=nf.parse(num).doubleValue();//na hora de exibir na tela coloco o ponto novamenteSystem.out.println(nf.format(n).replace(",","."));//444.564.42}}
Se for realmente só esses dois tipos 444.444.44 e 444.44, você também pode fazer assim: trocando apenas o if da solução acima: