Как мне преобразовать строку в Double в Java, используя конкретную локаль? - PullRequest
38 голосов
/ 20 мая 2009

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

Ответы [ 8 ]

63 голосов
/ 20 мая 2009

Попробуйте 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!

6 голосов
/ 20 мая 2009

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

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

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

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

4 голосов
/ 26 января 2014

Просто изучение Java и программирование. Был похожий вопрос. Нашел что-то подобное в моем учебнике:

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

В книге говорится, что сканер автоматически декодирует содержимое переменной String и что класс Scanner автоматически адаптируется к языку установленного языкового стандарта, системный языковой стандарт используется по умолчанию, но его легко установить для чего-то другого.

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

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

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

4 голосов
/ 20 мая 2009

Вы используете <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/text/NumberFormat.html" rel="nofollow noreferrer">NumberFormat</a>. Здесь - один пример, который, я думаю, выглядит правильным.

2 голосов
/ 20 мая 2009

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

2 голосов
/ 20 мая 2009

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

1 голос
/ 20 мая 2009

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

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

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

0 голосов
/ 09 октября 2012

Вот как вы используете 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);
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...