字符串之把字符串转换成整数

1.本题知识点

   char转int,int范围

2. 题目描述

  将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
  输入描述:
  输入一个字符串,包括数字字母符号,可以为空
  输出描述:
  如果是合法的数值表达则返回该数字,否则返回0

3. 思路

   这题要考虑全面。
   注意点如下:
   ① 参数校验,空字符串和是否合法数字(即小于等于’9’,大于等于’0’;)
   ②符号位处理。
   ③ int类型为4字节32位,判断溢出。
   ④ 使用错误标识枚举。
   还需要注意:char转int的处理,直接强转会转为ASCII码。
   Java版本:
package com.algorithm.str;

/**
 * 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,
 * 但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。
 * 数值为0或者字符串不是一个合法的数值则返回0。
 * @author wxq
 *
 */
public class Str2Int {
	
	enum Status{ KVaild,KInvalid};
	
	static Status g_Status = Status.KInvalid;
	
	public static void main(String[] args) {
		System.out.println(strToInt("222"));
		System.out.println(Str2Int.g_Status.values()[0].ordinal());
//		System.out.println(strToInt("2147483648"));
	}
	
	/**
	 * 模拟parseInt
	 * @param s
	 * @return
	 * @throws NumberFormatExceptionparseInt
	 */
	static int strToInt(String s) 
	{
	    if (s == null) {
	        return 0;
	    }
	
	    int result = 0;
	    int i = 0, len = s.length();
	    boolean negative = false;//默认 + 号
	    int limit = -Integer.MAX_VALUE;//int范围,用于防止数字超出范围
	    int digit;
	    char[] chars = s.trim().toCharArray();
	
	    if (len > 0) {
	    	//--------------1. 判断符号位------------------------
	        char firstChar = chars[0];
	        //可能以正负号开头
	        if (firstChar < '0') 
	        {
	            if (firstChar == '-') {
	                negative = true;
	                limit = Integer.MIN_VALUE;
	            }
	            else if (firstChar != '+'){
	                return 0;
	            }
	
	            //如果只有正负号,返回0
	            if (len == 1) return 0;
	            i++;
	        }
	        
	        //---------------2.遍历每一个字符 并组装数字-----------------
	        while (i < len) {
	        	//判断当前字符是不是数字
	        	if (chars[i] > '9' || chars[i] < '0') {
	        		return 0;
	        	}
	        	// char 转 int 的简单方法
	        	digit = (int) (chars[i] - '0');//防止字符转为ASCII码,我们要的是十进制的阿拉伯数字不是ASCII
	        	//① 先计算前面位数
	        	result *= 10;
	        	//② 再判断加上当前数是否超出范围
                if (result < limit + digit) {
                    return 0;
                }
                //③ 最后加上当前数字
                result -= digit;
	            i++;
	        }
	    }
	    else {
	        return 0;
	    }
	    
	    //设置k状态为有效
	    g_Status = Status.KVaild;
	    
	    return negative?result:-result;
	}
}





你可能感兴趣的:(数据结构和算法)