在 java 中的第 1、4 和 9 个字符后加上连字符

put hyphen after the 1st, 4th, and 9th character in java

我卡在这两个代码块上,找不到解决方案或弄清楚为什么它不起作用。

请在不更改方法 return 类型的情况下帮助我。

非常感谢。

第一块://第10位应该是X或余数但输出'?'。

public static char getCheckSum(String isbn) {
    int sum = 0;
    char charSum;

    for (int i = 0; i < isbn.length(); i++) {
        int[] num = new int[isbn.length()]; 
        num[i] = Character.getNumericValue(i) * (i+1);
        sum = sum + num[i];
    }

    int last = sum % 11;

    if (last == 10){
        charSum = 'X';
    } else {
        charSum = (char) last;
    }

    return charSum;
}

第二个块://无论我做什么,这个都会产生空值。我对这个迷路了。

public static String formatISBNWithHyphens(String isbn) {
    // original isbn:  123456789
    // new isbn :      1-234-56789-X
    char isbn10 = getCheckSum(isbn);// this method get sum and put 10th char in isbn


    String isbn10Str = Character.toString(isbn10);
    char[] c = new char[isbn10Str.length()];
    String[] cStr = new String[isbn.length()];
    String isbnStr = null;

    for (int i = 0; i < isbn10Str.length(); i++){
        c[i] = isbn10Str.charAt(i);
        if (i == 0 || i == 3 || i == 8 ) {
            c[i] += '-';
         }
         cStr[i] = Character.toString(c[i]);
         isbnStr += cStr[i];
    }

    return isbnStr;
}

在您的第一种情况下,last 的值可以来自 0 - 9(如果不是 10)。

您正在将 last 转换为 char,这会进行 ASCII 转换。

如果您查看 ASCII table,您会发现值 0 - 8 表示无法在大多数控制台上打印的特殊字符(而 9 是一个制表符)。这就是您看到 ? 的原因,因为控制台不知道如何打印字符。

在你的第二种情况下,你正在做 isbnStr += cStr[i],当 isbnStr 为 null 时,它有效地做 isbnStr = "null" + cStr[i]。很可能你的 cStr[i] 是一个隐形角色。这就是为什么您只在 return 字符串中看到 null

请注意,如果您使用 char,而您可以使用 String

,那么您最终将很难调试问题
public static String formatISBNWithHyphens(String isbn) {
    // original isbn:  123456789
    // new isbn :      1-234-56789-X
    char isbn10 = getCheckSum(isbn);// this method get sum and put 10th char in isbn


    String isbn10Str = isbn + Character.toString(isbn10); // Edit: You want the whole ISBN, not just the last char.
    String[] cStr = new String[isbn.length()];
    String isbnStr = ""; // EDIT: Initialize to empty string instead of null

    for (int i = 0; i < isbn10Str.length(); i++){
        cStr[i] = Character.toString(isbn10Str.charAt(i));
        if (i == 0 || i == 3 || i == 8 ) {
            cStr[i] += "-"; // Edit: Adding a char to another char will result in a different char. Not a concatenated string. So use Strings instead.
         }

         isbnStr += cStr[i];
    }
    return isbnStr;
}

注意:这将通过最小的更改解决您的第二个问题(尽管有更好的方法可以达到相同的结果)。

但是你的第一个问题 ? 仍然存在。这取决于你想用什么作为 isbn 中的最后一个字符。一方面,您可以 charSum = (char) (last + 'A'); 将其设为 alpha 范围。