Java 字符串长度打印不正确,前面有0

Java 字符串长度打印不正确,前面有0,java,Java,我正在开发一个程序,该程序将要求用户输入ISBN号码(d1d2d3d4d5d6d7d8d9)的第一位9,然后根据一个等式打印出第十位的号码: (d1 × 1 + d2 × 2 + d3 × 3 + d4 × 4 + d5 × 5 + d6 × 6 + d7 × 7 + d8 × 8 + d9 × 9)%11) 如果校验和为10,则根据问题将最后一位数字表示为X。否则,最后一个数字将添加到ISBN中。除了用户输入的整数以0开头外,我还让程序工作 前 输入:113601267 输出:1136012

我正在开发一个程序,该程序将要求用户输入ISBN号码(
d1d2d3d4d5d6d7d8d9
)的第一位
9
,然后根据一个等式打印出第十位的号码:

(d1 × 1 + d2 × 2 + d3 × 3 + d4 × 4 + d5 × 5 + d6 × 6 + d7 × 7 + d8 × 8 + d9 × 9)%11)
如果校验和为
10
,则根据问题将最后一位数字表示为
X
。否则,最后一个数字将添加到ISBN中。除了用户输入的整数以0开头外,我还让程序工作

输入:113601267
输出:1136012676

输入:013032342
输出:“这是一个无效的ISBN条目!”

这是我的密码:

int ISBN, r, i;
String st;

Scanner keyboard;
keyboard = new Scanner(System.in);

System.out.println("Please enter the first 9 digits of your ISBN number:");
ISBN = keyboard.nextInt();

st = ("" + ISBN);

if (st.length() == 9){
    r = (st.charAt(0) * 1 + st.charAt(1) * 2 + st.charAt(2) * 3 + st.charAt(3) * 4 + st.charAt(4) * 5 + st.charAt(5) * 6 + st.charAt(6) * 7 + st.charAt(7) * 8 + st.charAt(8) * 9);

    if (r % 11 == 10){
        System.out.println("Your ISBN Number is: " + ISBN + "X");
    }
    else {
        System.out.println(st);
        i = (ISBN * 10) + (r % 11);
        System.out.println("Your ISBN Number is: " + i);
    }   
}
else {
    System.out.println("This is an invalid ISBN entry!");
}
我在哪里搞砸了,或者发生了什么事?

您有两个bug:

  • 如果需要,您应该重新格式化
    字符串
    ,将其置于0之前

  • 您有
    字符串
    String
    char
    s组成。如果您的第一个ISBN数字是
    1
    ,您实际上将执行
    '1'*1
    。由于
    '1'
    是一个字符,您将得到
    字符的int值,即
    49
    。您需要做的是从每个字符中减去“0”,以获得每个字符的实际
    int
    值:

    int ISBN, r, i;
    String st;
    
    Scanner keyboard;
    keyboard = new Scanner(System.in);
    
    System.out.println("Please enter the first 9 digits of your ISBN number:");
    ISBN = keyboard.nextInt();
    
    st = String.format("%09d", ISBN); // fixes your 0-bug.
    
    if (st.length() == 9){
        r = ((st.charAt(0) - '0') * 1 // fixes your computation bug.
           + (st.charAt(1) - '0') * 2
           + (st.charAt(2) - '0') * 3
           + (st.charAt(3) - '0') * 4
           + (st.charAt(4) - '0') * 5
           + (st.charAt(5) - '0') * 6
           + (st.charAt(6) - '0') * 7
           + (st.charAt(7) - '0') * 8
           + (st.charAt(8) - '0') * 9);
    
        if (r % 11 == 10){
            System.out.println("Your ISBN Number is: " + ISBN + "X");
        }
        else {
            System.out.println(st);
            i = (ISBN * 10) + (r % 11);
            System.out.println("Your ISBN Number is: " + i);
        }
    
    }
    else {
        System.out.println("This is an invalid ISBN entry!");
    }
    
    }


  • ISBN与其说是一个数字,不如说是一个字符串

    你试过这个吗

    ISBN = keyboard.nextLine();
    


    您要求的是
    int
    ,因此您得到的是
    int
    。数字不关心前导零,而是将它们分条。您可以使用
    keyboard.nextLine()
    keyboard.next()
    开始。我可以,但问题是:编写一个程序,提示用户输入前9位数字并显示10位ISBN,包括前导零。您的程序应该以整数形式读取输入您的ISBN是字符串而不是数字。前导的
    0
    s很重要,而数字将丢弃这些。您应该使用scanner.next()
    将其作为字符串读取,而不是将其转换为数字,然后再转换为字符串。除了st.length()之外,它运行得很好。如果整数以0开头,我将其转换为字符串,它将跳转到else语句。可能是因为有一个带0的整数前导,但我被告知需要输入一个整数。ISBN不是
    int
    (或
    long
    或任何数值)。告诉你的老师。ISBN是一个数字
    字符串
    值。感谢您的修复!我照你说的做了,现在让它打印字符串,而不是ISBN整数。这个问题似乎已经解决了。
    st = keyboard.nextLine();