java.lang.NumberFormatException: для входной строки: «»-StringBuilder

#java #stringbuilder

Вопрос:

Основная цель программы — найти сумму извлеченной суммы в долларах в данной строке / найти сумму только числа, которое добавляется после $ знака, и результат суммы должен быть из введенных данных равен 50040. StringBiulder Объект поступает в каждый цикл, но когда я пытаюсь преобразовать его в toString и пытаюсь добавить его к сумме, появляется ошибка.

требуется преобразовать результат в число и добавить его к сумме, чего не происходит, и я получаю сообщение об ошибке:

java.lang.NumberFormatException: для входной строки: «»

Мой код:

 package com.example.demo;

public class DemoApplication2 {
    public static void main(String args[]) {
        
        long sum=0;
        String str = new String("#1 Tickets $50,000 Received $40. Expenses. ChequE.");
        char chararray[] = str.toCharArray();

        for (int i = 0; i < chararray.length; i  ) {
            StringBuilder someString = new StringBuilder();

            if (chararray[i] == '

Получение приведенной ниже ошибки:

     Exception in thread "main" java.lang.NumberFormatException: For input string: ""
        at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.base/java.lang.Long.parseLong(Long.java:702)
        at java.base/java.lang.Long.parseLong(Long.java:817)
        at com.example.demo.DemoApplication2.main(DemoApplication2.java:27)
 

Комментарии:

1. Хорошо, итак, что вы сделали для диагностики проблемы? Вы прошли через код в отладчике? Предположительно, на самом деле это ничего не добавляет, но мы не знаем, что такое входные данные или что вы ожидали получить в StringBuilder, или какова ваша фактическая цель, что затрудняет помощь вам.

2. См . codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question для руководства по заданию хорошего вопроса, с более подробной информацией, чем "вот код, вот исключение".

3. Подумайте о том, что произойдет, если вы столкнетесь с символом, которого нет $ , например, в самом начале вашего ввода кажется, что есть # символ. Что должно ss содержаться в этом случае? Вы ожидаете Long.parseLong(ss) здесь работать?

4. На стороне примечание: ваш внутренний цикл будет добавлять только цифры someString , поэтому s.trim() не должно быть необходимости. Однако подумайте о том, что произойдет с вашим значением второй валюты $40 . Что будет someString содержаться, если остальная часть вашего кода будет работать, и вы нажмете на символ 4 ?

5. ваш someString пуст. Это означает, что оператор if if Character.isDigit() имеет значение false. Вы, вероятно, только начинаете изучать Java, везде ставите много System.outs 🙂

Ответ №1:

Вот результат одного из моих тестов.

 The sum is 50040
 

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

Если логический переключатель имеет значение true, вы получаете следующие символы, пока не дойдете до символа остановки (точка или пробел). Я сделал предположение, основанное на вашем коде, что все числовые значения будут целочисленными, а не значениями с плавающей запятой. В противном случае вы бы использовали Double преобразование и double сумму.

Я проигнорировал символ запятой и собрал символы цифр в a StringBuilder . Я преобразовал StringBuilder цифры в long значение.

Я помещаю символы остановки в отдельный метод для документирования того, что они представляют.

Я помещаю StringBuilder long преобразование в отдельный метод, потому что я выполняю этот код дважды. Один раз, когда я обнаруживаю символ остановки и один раз в конце String . Я проверяю в конце String , если числовое значение находится в конце String без символа остановки.

Вот полный исполняемый код.

 public class DemoApplication2 {

    public static void main(String[] args) {
        long sum = 0;
        String str = new String("#1 Tickets $50,000 Received $40. Expenses. ChequE.");
        char chararray[] = str.toCharArray();
        
        boolean isNumber = false;
        StringBuilder builder = new StringBuilder();

        for (int i = 0; i < chararray.length; i  ) {
            if (isNumber) {
                if (chararray[i] == ',') {
                    continue;
                } else if (Character.isDigit(chararray[i])) {
                    builder.append(chararray[i]);
                } else if (isStopCharacter(chararray[i])) {
                    sum  = valueOf(builder);
                    isNumber = false;
                }
            }
            
            if (chararray[i] == '



) {
for (int j = i 1; Character.isDigit(chararray[j]) || chararray[j] == ',' ; j ) {
if (Character.isDigit(chararray[j])) {
someString.append(chararray[j]);
}
i=j;
}

}
System.out.println(someString.toString());
sum=sum Long.parseLong(someString.toString());
}
}
}
Получение приведенной ниже ошибки:


Комментарии:

1. Хорошо, итак, что вы сделали для диагностики проблемы? Вы прошли через код в отладчике? Предположительно, на самом деле это ничего не добавляет, но мы не знаем, что такое входные данные или что вы ожидали получить в StringBuilder, или какова ваша фактическая цель, что затрудняет помощь вам.

2. См . codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question для руководства по заданию хорошего вопроса, с более подробной информацией, чем "вот код, вот исключение".

3. Подумайте о том, что произойдет, если вы столкнетесь с символом, которого нет $ , например, в самом начале вашего ввода кажется, что есть # символ. Что должно ss содержаться в этом случае? Вы ожидаете Long.parseLong(ss) здесь работать?

4. На стороне примечание: ваш внутренний цикл будет добавлять только цифры someString , поэтому s.trim() не должно быть необходимости. Однако подумайте о том, что произойдет с вашим значением второй валюты $40 . Что будет someString содержаться, если остальная часть вашего кода будет работать, и вы нажмете на символ 4 ?

5. ваш someString пуст. Это означает, что оператор if if Character.isDigit() имеет значение false. Вы, вероятно, только начинаете изучать Java, везде ставите много System.outs 🙂

Ответ №1:

Вот результат одного из моих тестов.


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

Если логический переключатель имеет значение true, вы получаете следующие символы, пока не дойдете до символа остановки (точка или пробел). Я сделал предположение, основанное на вашем коде, что все числовые значения будут целочисленными, а не значениями с плавающей запятой. В противном случае вы бы использовали Double преобразование и double сумму.

Я проигнорировал символ запятой и собрал символы цифр в a StringBuilder . Я преобразовал StringBuilder цифры в long значение.

Я помещаю символы остановки в отдельный метод для документирования того, что они представляют.

Я помещаю StringBuilder long преобразование в отдельный метод, потому что я выполняю этот код дважды. Один раз, когда я обнаруживаю символ остановки и один раз в конце String . Я проверяю в конце String , если числовое значение находится в конце String без символа остановки.

Вот полный исполняемый код.


) {
isNumber = true;
}
}

sum = valueOf(builder);
System.out.println("The sum is " sum);
}

public static boolean isStopCharacter(char c) {
return c == ' ' || c == '.';
}

public static long valueOf(StringBuilder builder) {
long value = 0L;
if (builder.length() > 0) {
value = Long.valueOf(builder.toString());
builder.delete(0, builder.length());
}

return value;
}

}

) {
for (int j = i 1; Character.isDigit(chararray[j]) || chararray[j] == ‘,’ ; j ) {
if (Character.isDigit(chararray[j])) {
someString.append(chararray[j]);
}
i=j;
}

}
System.out.println(someString.toString());
sum=sum Long.parseLong(someString.toString());
}
}
}

