誰かがここで何が起こっているのか私に説明してください:
char c = '+';
int i = (int)c;
System.out.println("i: " + i + " ch: " + Character.getNumericValue(c));
これはi: 43 ch:-1
を出力します。それは私がchar
をint
に変換するためにプリミティブ変換に頼らなければならないことを意味しますか?それではどうやってCharacter
をInteger
に変換できますか?
編集:はい私はCharacter.getNumericValue
が数値ではないなら-1
を返すことを知っています、そしてそれは私にとって意味があります。問題は、プリミティブ変換を行うと43
が返されるのはなぜですか?
Edit2:43
は+
のASCIIですが、getNumericValue
が成功しなかったのと同じようにキャストが成功しないことを期待します。さもなければそれは同じ操作を実行するが異なる結果で2つの意味上同等な方法があることを意味しますか?
Character.getNumericValue(c)
Java.lang.Character.getNumericValue(char ch)
は、指定されたUnicode文字が表すint
値を返します。例えば、文字'\u216C'
(ローマ数字50)は、値50のintを返します。
大文字の('\u0041' through '\u005A')
、小文字の('\u0061' through '\u007A')
、および全角変形の('\uFF21' through '\uFF3A' and '\uFF41' through '\uFF5A')
形式のAからZの文字は、10から35までの数値を持ちます。これは、これらのchar値に数値を割り当てないUnicode仕様とは無関係です。
このメソッドは、文字の数値を負でないint値として返します。
文字が負でない整数ではない数値を持つ場合は-2。
文字に数値がない場合は-1。
そして ここ がリンクです。
ドキュメントが明確に述べているように、Character.getNumericValue()
は文字の値を数字として返します。
文字が数字でない場合は-1
を返します。
ボックス化されたCharacter
オブジェクトの数値Unicodeコードポイントを取得したい場合は、まずそれをボックス化解除する必要があります。
int value = (int)c.charValue();
以下のいずれかを試してください。これらはうまくいくはずです。
int a = Character.getNumericValue('3');
int a = Integer.parseInt(String.valueOf('3');
Character#getNumericValue
のJavadocから:
文字が数値を持たない場合は、-1が返されます。文字が負でない整数として表すことができない数値(例えば、小数値)を持つ場合、-2が返されます。
文字+
は数値を持たないので、-1になります。
更新:
原始変換が43を与えているのは、文字 '+'が整数43としてエンコードされているからです。
43は、「+」記号の10進数です。それはなぜあなたが43を取り戻すのかを説明します。 http://en.wikipedia.org/wiki/ASCII
public class IntergerParser {
public static void main(String[] args){
String number = "+123123";
System.out.println(parseInt(number));
}
private static int parseInt(String number){
char[] numChar = number.toCharArray();
int intValue = 0;
int decimal = 1;
for(int index = numChar.length ; index > 0 ; index --){
if(index == 1 ){
if(numChar[index - 1] == '-'){
return intValue * -1;
} else if(numChar[index - 1] == '+'){
return intValue;
}
}
intValue = intValue + (((int)numChar[index-1] - 48) * (decimal));
System.out.println((int)numChar[index-1] - 48+ " " + (decimal));
decimal = decimal * 10;
}
return intValue;
}