Java double parsedouble numberformatexception

Разобрать строку в число с плавающей запятой или int в Java

В этом посте мы обсудим, как преобразовать строку в число double, float или int в Java.

1. Использование Double.parseDouble() метод

Стандартное решение для анализа строки для получения соответствующего двойного значения использует метод Double.parseDouble() метод.

The Double.parseDouble() броски метода NumberFormatException если строка не содержит анализируемого двойника. Чтобы избежать внезапного завершения программы, заключите свой код в блок try-catch.

Обратите внимание, вы не можете анализировать такие строки, как 1.1 с использованием Integer.parseInt() метод. Чтобы получить целочисленное значение, вы можете привести результирующее двойное значение.

2. Использование Float.parseFloat() метод

В качестве альтернативы вы можете использовать Float.parseFloat() метод для синтаксического анализа строки в число с плавающей запятой.

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

3. Использование Integer.parseInt() метод

Чтобы получить целочисленное значение, представленное строкой в десятичном виде, вы можете использовать Integer.parseInt() метод, который анализирует строку как десятичное целое число со знаком.

4. Использование Number class

Чтобы проанализировать текст с начала заданной строки для получения числа, вы можете использовать метод parse() метод NumberFormat учебный класс. Этот метод может не использовать всю строку и выдает ParseException если строка начинается с любого неразборчивого нечислового символа.

Читайте также:  Border bottom with shadow css

The NumberFormat.parse() метод возвращает Number экземпляр класса, который предлагает intValue() , longValue() , floatValue() , doubleValue() , byteValue() , а также shortValue() методы для получения значения указанного числа в качестве соответствующего типа метода.

Источник

Понимание исключения NumberFormatException в Java

Поскольку он не отмечен , Java не заставляет нас обрабатывать или объявлять его.

В этом кратком руководстве мы опишем и продемонстрируем , что вызывает исключение NumberFormatException в Java и как его избежать или справиться с ним .

2. Причины исключения NumberFormatException ​

Существуют различные проблемы, вызывающие NumberFormatException . Например, некоторые конструкторы и методы в Java вызывают это исключение.

Мы обсудим большинство из них в разделах ниже.

2.1. Нечисловые данные, переданные конструктору

Давайте рассмотрим попытку создания объекта Integer или Double с нечисловыми данными.

Оба этих утверждения вызовут NumberFormatException :

 Integer aIntegerObj = new Integer("one");   Double doubleDecimalObj = new Double("two.2"); 

Давайте посмотрим на трассировку стека, которую мы получили, когда передали неверный ввод «один» конструктору Integer в строке 1:

 Exception in thread "main" java.lang.NumberFormatException: For input string: "one"   at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)   at java.lang.Integer.parseInt(Integer.java:580)   at java.lang.Integer.init>(Integer.java:867)   at MainClass.main(MainClass.java:11) 

Он выдал NumberFormatException . Конструктор Integer потерпел неудачу при попытке понять ввод с помощью parseInt() внутренне.

Java Number API не преобразует слова в числа, поэтому мы можем исправить код, просто изменив его на ожидаемое значение:

 Integer aIntegerObj = new Integer("1");   Double doubleDecimalObj = new Double("2.2"); 

2.2. Разбор строк, содержащих нечисловые данные

Подобно поддержке синтаксического анализа в конструкторе в Java, у нас есть специальные методы синтаксического анализа, такие как par seInt(), parseDouble(), valueOf() и decode() .

Если мы попытаемся сделать те же самые виды преобразования с ними:

 int aIntPrim = Integer.parseInt("two");   double aDoublePrim = Double.parseDouble("two.two");   Integer aIntObj = Integer.valueOf("three");   Long decodedLong = Long.decode("64403L"); 

Тогда мы увидим такое же ошибочное поведение.

И мы можем исправить их аналогичным образом:

 int aIntPrim = Integer.parseInt("2");   double aDoublePrim = Double.parseDouble("2.2");   Integer aIntObj = Integer.valueOf("3");   Long decodedLong = Long.decode("64403"); 

2.3. Передача строк с посторонними символами

Или, если мы попытаемся преобразовать строку в число с посторонними данными на входе, такими как пробелы или специальные символы:

 Short shortInt = new Short("2 ");   int bIntPrim = Integer.parseInt("_6000"); 

Тогда у нас будет та же проблема, что и раньше.

Мы могли бы исправить это, немного поработав со строками:

 Short shortInt = new Short("2 ".trim());   int bIntPrim = Integer.parseInt("_6000".replaceAll("_", ""));   int bIntPrim = Integer.parseInt("-6000"); 

Обратите внимание, что здесь, в строке 3, допускаются отрицательные числа , используя символ дефиса в качестве знака минус.

2.4. Форматы чисел, зависящие от локали

Давайте рассмотрим частный случай номеров, зависящих от локали. В европейских регионах запятая может обозначать десятичный разряд. Например, «4000,1» может представлять десятичное число «4000,1».

По умолчанию мы получим NumberFormatException , пытаясь разобрать значение, содержащее запятую:

 double aDoublePrim = Double.parseDouble("4000,1"); 

Нам нужно разрешить запятые и избежать исключения в этом случае. Чтобы сделать это возможным, Java должна понимать запятую здесь как десятичную.

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

