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

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

Попробуйте java.text.NumberFormat . Из Javadocs:

Чтобы отформатировать номер для другого языка, укажите его в вызове getInstance.

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

Вы также можете использовать NumberFormat для parsingа чисел:

 myNumber = nf.parse(myString); 

parse() возвращает Number ; поэтому, чтобы получить double , вы должны вызвать myNumber.doubleValue() :

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

Обратите внимание, что parse() никогда не вернет null , поэтому это не может вызвать NullPointerException . Вместо этого parse выдает проверенное ParseException если оно терпит неудачу.

Edit: Я изначально сказал, что есть другой способ конвертировать в double : отдать результат Double и использовать unboxing. Я думал, что, поскольку используется универсальный экземпляр 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

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

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

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

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

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

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

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

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

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

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

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

 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); } } 
  • Личные имена в глобальном приложении: что хранить
  • Как преобразовать строку в double с правильной культуройinfo
  • Схема для многоязычной базы данных
  • Каков второй параметр NSLocalizedString ()?
  • Правильная локализация приложения WinForms
  • Изменить язык во время выполнения?
  • «Ваш бинарный файл не оптимизирован для iPhone 5» после загрузки приложения с помощью xcode 6.0.1
  • Получать доступные локали для текста в речь (TTS)
  • Проблемы с локализацией строки StringFormat в wpf
  • Получать значения из * .resx-файлов в XAML
  • Локализация приложений для iPhone - проблемы с английским языком?
  • Interesting Posts

    Есть ли инструмент, который может обнаруживать (и, если возможно, исправлять) глюки в файлах MP3?

    Как я могу использовать несколько сводных таблиц на одном листе без ошибки перекрытия?

    Хранение идентификаторов R.drawable в массиве XML

    Node.js: сжатие Gzip?

    Являются ли enums C ++ подписанными или неподписанными?

    Производительность HTTP против HTTPS

    «Ошибка: тип несоответствия» в Spark с теми же найденными и требуемыми типами данных

    Что делает shift () в Perl?

    Как заставить родительский элемент появиться над дочерним элементом

    Не удалось выполнить цель org.apache.maven.plugins: maven-compiler-plugin: 2.3.2: компиляция (компиляция по умолчанию)

    Загрузка изображения iOS через AFNetworking 2.0

    В чем разница между ссылочным типом и типом значения в c #?

    Рекурсивное объявление указателя функции в C

    ViewPager внутри ScrollView не выполняет прокрутку соответствия

    onActivityResult () не вызывается в новом вложенном fragmentе API

    Давайте будем гением компьютера.