最近被问到这个问题并且不知道答案。从高层可以解释Java如何获取字符/字符串并将其转换为int。
非常感谢
卡尔
编辑:也很高兴知道其他语言是否也做类似的事情。
答案 0 :(得分:41)
通常这样做:
编辑:如果您使用正确的基数替换10并且从相应的字符中调整数字的获取(这应该适用于低于10的基数,但是需要),这适用于任何基数稍微调整一下更高的基数 - 比如十六进制 - 因为字母与数字分开7个字符)。
编辑2 :字符数字转换:字符“0”到“9”的ASCII值为48到57(0x30为0x30到0x39),所以为了将字符转换为数字值需要简单的减法。通常它是这样完成的(其中ord是给出字符ASCII码的函数):
digit = ord(char) - ord('0')
对于更高的数字基数,字母用作'数字'(六进制中的A-F),但字母从65开始(0x41 hexa),这意味着我们必须考虑到的差距:
digit = ord(char) - ord('0')
if digit > 9 then digit -= 7
示例:'B'为66,因此ord('B') - ord('0')= 18.由于18大于9,我们减去7,最终结果为11 - '的值'数字'B。
这里还要注意一件事 - 这只适用于大写字母,因此必须先将数字转换为大写字母。
答案 1 :(得分:25)
Java API的源代码是免费提供的。这是parseInt()方法。它相当长,因为它必须处理许多异常和极端情况。
public static int parseInt(String s, int radix)
throws NumberFormatException
{
if (s == null) {
throw new NumberFormatException("null");
}
if (radix < Character.MIN_RADIX) {
throw new NumberFormatException("radix " + radix +
" less than Character.MIN_RADIX");
}
if (radix > Character.MAX_RADIX) {
throw new NumberFormatException("radix " + radix +
" greater than Character.MAX_RADIX");
}
int result = 0;
boolean negative = false;
int i = 0, max = s.length();
int limit;
int multmin;
int digit;
if (max > 0) {
if (s.charAt(0) == '-') {
negative = true;
limit = Integer.MIN_VALUE;
i++;
} else {
limit = -Integer.MAX_VALUE;
}
multmin = limit / radix;
if (i < max) {
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
throw NumberFormatException.forInputString(s);
} else {
result = -digit;
}
}
while (i < max) {
// Accumulating negatively avoids surprises near MAX_VALUE
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
throw NumberFormatException.forInputString(s);
}
if (result < multmin) {
throw NumberFormatException.forInputString(s);
}
result *= radix;
if (result < limit + digit) {
throw NumberFormatException.forInputString(s);
}
result -= digit;
}
} else {
throw NumberFormatException.forInputString(s);
}
if (negative) {
if (i > 1) {
return result;
} else { /* Only got "-" */
throw NumberFormatException.forInputString(s);
}
} else {
return -result;
}
}
答案 2 :(得分:8)
我不确定你在寻找什么,就像“高水平”一样。我试试看:
total = (total x 10) + current
答案 3 :(得分:6)
public class StringToInt {
public int ConvertStringToInt(String s) throws NumberFormatException
{
int num =0;
for(int i =0; i<s.length();i++)
{
if(((int)s.charAt(i)>=48)&&((int)s.charAt(i)<=59))
{
num = num*10+ ((int)s.charAt(i)-48);
}
else
{
throw new NumberFormatException();
}
}
return num;
}
public static void main(String[]args)
{
StringToInt obj = new StringToInt();
int i = obj.ConvertStringToInt("1234123");
System.out.println(i);
}
}
答案 4 :(得分:3)
result = 0
( int j=maxSize, i =0 ; j > 0; j--, i++)
int digit = Character.digit(s.charAt(i))
result= result + digit * (10 power j-1)
答案 5 :(得分:1)
这是我对parse int
public static int parseInteger(String stringNumber) {
int sum=0;
int position=1;
for (int i = stringNumber.length()-1; i >= 0 ; i--) {
int number=stringNumber.charAt(i) - '0';
sum+=number*position;
position=position*10;
}
return sum;
}
答案 6 :(得分:0)
以下是我的想法(注意:没有对字母进行检查)
int convertStringtoInt(String number){
int total =0;
double multiplier = Math.pow(10, number.length()-1);
for(int i=0;i<number.length();i++){
total = total + (int)multiplier*((int)number.charAt(i) -48);
multiplier/=10;
}
return total;
}