Ошибка при разборе верхнего регистра, но не при разборе нижнего регистра Java - PullRequest
0 голосов
/ 25 февраля 2019

поэтому мой код - это программа, которая сообщает, является ли вода температурой, газообразной или твердой при определенных температурах, за которой следует единица измерения (градусы Фаренгейта или Цельсия).

Код работает для единиц измерения 'F', 'f',' c ', но не прописные буквы' C '.

    public static void stateOfWater() {
    Scanner inputTempString = new Scanner(System.in);
    System.out.print("Enter temperature: ");
    String temperatureString = inputTempString.nextLine().trim();
    String unit = temperatureString.substring(temperatureString.length()-1);
    unit = unit.toLowerCase();
    temperatureString = temperatureString.replace(unit,"");
    double temperature =  Double.parseDouble(temperatureString);

        if ( (temperature <= 0 && unit.equals("c")) || (temperature <= 32 && unit.equals("f")) ) {
            System.out.println("The state of the water is: solid (ice). ");
        }

        if (  ( (0.0 <= temperature && temperature < 100) && unit.equals("c")  ) || (((32 <= temperature && temperature < 212) && unit.equals("f")))) {
            System.out.println("The state of the water is: liquid. ");
        }

        if ((temperature > 100 && unit.equals("c")) || (temperature > 212 && unit.equals("f")))  {
            System.out.println("The state of the water is: gaseous. ");
        }
    }

Я получаю эту ошибку, когда пытаюсь ввести температуру, содержащую прописные буквы C:

Exception in thread "main" java.lang.NumberFormatException: For input string: "43C"
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.base/java.lang.Double.parseDouble(Double.java:543)
at lab2.Lab.stateOfWater(Lab.java:13)
at lab2.main.main(main.java:5)

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

На самом деле, вам даже не нужен блок!Просто проверьте последний символ данной строки и, если это 'F' или 'f', вычтите 32, чтобы получить градусы в градусах Цельсия.

public static void stateOfWater() {
    try (Scanner scan = new Scanner(System.in)) {
        System.out.print("Enter temperature (e.g. 35F or 35C): ");
        String str = scan.nextLine().trim();
        double degree = Double.parseDouble(str.substring(0, str.length() - 1));
        degree = Character.toUpperCase(str.charAt(str.length() - 1)) == 'F' ? degree : ((degree - 32) * 5) / 9;
        String state = Double.compare(degree, 0) <= 0 ? "solid (ice)" : Double.compare(degree, 100) < 0 ? "liquid" : "gaseous";
        System.out.println("The state of the water is: " + state + '.');
    }
}
0 голосов
/ 25 февраля 2019

Почему я получаю это исключение?

Вы переводите единицу в нижний регистр, а затем заменяете строку в нижнем регистре пустой.Если бы ваша строка была 43C, она попыталась бы заменить c пустой строкой ... Ну, это, конечно, не работает.

Сначала вы должны отрезать устройство от строки температуры., а затем переводит единицы в нижний регистр.

String input = inputTempString.nextLine().trim();
String unit = input.substring(input.length() - 1).toLowercase();
double temperature = Double.parseDouble(input.substring(0, input.length() - 1));

Но почему 43F работает, а 43C - нет?

Причина, по которой он действительно работает для заглавных букв F, заключается в том, что буква F является частью литерала с плавающей запятой, как указано в документации Double.parseDouble (String) , которая, в свою очередь, относится к Double.valueOf (String) , что, в свою очередь, ссылается на спецификацию языка Java § 3.10.2 , в которой этот токен называется токеном FloatTypeSuffix.


Кроме того, я предлагаю другой подход.

Я бы проанализировал вход, преобразовал его в стандартизированную единицу, например, по Цельсию, а затем для фрагмента кода, отвечающего за печать состояния воды,Я только должен был написать if заявления с оили два сравнения.Например, вместо вашего оператора if, например:

(((0.0 <= temperature && temperature < 100) && unit.equals("c")  ) || (((32 <= temperature && temperature < 212) && unit.equals("f"))))

у меня будет что-то более короткое:

String state = "";
if (temperature < 0) {
    state = "solid (ice)";
}
else if (temperature < 100) {
    state = "liquid";
}
else {
    state = "gaseous";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...