在Java中将字符转换为整数

69

有人可以向我解释一下这里发生了什么吗:

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呢?

编辑2: 43+ 的 ASCII 码,但我希望转换不成功就像 getNumericValue 一样。否则这意味着有两种语义等效的方式来执行相同的操作,但结果不同?


1
你期望得到的不是 43 吗? - PM 77-1
5
我认为getNumericValue不是你想象中的那样。它是一个实用方法,将字符转换为整数(例如,将字符'5'转换为整数5)。这与类型转换(将字符'5'转换为整数53)不同。请注意区分两者的差异。 - Aurand
重点是强制转换不会返回数字的数值。这两个操作执行的是两个不同的任务。 - SLaks
6个回答

96
Character.getNumericValue(c)

java.lang.Character.getNumericValue(char ch)方法返回指定Unicode字符表示的int值。例如,字符'\u216C'(罗马数字五十)将返回一个值为50的整数。

大写字母A-Z的unicode码为('\u0041' through '\u005A'),小写字母a-z的unicode码为('\u0061' through '\u007A'),全角形式的字母A-Z的Unicode码为('\uFF21' through '\uFF3A' and '\uFF41' through '\uFF5A'),它们的数字值从10到35。这与Unicode规范无关,因为该规范没有为这些字符值分配数字值。

此方法返回字符的数值作为非负整数:

如果该字符具有不是非负整数的数值,则返回-2;

如果该字符没有数值,则返回-1。

链接提供了更多详细信息。


40

如文档明确说明,Character.getNumericValue()返回字符作为数字的值。
如果字符不是数字,则返回-1

如果您想获取装箱的Character对象的数值Unicode代码点,则需要先取消装箱:

int value = (int)c.charValue();

7
你或许想要链接到这份文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#getNumericValue%28char%29。 - Vincent van der Weele

39

请尝试以下任意一种方法。应该都可以正常工作:

int a = Character.getNumericValue('3');
int a = Integer.parseInt(String.valueOf('3');

2
Character#getNumericValue的Javadoc中可以看出:
如果字符没有数字值,则返回-1。 如果字符具有无法表示为非负整数的数字值(例如分数值),则返回-2。
字符+没有数字值,因此您得到了-1。
更新:
原始转换给出43的原因是字符“+”被编码为整数43。

1

0
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接