HOWTO · Java

Como Converter string para Dobrar em Java

Este artigo introduz vários métodos para converter uma string para um valor duplo e lidar com a NumberFormatException

Introduziremos diferentes maneiras de converter a string dada em um duplo em Java com alguns exemplos fáceis de entender.

Double.parseDouble() Método para converter uma string em um duplo

A melhor e mais fácil maneira de lançar uma string para dobrar em Java é utilizando o método estático parseDouble da classe Double.

O Double.parseDouble retorna um tipo primitivo.

public class Main {
  public static void main(String[] args) {
    String stringValue = "12.34";

    double doubleValue = Double.parseDouble(stringValue);
    System.out.println("Converted value: " + doubleValue);
  }
}

Resultado:

Converted value: 12.34

Pode ser um valor negativo ou positivo na string; este método analisará a string para double corretamente.

public class Main {
  public static void main(String[] args) {
    String stringValueNegative = "-12.34";
    String stringValuePositive = "+12.34";
    double doubleValueNegative = Double.parseDouble(stringValueNegative);
    double doubleValuePositive = Double.parseDouble(stringValuePositive);

    System.out.println("Converted negative value: " + doubleValueNegative);
    System.out.println("Converted positive value: " + doubleValuePositive);
  }
}

Resultado:

Converted negative value: -12.34
Converted positive value: 12.34

Double.valueOf() Método para converter uma string para o dobro

Quando precisamos de um objeto Double em vez de um objeto do tipo primitivo duplo, podemos utilizar o método Double.valueOf para obter um valor duplo de objeto de uma string.

public class Main {
  public static void main(String[] args) {
    String stringValueNegative = "-12.08d";
    String stringValuePositive = "+12.3400";

    Double doubleValueNegative = Double.valueOf(stringValueNegative);
    Double doubleValuePositive = Double.valueOf(stringValuePositive);
    System.out.println(doubleValueNegative);
    System.out.println(doubleValuePositive);
  }
}

Resultado:

-12.08
12.34

DecimalFormat.parse para Converter uma String em um Duplo

Se o valor que desejamos é algo como 1,11,111.12d, podemos utilizar a classe DecimalFormat para analisar a string a um doubleValue().

Mas como a classe DecimalFormat pode retornar valores diferentes como int ou byte, é necessário fazer todas as operações no bloco try-catch. E como desejamos um valor duplo, temos que utilizar o método de doubleValue() para obter definitivamente o tipo double.

import java.text.DecimalFormat;
import java.text.ParseException;

public class Main {
  public static void main(String[] args) {
    String stringValue = "1,11,111.12d";

    try {
      double doubleValue = DecimalFormat.getNumberInstance().parse(stringValue).doubleValue();
      System.out.println(doubleValue);

    } catch (ParseException e) {
      e.printStackTrace();
    }
  }
}

Resultado:

111111.12

Manusear NumberFormatException enquanto converte um valor de string para um valor duplo

Às vezes podemos obter NumberFormatException. Isso acontece porque o valor da string não é um valor duplo válido.

Para deixar isso mais claro, veremos um exemplo simples que lança essa exceção.

public class Main {
  public static void main(String[] args) {}
  String stringValue = "1,11";

  double d = Double.parseDouble(stringValue);
  System.out.println(d);
}
}

Resultado:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1,11"
	at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
	at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
	at java.base/java.lang.Double.parseDouble(Double.java:543)
	at com.company.Main.main(Main.java:14)

A exceção acontece porque 1,11 não é um valor duplo válido. A solução para este erro é substituir a vírgula por um ponto decimal, como estamos fazendo abaixo.

public class Main {
  public static void main(String[] args) {
    String stringValue = "1,11";

    double d = Double.parseDouble(stringValue.replace(",", "."));
    System.out.println(d);
  }
}

Resultado:

1.11