在 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 范围。
我卡在这两个代码块上,找不到解决方案或弄清楚为什么它不起作用。
请在不更改方法 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 范围。