我坚持使用这两个代码块,我找不到解决方案或弄清楚它为什么不起作用。
请在不更改方法返回类型的情况下帮助我。
非常感谢。
第一个阻止://第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;
}
答案 0 :(得分:1)
在第一种情况下,last
的值可以来自0 - 9
(如果不是10
)。
您正在将last
转换为字符,进行ASCII转换。
如果您查看ASCII table,您会发现值0 - 8
代表无法在大多数控制台上打印的特殊字符(并且9
是一个标签页)。这就是为什么你看到?
,因为控制台不知道如何打印字符。
在第二种情况下,您正在执行isbnStr += cStr[i]
,当isbnStr
为空时,它实际上是isbnStr = "null" + cStr[i]
。而且很可能你的cStr[i]
是一个看不见的角色。这就是为什么你只在返回字符串中看到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范围。