字符串转换成整数

时间:2023-01-03 21:58:05

问题描述:输入一个由数字组成的字符串,把它转换成整数并输出,要求不能使用系统提供的转换函数或方法。

             例如:输入字符串"123",输出整数123。

             许多编程语言提供了字符串和各种类型的转换的函数或方法,但是我们也要会自己编写相应的转换方法或函数,其他类型的转换与此类似。

             这里我以字符串转换为整型为例,进行介绍。

   分析:基本思路是从左至右扫描字符串,把之前得到的数字乘以10,再加上当前字符表示的数字。但是在转换的过程中,需要注意几个问题。  

            1、空字符串输入:输入的是空字符串,对空字符串进行转换,程序可能会崩溃,因此需要先判断字符串是否为空。我们约定,当字符串为空时,返回0.

            2、正负符号:字符串可能不仅包含数字,还有可能是以'+'或'-'开头表示的正负整数字符串,因此需要对第一个字符进行特殊处理。

            3、非法字符:输入的字符串中可能含有不是数字,也不是"+"或者"-"这样的字符。因此,我们约定,每当碰到这些非法的字符时,停止转换,返回0。

            4、整型溢出:输入的数字是以字符串的形式输入,因此输入一个很长的字符串将可能导致溢出。因此要考虑边界问题。 我们约定:

                               当转化的值大于整型的最大值时,返回整型的最大值;

                               当转换的值小于整型的最小值时,返回整型的最小值;

           上述四个问题中,最难处理的是溢出问题,因此,对于溢出,有两种方法去解决。

            方法一:定义一个更大范围的变量,作为转换结果,并将转换结果与整型的最大值和最小值进行比较,判断是否溢出。此种方法比较简单,我不再写程序实现。

            方法二:读者可以结合下面的代码理解,在转换某位字符之前,

                       对于正整数,先比较之前转换的结果(本代码中为strint)和max / 10的大小,即:

                                        若strint > max / 10,那么说明最后一步转换时,strint *10必定大于max,此时直接返回max。

                                        若strint == max / 10 ,那么比较该位数字 c 和 max % 10的大小,如果c > max % 10,直接返回max。

                       对于负整数,同样先比较之前转换的结果(本代码中为strint)和min / 10的大小,即:

                                        若-1*strint < min / 10,那么说明最后一步转换时,-1*strint *10必定小于min,此时直接返回min。

                                        若-1*strint == min / 10 ,那么比较该位数字 -1*c 和 min % 10的大小,如果 -1*c < min % 10,直接返回min。

             由于第二种方法比较麻烦,这里我给出第二种方法的Java程序代码,代码写法都比较通用,读者可以很容易的转换为其他语言实现。

             需要注意,Java中整型占4个字节,不同的编程语言可能不太一样,读者需要结合自己的编程语言进行适当的调整。

             综上所述:完整的Java代码如下:

            

字符串转换成整数字符串转换成整数
 1 import java.util.*;
 2  class Test {
 3       public static int StringToInt(String str){
 4          int n=str.length();
 5          int strint=0;
 6          int sign=1;                                //符号标志
 7          if(n==0)return 0;                          //如果字符串为空,则返回 0
 8          
 9          if(str.charAt(0)=='+')                     //预先处理第一个字符,因为第一个字符可能带有符号位
10              sign=1;
11          else if(str.charAt(0)=='-')
12              sign=-1;
13          else if(str.charAt(0)>='0'&& str.charAt(0)<='9')
14                  strint=str.charAt(0)-'0';
15               else  return strint;
16          
17          int max=(int)(Math.pow(2,31)-1);            //整数为正数的最大值 ,由于Java中整形占4个字节,不同的语言可能不太一样,读者需要自己调整
18          int min=(int)Math.pow(-2,31);               //整数为负数的最小值
19          for(int i=1;i<n;i++)                           //依次处理后续字符
20          {   
21              if(str.charAt(i)<'0' || str.charAt(i)>'9')return 0;      //如果后续字符中出现非数字字符,则直接返回 0
22              int c=str.charAt(i)-'0';
23              if(sign==1 && (strint > max / 10 || (strint == max / 10 && c > max % 10)))    //最大值越界处理
24                  return max;
25              if(sign==-1 && (-1*strint <min/10 || (-1*strint== min / 10 && -1*c < min % 10)))  //最小值越界处理
26                  return min;
27             
28              strint=strint*10+c;                     //正常处理字符串每一位 的字符 
29          }
30          return sign*strint;                        //正常返回结果
31       }
32     }
33  
34 public class Main {
35     public static void main(String[] args) {
36       String str=new String("-21474836");        //读者可以根据需要进行各种测试,这里不再举例
37       System.out.println("str="+str);
38       System.out.println("转换为整型后为:"+Test.StringToInt(str));
39       
40     }
41 
42 }
View Code

输出结果为:

str=-21474836
转换为整型后为:-21474836

读者可以自己再举例进行验证。

 

 这个题目给出了将字符串转换为整数的方法和需要注意的几个问题,实际编程中,还会有其他类似的转换问题,比如将字符串转换为浮点型(还要考虑小数点问题),等等。

 但是这个题目给了我们一种转换的思路,还有需要注意的问题,总之,针对每个类型,要仔细考虑每个类型的特殊情况。关于其他类型的转换,本文不再祥述,读者可以照着这种思路进行考虑编程即可。