Как мне преобразовать строку в Double в Java, используя конкретную локаль?
Я хочу преобразовать некоторые числа, которые я получил в виде строк, в двойные, но эти цифры не в стандартном стандарте США, а в другом. Как я могу это сделать?
8 ответов
Пытаться java.text.NumberFormat
, Из Javadocs:
Чтобы отформатировать номер для другой локали, укажите его в вызове getInstance.
NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
Вы также можете использовать NumberFormat для разбора чисел:
myNumber = nf.parse(myString);
parse()
возвращает Number
; так, чтобы получить double
Вы должны позвонить myNumber.doubleValue()
:
double myNumber = nf.parse(myString).doubleValue();
Обратите внимание, что parse()
никогда не вернется null
так что это не может вызвать NullPointerException
, Вместо, parse
бросает проверенный ParseException
если не получится.
Изменить: я изначально сказал, что есть еще один способ конвертировать в double
: приведите результат к Double
и использовать распаковку. Я думал, что так как экземпляр общего назначения NumberFormat
был использован (согласно Javadocs для getInstance
), это всегда будет возвращать Double
, Но DJClayworth указывает, что Javadocs для parse(String, ParsePosition)
(который называется parse(String)
) скажи что Long
возвращается, если это возможно. Поэтому приведение результата к Double
небезопасно и не должно быть судим!
Спасибо, DJClayworth!
NumberFormat - это путь, но вы должны знать о его особенностях, которые возникают, когда ваши данные верны менее чем на 100%.
Я нашел следующее полезное:
http://www.ibm.com/developerworks/java/library/j-numberformat/index.html
Если вашим данным можно доверять, вам не нужно об этом беспокоиться.
Просто изучаю Java и программирую. Был похожий вопрос. Нашел что-то подобное в моем учебнике:
Scanner sc = new Scanner(string);
double number = sc.nextDouble();
В книге говорится, что сканер автоматически декодирует то, что находится в переменной String, и что класс Scanner автоматически адаптируется к языку установленного языкового стандарта, системный языковой стандарт используется по умолчанию, но его легко установить для чего-то другого.
Я решил свою проблему таким образом. Может быть, это могло бы работать для вышеупомянутой проблемы вместо анализа?
Дополнение. Причиной, по которой мне понравился этот метод, был тот факт, что при использовании переключаемых диалоговых окон для ввода, а затем при попытке преобразовать строку в удвоенную с помощью parse я получил NumberFormatException. Оказалось, что parse использует только форматирование номеров в США, тогда как Scanner может обрабатывать все форматы. Сканер обеспечил безошибочную работу ввода даже с запятой (,). Так как наиболее голосующий ответ использует синтаксический анализ, я действительно не вижу, как это решило бы эту конкретную проблему. Вам нужно будет ввести свои номера в формате США, а затем преобразовать их в свой формат локали. Это довольно неудобно, когда цифровая клавиатура снабжена запятой.
Теперь вы свободны разорвать меня на куски;)
Вы используете NumberFormat
, Вот один пример, который, я думаю, выглядит правильно.
Это не должно быть проблемой при использовании java.text.DecimalFormat.
Вы знаете, какой это язык? Тогда вы можете использовать
DecimalFormat format = DecimalFormat.getInstance(theLocale);
format.parse(yourString);
это будет работать даже для научных обозначений, строк с процентными знаками или строк с символами валюты.
Вот как вы используете parseDouble
преобразовать String
к 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);
}
}