Получение приведенной ниже ошибки:


Комментарии:

1. Хорошо, итак, что вы сделали для диагностики проблемы? Вы прошли через код в отладчике? Предположительно, на самом деле это ничего не добавляет, но мы не знаем, что такое входные данные или что вы ожидали получить в StringBuilder, или какова ваша фактическая цель, что затрудняет помощь вам.

2. См . codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question для руководства по заданию хорошего вопроса, с более подробной информацией, чем «вот код, вот исключение».

3. Подумайте о том, что произойдет, если вы столкнетесь с символом, которого нет $ , например, в самом начале вашего ввода кажется, что есть # символ. Что должно ss содержаться в этом случае? Вы ожидаете Long.parseLong(ss) здесь работать?

4. На стороне примечание: ваш внутренний цикл будет добавлять только цифры someString , поэтому s.trim() не должно быть необходимости. Однако подумайте о том, что произойдет с вашим значением второй валюты $40 . Что будет someString содержаться, если остальная часть вашего кода будет работать, и вы нажмете на символ 4 ?

5. ваш someString пуст. Это означает, что оператор if if Character.isDigit() имеет значение false. Вы, вероятно, только начинаете изучать Java, везде ставите много System.outs 🙂

Ответ №1:

Вот результат одного из моих тестов.


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

Если логический переключатель имеет значение true, вы получаете следующие символы, пока не дойдете до символа остановки (точка или пробел). Я сделал предположение, основанное на вашем коде, что все числовые значения будут целочисленными, а не значениями с плавающей запятой. В противном случае вы бы использовали Double преобразование и double сумму.

Я проигнорировал символ запятой и собрал символы цифр в a StringBuilder . Я преобразовал StringBuilder цифры в long значение.

Я помещаю символы остановки в отдельный метод для документирования того, что они представляют.

Я помещаю StringBuilder long преобразование в отдельный метод, потому что я выполняю этот код дважды. Один раз, когда я обнаруживаю символ остановки и один раз в конце String . Я проверяю в конце String , если числовое значение находится в конце String без символа остановки.

Вот полный исполняемый код.