java.lang.NumberFormatException:对于输入字符串:“”-StringBuilder

java.lang.NumberFormatException: For input string: ""-StringBuilder

该程序的主要目标是找到给定字符串中提取的美元金额的总和/找到附加在 $ 符号之后的唯一数字的总和,总和结果应来自采用的输入是 50040。StringBiulder 对象出现在每个循环中,但是当我尝试将其转换为 toString 并尝试将其添加到总和时,出现错误。

需要将结果转换为数字并将其添加到未发生的总和中,我收到错误:

java.lang.NumberFormatException: For input string: ""

我的代码:

package com.example.demo;

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

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

            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());
        }
    }
}

出现以下错误:

    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)

这是我的一项测试的结果。

The sum is 50040

执行此操作的一种方法是遍历 String,检查美元符号。当你找到一个时,你将一个布尔开关设置为真。

如果布尔开关为真,您将获得下一个字符,直到到达停止字符(句点或 space)。我根据您的代码假设数值都是整数值而不是浮点值。否则,您将使用 Double 转换和 double 总和。

我忽略了逗号字符并将数字字符收集到一个StringBuilder中。我将 StringBuilder 数字转换为 long 值。

我将停止字符放入一个单独的方法中以记录它们所代表的内容。

我将 StringBuilderlong 的转换放在一个单独的方法中,因为我执行了该代码两次。一次是当我检测到一个停止字符时,一次是在 String 的末尾。我在 String 的末尾进行检查,以防数字值位于 String 的末尾且没有停止字符。

这是完整的可运行代码。

public class DemoApplication2 {

    public static void main(String[] args) {
        long sum = 0;
        String str = new String("#1 Tickets ,000 Received . 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] == '$') {
                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;
    }

}