Исключение для исключения формата числа с D и F?

Я столкнулся с очень странной проблемой в моем коде. У меня есть простой преобразователь температуры, в котором пользователь вводит температуру в градусах Цельсия, а после нажатия «Преобразовать» отображается температура в градусах Фаренгейта. Если пользователь не вводит что-то допустимое (что-либо, кроме числа или десятичного числа), отображается диалоговое окно с ошибкой. Код:

btnConvert.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                String tempFahr = (String) enterDegreesC.getText();
                double tempF = Double.valueOf(tempFahr);
                double tempFConverted = tempF * 1.8 +32;            
                displayDegreesF.setText(tempFConverted + " Farenheit");
            }
            catch (NumberFormatException nfe) {
                JOptionPane.showMessageDialog(frmTemperatureConverter, "Please Enter a Number.", "Conversion Error", JOptionPane.ERROR_MESSAGE);                    
            }               
        }
    });

Довольно прямолинейный и простой код, который хорошо работает, за исключением одного. Когда я ввожу комбинацию из числа, за которым следуют буквы "f" или "d", диалоговое окно с ошибкой не отображается, а температура в градусах Фаренгейта рассчитывается с использованием цифры перед буквой. Это ТОЛЬКО происходит с «d» и «f» (и «D» и «F»), а не с любой другой буквой. Я в тупике на этом. Почему только эти две буквы, помещенные после цифры, не вызывают исключения и продолжают вычисления?


person ninge    schedule 10.03.2014    source источник
comment
Все это объясняется здесь, в документе: docs.oracle.com/javase/7/docs/api/java/lang/   -  person Alexis C.    schedule 10.03.2014


Ответы (3)


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

если вы просто написали 12.3, он мог бы не знать, является ли он числом с плавающей запятой или двойным (или ему пришлось бы сделать вывод или привести его).

Ваш синтаксический анализатор должен улавливать эти буквы.

  • 12.3d is 12.3 as a double
  • 12.3f is 12.3 as a float
person Sam I am says Reinstate Monica    schedule 10.03.2014
comment
и чтобы избежать этого, вам лучше использовать DecimalFormat для разбора() вашего ввода - docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html - person radai; 11.03.2014
comment
О, хорошо, это объясняет это. Спасибо, что прояснили это. Как интересно. - person ninge; 11.03.2014

Java интерпретирует такие числа, как 123f, как относящиеся к float, а 123d как double, тогда как простое 123 означает int.

person Ypnypn    schedule 10.03.2014

Прочтите документацию по числовому формату поддерживается parseDouble. f и d являются экземплярами FloatTypeSuffix.

person Chris Jester-Young    schedule 10.03.2014