/*
分析:
str[0]-'0';
假如str[0]存放的数据类型是字符‘1’,那么减去‘0’就得到一个整形数字1,而不是字符型‘1’。
字符‘0’的ASCLL值是48,而字符‘1’是49,所以str[0]-'0'相当于49-48=1
*/
class StrToInt
{
/**
功能:将字符串转换成整数
@author ldp
@parm 待转换字符串
@return int型整数
*/
/*
//只能实现基本功能
static int strToInt(String str)
{
int num=0;
for (int i=0;i<str.length();i++ )
{
num=num*10+(int)(str.charAt(i)-'0');
}
return num;
}
*/
//考虑边界条件、错误处理
static int strToInt(String str)
{
long num=0;//因为后面要判断num是否超出int范围,所以先要用一个更大范围的类型表示num
//判断字符串是否为空
if (str==null)
{
System.out.println("输入的字符串不能为空!");
return -1;
}
//考虑输入的字符串带有正负号
int flag=1,k=0;
if (str.charAt(0)=='-')
{
flag=-1;
k++;
}else if (str.charAt(0)=='+')
{
k++;
}
//考虑输入的字符串中有不能转化的字符,只允许数字、a-z大小写字母以及大小写x(十六进制0x)出现
for (int i=k;i<str.length();i++ )
{
if (('0'<=(str.charAt(i))&&(str.charAt(i))<='9')||
('A'<=(str.charAt(i))&&(str.charAt(i))<='F')||
('a'<=(str.charAt(i))&&(str.charAt(i))<='f')||
(str.charAt(i)=='x')||
(str.charAt(i)=='X'))
continue;
else
{
System.out.println("输入的字符不能转化为整数!");
return -1;
}
}
//考虑十六进制、八进制、十进制
int radix=0;
if ((str.charAt(k)=='0')&&((str.charAt(k+1)=='x')||(str.charAt(k+1)=='X')))
{
k=k+2;
radix=16;
}else if (str.charAt(k)=='0')
{
k=k+1;
radix=8;
}else
radix=10;
//转换过程
if (radix==16)
{
for (int i=k;i<str.length();i++ )
{
if ('0'>=str.charAt(i)&&str.charAt(i)<='9')
{
num=num*radix+(str.charAt(i)-'0');
}else if (('A'<=(str.charAt(i))&&(str.charAt(i))<='F'))
{
num=num*radix+(str.charAt(i)-'A');
}else if (('a'<=(str.charAt(i))&&(str.charAt(i))<='f'))
{
num=num*radix+(str.charAt(i)-'a');
}
}
}
else
{
for (int i=k;i<str.length();i++ )
{
num=num*radix+(str.charAt(i)-'0');
}
}
//判断字符串转换成的数字是否超出int范围
if (((flag*num)<Integer.MIN_VALUE)||((flag*num)> Integer.MAX_VALUE))
{
System.out.println("超出int范围");
return -1;
}
return (int)(flag*num);//返回值必须在int的范围内
}
public static void main(String[] args)
{
String str="0X1234";
int num=strToInt(str);
System.out.println(num);
}
}
剑指offer_字符串转整数
最新推荐文章于 2021-03-30 11:17:37 发布