Como converter uma String para Double em Java usando uma localidade específica?

Eu quero converter alguns números que eu tenho como seqüências de caracteres em duplas, mas esses números não estão na localidade padrão dos EUA, mas em um diferente. Como eu posso fazer isso?

Tente java.text.NumberFormat . Dos Javadocs:

Para formatar um número para um local diferente, especifique-o na chamada para getInstance.

 NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH); 

Você também pode usar um NumberFormat para analisar números:

 myNumber = nf.parse(myString); 

parse() retorna um Number ; então, para obter um double , você deve chamar myNumber.doubleValue() :

  double myNumber = nf.parse(myString).doubleValue(); 

Observe que parse() nunca retornará null , portanto, isso não pode causar um NullPointerException . Em vez disso, o parse gera uma ParseException marcada se falhar.

Edit: Eu originalmente disse que havia outra maneira de converter para o double : converter o resultado para Double e usar unboxing. Eu pensei que uma vez que uma instância de propósito geral de NumberFormat estava sendo usada (por Javadocs para getInstance ), sempre retornaria um Double . Mas DJClayworth aponta que os Javadocs para parse(String, ParsePosition) (que é chamado por parse(String) ) dizem que um Long é retornado se possível. Portanto, converter o resultado para Double é inseguro e não deve ser tentado!
Obrigado, DJClayworth!

NumberFormat é o caminho a percorrer, mas você deve estar ciente de suas peculiaridades que surgem quando seus dados estão menos de 100% corretos.

Eu encontrei o seguinte útil:

http://www.ibm.com/developerworks/java/library/j-numberformat/index.html

Se sua input puder ser confiável, você não precisa se preocupar com isso.

Você usa um NumberFormat . Aqui está um exemplo, que parece correto.

Apenas aprendendo java e programação. Teve uma pergunta semelhante. Encontrei algo assim no meu livro:

 Scanner sc = new Scanner(string); double number = sc.nextDouble(); 

O livro diz que um scanner decodifica automaticamente o que está em uma variavel de String e que a class Scanner se adapta automaticamente ao idioma do conjunto Locale, o Locale do sistema é o padrão, mas isso é fácil de definir para outra coisa.

Eu resolvi meu problema dessa maneira. Talvez isso possa funcionar para a questão acima, em vez de analisar?

Adição: A razão que eu gostei deste método foi o fato de que, ao usar checkboxs de discagem de swing para input e, em seguida, tentando converter a seqüência de caracteres para duplicar com parse eu tenho um NumberFormatException. Descobriu-se que a análise usa exclusivamente a formatação de números dos EUA, enquanto o Scanner pode manipular todos os formatos. O scanner fez a input funcionar perfeitamente, mesmo com o separador decimal vírgula (,). Já que a resposta mais votada usa parse, eu realmente não vejo como isso resolveria esse problema em particular. Você teria que inserir seus números no formato americano e depois convertê-los para o formato local. Isso é bastante inconveniente quando um keybord numérico é equipado com uma vírgula.

Agora você está livre para me desfazer em pedaços;)

Isso não deve ser problema usando java.text.DecimalFormat.

Use NumberFormat.getNumberInstance (Locale)

Você sabe qual localidade é? Então você pode usar

 DecimalFormat format = DecimalFormat.getInstance(theLocale); format.parse(yourString); 

Isso também funcionará para notações científicas, strings com sinais de porcentagem ou strings com símbolos de moeda.

Aqui está como você usa parseDouble para converter uma String em um Double :

doubleExample.java

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class doubleExample { public static void main(String[] args) { Double myDouble = new Double("0"); System.out.println("Please enter a number:"); try { //get the number from console BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); myDouble = Double.parseDouble(br.readLine()); } //if invalid value was entered catch(NumberFormatException ne) { System.out.println("Invalid value" + ne); System.exit(0); } catch(IOException ioe) { System.out.println("IO Error :" + ioe); System.exit(0); } System.out.println("Double value is " + myDouble); } }