Давайте посмотрим на это в действии, используя Locale для Франции в качестве примера:

 NumberFormat numberFormat = NumberFormat.getInstance(Locale.FRANCE);   Number parsedNumber = numberFormat.parse("4000,1");   assertEquals(4000.1, parsedNumber.doubleValue());   assertEquals(4000, parsedNumber.intValue()); 

3. Лучшие практики​

Давайте поговорим о нескольких хороших практиках, которые могут помочь нам справиться с NumberFormatException :

  1. Не пытайтесь преобразовать буквенные или специальные символы в числа — Java Number API не может этого сделать.
  2. Мы можем захотеть проверить входную строку с помощью регулярных выражений и выдать исключение для недопустимых символов .
  3. Мы можем дезинфицировать ввод от предсказуемых известных проблем с помощью таких методов, как trim() и replaceAll() .
  4. В некоторых случаях допустимы вводимые специальные символы. Поэтому мы делаем для этого специальную обработку, например, с помощью NumberFormat , который поддерживает множество форматов .

4. Вывод​

В этом руководстве мы обсудили исключение NumberFormatException в Java и его причины. Понимание этого исключения может помочь нам создавать более надежные приложения.

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

Наконец, мы увидели несколько лучших практик для работы с NumberFormatException .

Как обычно, исходный код, использованный в примерах, можно найти на GitHub .

Источник

How to Handle NumberFormatException in Java

Quite often in our code we get input from the user in the form of String, or maybe we save user input in String format. As example, I often work with metadata table (which normally contains key and value). And the value is in String. If the program need to do arithmetic operation or calculation, then this String need to be converted (parsed) into a numeric data types. One of the way to do conversion, is by using parseXXX() methods of wrapper classes (Convert String to int, Convert String to long, Convert String to double). NumberFormatException thrown when the application has attempted to convert a string to one of the numeric types, but the string does not have the appropriate format.

Following is the hierarchy of NumberFormatException:

Here an example of catching NumberFormatException in the program:

public class NumberFormatExceptionExample < public static void main(String[] args) < String s1 = "12"; int i1 = Integer.parseInt(s1); String s2 = "9L"; long l1 = Long.parseLong(s1); System.out.println(i1 * l1); // 100 try < int i3 = Integer.parseInt(s2); >catch (NumberFormatException e) < System.err.println("Unable to format. " + e); >> > /* Output: ------- 144 Unable to format. java.lang.NumberFormatException: For input string: "9L" */ 

String «9L» is valid for long but not valid for an int, that’s why NumberFormatException is thrown. So we can say, if the input is not numeric or «valid» format, than the method which try to convert String to number — in our case: Integer.parseInt() — will throw java.lang.NumberFormatException.

Here some common reason that commonly encounter in a String that causing NumberFormatException:

  • Null String: Since String is an object, it’s possible to have null value. If we passing this null value to any parseXXX() methods, it’ll throw NumberFormatException. (Tips: Check for null String)
  • Empty String: Similar like null String, String also can be empty. (Tips: Check for empty String)
  • «null» String: It’s maybe seems stupid, but we can encounter «null» String which is neither null or empty. (Tips: Check for String with «null» value, correct the program logic why «null» value happen)
  • String with whitespace: Either leading or trailing space, tab character, etc, unwanted whitespace can lead to NumberFormatException during conversion (Tips:Trim or stripyour String, sanitize our string input)
  • Alphanumeric String: Other than numeric character, some characters maybe allowed in String format — like ‘.’ for decimal, prefix ‘D» or ‘d’ for double, etc. But if the String contains unaccepted character, it will thrown NumberFormatException (Tips: Sanitize our string input)
try < System.out.println(Byte.parseByte(null)); >catch (NumberFormatException e) < System.out.println(e.getMessage()); // null >try < System.out.println(Short.parseShort("")); >catch (NumberFormatException e) < System.out.println(e.getMessage()); // For input string: "" >try < System.out.println(Integer.parseInt("null")); >catch (NumberFormatException e) < System.out.println(e.getMessage()); // For input string: "null" >try < System.out.println(Double.parseDouble(" 123.45")); // pass - 123.45 System.out.println(Double.parseDouble(" 123.45 ")); // pass - 123.45 System.out.println(Long.parseUnsignedLong("123.45 ")); >catch (NumberFormatException e) < System.out.println(e.getMessage()); // For input string: "123.45 " >try < System.out.println(Integer.parseUnsignedInt("+123")); // pass - 123 System.out.println(Integer.parseUnsignedInt("-123")); >catch (NumberFormatException e) < System.out.println(e.getMessage()); // Illegal leading minus sign on unsigned string -123. >try < System.out.println(Integer.parseUnsignedInt("123I")); >catch (NumberFormatException e) < System.out.println(e.getMessage()); // For input string: "123I" >

Conclusion: Handling NumberFormatException

NumberFormatException is one of the core exception and one of the most common errors in Java application after NullPointerException (and NoClassDefFoundError). It’s an unchecked exception, which will not checked during compilation time. As a RuntimeException, it will thrown during runtime.

Handling of exception is one of the most important practice for writing secure and reliable Java programs. The only way to solve this exception is to make sure the data is correct, we must sanitize the input (or reject it) if it’s not in our accepted format. On another hand, we must catch this exception whenever we are trying to convert a String into number.

Liked this Tutorial? Share it on Social media!

Источник

Оцените статью