#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
без символа остановки.
Вот полный исполняемый код.