Converter String para NumberFormat

Estou tentando converter um valor exemplo 110.045,42 de string para NumberFormat

Estou fazendo dessa forma abaixo, só que quando o valor é convertido ele esta vindo sem as casas decimais, tipo 110.045. como resolver isso?

NumberFormat n1 = NumberFormat.getInstance();
valor = n1.parse(numnovo).doubleValue();

Um exemplo simples:

import java.util.Scanner;
import java.util.Locale;
import java.text.NumberFormat;

public class TesteDeFormatoDeNumero {
	private Scanner entrada = new Scanner(System.in);
	
	/*
	* Método para ler o valor
	*/
	private String getValor(){
		System.out.print("Informe o valor: ");
		return entrada.next();
	}
	
	/*
	* Método para converter o padrão ###.###,## para o padrão ######.## da String
	*/
	private String formatarPadraoUS(){
		String padraoUS_p1 = getValor().replace(".", "");
		String padraoUS_p2 = padraoUS_p1.replace(",", ".");
		
		return padraoUS_p2;
	}
	
	public static void main(String[] args){
		//Instancia da classe TesteDeFormatoDeNumero
		TesteDeFormatoDeNumero teste = new TesteDeFormatoDeNumero();
		
		//Obtém o valor Double da String retornada pelo método formatarPadraoUS
		Double valorInformado = 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
		*/
		String valorFormatado = NumberFormat.getCurrencyInstance(new Locale("pt", "BR")).format(valorInformado);
		
		
		System.out.println("Formatado: " + valorFormatado);
	}
}

Rodando…

image

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…

@Iohannes olha o exemplo na foto

Se você tem a string “540.564,52” e quer pegar o valor com as “casas decimais”! Você pode fazer assim:

import java.text.NumberFormat;
import java.util.Locale;

public class MyClass {
    public static void main(String args[])
    throws Exception
    {
      
      String num = "540.564,52";
      
      NumberFormat nf = NumberFormat.getInstance(new Locale("pt", "BR"));
      double n = nf.parse(num).doubleValue();
      System.out.println(n);
      //Saída >> 540564.52
    }
}

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!:thinking:
String > NumberFormat > Double

Você tá trabalhando com valor monetário?

@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?

No seu exemplo o valor não é 110.045,42 e sim 110.045.42.

@staroski sim digitei errado, preciso que seja com 2 pontos dessa forma 110.045.42, como fazer?

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!:

import java.text.NumberFormat;
import java.util.Locale;

public class MyClass {
    public static void main(String args[])
    throws Exception
    {
      
      String num = "540.564.52";
      num = num.replaceFirst("[.]","");//540564.52
      
      NumberFormat nf = NumberFormat.getInstance(new Locale("en", "US"));
      //Agora tá em Double, posso somar, mutiplica...
      double n = nf.parse(num).doubleValue();
      
      //na hora de exibir na tela coloco o ponto novamente
      System.out.println(nf.format(n).replace(",","."));
      //540.564.42
      
    }
}

@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?

Uma solução mais genérica usando expressão regular:

import java.text.NumberFormat;
import java.util.Locale;

public class MyClass {
    public static void main(String args[])
    throws Exception
    {
      
      String num = "444.564.52";
      
      if(!num.matches("\\d*[.]\\d*")){
        num = num.replaceFirst("[.]","");
      }
      
      NumberFormat nf = NumberFormat.getInstance(new Locale("en", "Us"));
      //Agora tá em Double, posso somar, mutiplica...
      double n = nf.parse(num).doubleValue();
      
      //na hora de exibir na tela coloco o ponto novamente
      System.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:

If(num.length()>6){
  num = num.replaceFirst("[.]","");
}

Uma dúvida esses números você vai precisar somar ou realizar alguma operação? Se não, porque você não faz um array de string em vez de double!

sim vou precisar somar, multiplicar por isso tenho q usar o double…

Ah, entendi agora! Deu certo agora?

sim obrigado