Как преобразовать String в Double в Java, используя определенную локаль?

Я хочу преобразовать некоторые числа, которые я получил как строки в парные числа, но эти цифры не в стандартном стандарте США, а в другом. Как я могу это сделать?

Ответ 1

Попробуйте 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 и использовать unboxing. Я думал, что, поскольку используется универсальный экземпляр NumberFormat (для Javadocs для getInstance), он всегда возвращался a double. Но DJClayworth указывает, что Javadocs для parse(String, ParsePosition) (который называемый parse(String)), говорят, что a Long возвращается, если это возможно. Поэтому листинг результата на double является небезопасным и не должен быть проверен!
Спасибо, DJClayworth!

Ответ 2

NumberFormat - это путь, но вы должны знать о его особенностях, которые возникают, когда ваши данные менее 100% правильны.

Я нашел следующее полезное:

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

Если вашему входу можно доверять, вам не о чем беспокоиться.

Ответ 4

Просто обучение Java и программированию. Имел подобный вопрос. В этом учебнике нашлось что-то подобное:

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

В книге говорится, что сканер автоматически расшифровывает то, что в переменном String, и что класс сканера автоматически адаптируется к языку установленного языка Locale, по умолчанию используется локальная система, но это легко установить на что-то еще.

Я решил свою проблему таким образом. Может быть, это может работать для вышеупомянутого вопроса вместо разбора?

Дополнение: Причина, по которой мне понравился этот метод, был тот факт, что при использовании свинг-клавиатур для ввода и затем пытается преобразовать строку в double с синтаксисом, я получил исключение NumberFormatException. Оказалось, что синтаксический анализ исключительно использует форматирование номера США, в то время как Scanner может обрабатывать все форматы. Сканер сделал работу безупречной работы даже с разделителем запятой (,). Поскольку самый проголосовавший ответ использует синтаксический анализ, я действительно не понимаю, как он решит эту конкретную проблему. Вам придется вводить ваши номера в формате США, а затем конвертировать их в формат локали. Это довольно неудобно, когда в числовом ключевом слове установлена ​​запятая.

Теперь вы можете свободно раскалывать меня на куски;)

Ответ 5

Это не должно быть проблемой при использовании java.text.DecimalFormat.

Ответ 6

Использовать NumberFormat.getNumberInstance(Locale)

Ответ 7

Знаете ли вы, какой язык это? Затем вы можете использовать

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

это даже будет работать для научных обозначений, строк с процентными знаками или строками с символами валюты.

Ответ 8

Вот как вы используете 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);
        }
}