2016-12-18 3 views
2

Я получаю исключение NumberFormatException при попытке проанализировать число, такое как «15,7». Это будет «15,7» в формате США или Великобритании. я попытался получить локаль с ПК и анализировать на основе этого, следующим образом:NumberFormatException для строки ввода: "15,7"

if (strCountry.equals("IT")) { 
    locale = java.util.Locale.ITALIAN; 
} else { 
    locale = java.util.Locale.ENGLISH; 
} 

NumberFormat m_nf = NumberFormat.getInstance(locale); 
m_nf.setMaximumFractionDigits(1); 

лесозаготовок Я подтвердил, что система возвращает «IT» в стране. Синтаксический анализ затем попытался так:

Double nCount = new Double(m_nf.format(total_ff)); 

Однако это где исключение, из-за запятой используется в качестве десятичной точки. Я что-то пропустил? Благодаря!

+0

Попробуйте посмотреть в к переменной с плавающей чисел. – MadeInDreams

+0

@MadeInDreams Замените Double на Float? – petehallw

+0

Это зависит от того, что вы пытаетесь с этим сделать. Но да, вы должны работать с плавающей. Чтобы увидеть, видит ли javascript значение, как это, вы всегда можете использовать typeof. Он вернет тип номера, который он интерпретирует как. – MadeInDreams

ответ

2

Я думаю, вы смешиваете format() и parse() методов.

public final String format(double number) 

принимает в качестве параметра число и возвращает строку.

public Number parse(String source) throws ParseException 

принимает в качестве параметра строку и возвращает число.

В вашем случае у вас есть строка в определенном формате локали, и вы хотите получить числовое значение. Поэтому вы должны использовать parse(), а не format().

Вот пример:

public static void main(String[] args) throws ParseException { 
    Locale locale = java.util.Locale.ITALIAN; 
    String valueString = "15,7"; 
    NumberFormat m_nf = NumberFormat.getInstance(locale); 
    m_nf.setMaximumFractionDigits(1); 
    Double number = (Double) m_nf.parse(valueString); 
} 
+0

Если бы я их перепутал, не получил бы ошибку времени компиляции? Переменная в моем примере ('total_ff') имеет тип' Double'. Смутно, почему он говорит, что это строка в исключении, хотя ... – petehallw

+0

Потому что это две разные вещи. Исключенное исключение не связано с вызовом метода parse() '. Проблема возникает в вызове конструктора «Двойной»: «Двойной nCount = новый двойной (« 15,7 »);' который вызывает исключение. 'Double nCount = new Double (" 15.7 ");' работает. Я сказал, что вы смешиваете, потому что вы форматируете 'Double' как' String' в определенном формате Locale, и вы используете эту 'String' для создания' Double'. Вы не должны этого делать, поскольку конструктор 'Double' не зависит от' Locale'. Кроме того, просто совет: в следующий раз вы должны опубликовать весь необходимый код. Это облегчает понимание. – davidxxx

0

Попробуйте это, или их вариации:

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale); 
DecimalFormat format = new DecimalFormat("#.0", symbols); 
Double nCount = (Double) format.parse(total_ff); 

Edit: исправлен для анализа в соответствии с ответами других людей!

Смежные вопросы