字符串转成整数

原题

  Implement atoi to convert a string to an integer.
  Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
  Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.html

题目大意

  实现一个atoi函数,将字符串转成整形
  要点:考虑全部的输入状况。git

解题思路

  前导字符是+或-或者没有,接下来输入的是数字,数字不能整数能表示的最大或最小数。若是超过就返回对应的最小或者最小的值。ide

代码实现

public class Solution {
    public int atoi(String str) {

        if (str == null || str.length() == 0) {
//            throw new NumberFormatException("Invalid input string: " + str);
            return 0;
        }

        // 若是字符串以空格开始
        int start = 0; //从开始找第一个不是空格的数
        boolean positive = true; // 是否为正数默认为true

        if (str.charAt(start) == ' ') {
            while (str.charAt(start) == ' ') {
                start++;
                if (start >= str.length()) { // 输入的全是空格
//                    throw new NumberFormatException("Invalid input string: " + str);
                    return 0;
                }
            }
        }

        if (str.charAt(start) == '-') { // 第一个非空白字符中-
            positive = false;
            start++;
        } else if (str.charAt(start) == '+') {// 第一个非空白字符是+
            start++;
        } else if (str.charAt(start) >= '0' && str.charAt(start) <= '9') { // 第一个非空白字符是数字
            return cal(str, start, true);
        } else { // 其它状况就抛出异常
//            throw new NumberFormatException("Invalid input string: " + str);
            return 0;
        }


        if (start >= str.length()) { // 第一个非空白字符是+或者-但也是最后一个字符
//            throw new NumberFormatException("Invalid input string: " + str);
            return 0;
        }

        if (str.charAt(start) > '9' || str.charAt(start) < '0') { // +或者-后面接的不是数字
//            throw new NumberFormatException("Invalid input string: " + str);
            return 0;
        } else {
            return cal(str, start, positive);
        }
    }

    private int cal(String str, int start, boolean positive) {

        long result = 0;
        while (start < str.length() && str.charAt(start) >= '0' && str.charAt(start) <= '9') {
            result = result * 10 + (str.charAt(start) - '0');

            if (positive) { // 若是是正数
                if (result > Integer.MAX_VALUE) {
//                    throw new NumberFormatException("Invalid input string: " + str);
                    return Integer.MAX_VALUE;
                }

            } else {
                if (-result < Integer.MIN_VALUE) {
//                    throw new NumberFormatException("Invalid input string: " + str);
                    return Integer.MIN_VALUE;
                }
            }

            start++;
        }

        if (positive) {
            return (int) result;
        } else {
            return (int) -result;
        }
    }
}

 

一、如何将字符串String转化为整数int
  int i = Integer.parseInt(str); 
  int i = Integer.valueOf(my_str).intValue(); 
   注: 字串转成Double, Float, Long的方法大同小异。 
二、如何将字符串String转化为Integer
   Integer integer=Integer.valueOf(i)
三、如何将整数 int 转换成字串 String? 
答:有三种方法: 
  String s = String.valueOf(i); 
  String s = Integer.toString(i); 
  String s = "" + i; 
注:Double, Float, Long 转成字串的方法大同小异。
四、如何将整数int转化为Integer
  Integer integer=new Integer(i)
五、如何将Integer转化为字符串String
   Integer integer=String()
六、如何将Integer转化为int
   int num=Integer.intValue()
七、如何将String转化为BigDecimal
   BigDecimal d_id=new BigDecimal(str)
函数

 

一、思路及注意事项ui

参考: http://blog.sina.com.cn/s/blog_514c89a90100d7qh.htmlthis

归纳起来有几种状况spa

1)字符串开头是“+”号或“-”号的处理code

2)非法字符的判断(不是数字)orm

3)整数溢出问题。htm

看看Java函数库中的Integer.parseInt(String sting)的源码如何处理这些问题的。

/**
 * Parses the specified string as a signed decimal integer value. The ASCII
 * character \u002d ('-') is recognized as the minus sign.
 *
 * @param string
 *			the string representation of an integer value.
 * @return the primitive integer value represented by {@code string}.
 * @throws NumberFormatException
 *			 if {@code string} cannot be parsed as an integer value.
 */
public static int parseInt(String string) throws NumberFormatException {
	return parseInt(string, 10);
}
 
/**
 * Parses the specified string as a signed integer value using the specified
 * radix. The ASCII character \u002d ('-') is recognized as the minus sign.
 *
 * @param string
 *			the string representation of an integer value.
 * @param radix
 *			the radix to use when parsing.
 * @return the primitive integer value represented by {@code string} using
 *		 {@code radix}.
 * @throws NumberFormatException
 *			 if {@code string} cannot be parsed as an integer value,
 *			 or {@code radix < Character.MIN_RADIX ||
 *			 radix > Character.MAX_RADIX}.
 */
public static int parseInt(String string, int radix) throws NumberFormatException {
	if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
		throw new NumberFormatException("Invalid radix: " + radix);
	}
	if (string == null) {
		throw invalidInt(string);
	}
	int length = string.length(), i = 0;
	if (length == 0) {
		throw invalidInt(string);
	}
	boolean negative = string.charAt(i) == '-';
	if (negative && ++i == length) {
		throw invalidInt(string);
	}
 
	return parse(string, i, radix, negative);
}
 
private static int parse(String string, int offset, int radix, boolean negative) throws NumberFormatException {
	int max = Integer.MIN_VALUE / radix;
	int result = 0, length = string.length();
	while (offset < length) {
		int digit = Character.digit(string.charAt(offset++), radix);
		if (digit == -1) {
			throw invalidInt(string);
		}
		if (max > result) {
			throw invalidInt(string);
		}
		int next = result * radix - digit;
		if (next > result) {
			throw invalidInt(string);
		}
		result = next;
	}
	if (!negative) {
		result = -result;
		if (result < 0) {
			throw invalidInt(string);
		}
	}
	return result;
}

 parseInt(String string,  int  radix)判断了

1) radix进制超出范围 ( Character. MIN_RADIX  = 2, Character. MAX_RADIX )=36)

2)字符串为null

3)字符串长度为空

4)字符串第一位为“-”且只有一位

  没有异常以后进行 parse(String string,  int  offset,  int  radix,  boolean  negative) 判断,参数即字符串,偏移量,进制, negative (若是开头没有“-”则offset=0,negative=false,不然为offset=1,neagtive=true)

   在 parse(String string,  int  offset,  int  radix,  boolean  negative)主要进行了溢出的判断。利用 offset++来控制移动,  在 while  (offset < length)  循环中 直到倒数 第二位的时候,若是已经 小于  max = Integer.MIN_VALUE / radix 的话代表必定会溢出。例如"-2147483648"

倒数第二位的时候 :result= -214748364,max = -214748364,max>result不成立代表 能够进行最后一位的处理。

      这里为何不先求得当前的结果再同 Integer.MIN_VALUE比较?而是先同 Integer.MIN_VALUE / radix比较再决定是否进行下一位的添加? 不言而喻。

二、参考源码实

现字符串转化为整数

能够对比 http://zhedahht.blog.163.com/blog/static/25411174200731139971/

public class StringToIntTest {
 
	/**
	 * @author 曹艳丰  北京大学
	 */
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		try {
			System.out.println(parseInt("cao21'''474fefda8364fe7"));
			System.out.println(parseInt("-2147483648"));
			System.out.println(parseInt("-2147483651"));
			System.out.println(parseInt("-2147483648"));
			System.out.println(parseInt("-21474836410"));
		} catch (MyException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
 
	}
 
	private static int parseInt(String string) throws MyException {
		/* 异常状况1:字符串为null */
		if (string == null) {
			throw new MyException("字符串为null!");
		}
		int length = string.length(), offset = 0;
		/* 异常状况2:字符串长度为0 */
		if (length == 0) {
			throw new MyException("字符串长度为0!");
		}
		boolean negative = string.charAt(offset) == '-';
		/* 异常状况3:字符串为'-' */
		if (negative && ++offset == length) {
			throw new MyException("字符串为:'-'!");
		}
		int result = 0;
		char[] temp = string.toCharArray();
		while (offset < length) {
			char digit = temp[offset++];
			if (digit <= '9' && digit >= '0') {
				int currentDigit = digit - '0';
				/*
				 * 异常状况4:已经等于Integer.MAX_VALUE / 10,判断要添加的最后一位的状况:
				 * 若是是负数的话,最后一位最大是8 若是是正数的话最后一位最大是7
				 */
				if (result == Integer.MAX_VALUE / 10) {
 
					if ((negative == false && currentDigit > 7)
							|| (negative && currentDigit > 8)) {
						throw new MyException("溢出!");
					}
					/*
					 * 异常状况5:已经大于Integer.MAX_VALUE / 10
					 * 不管最后一位是什么都会超过Integer.MAX_VALUE
					 */
				} else if (result > Integer.MAX_VALUE / 10) {
					throw new MyException("溢出!");
				}
 
				int next = result * 10 + currentDigit;
				result = next;
			}
		}
		if (negative) {
			result = -result;
		}
		return result;
	}
 
}
 
/* 自定义异常 */
class MyException extends Exception {
	/**
	 *
	 */
	private static final long serialVersionUID = 1749149488419303367L;
	String message;
 
	public MyException(String message) {
		// TODO 自动生成的构造函数存根
		this.message = message;
	}
 
	@Override
	public String getMessage() {
		// TODO 自动生成的方法存根
		return message;
	}
 
}

****************************

“若是是负数的话,最后一位最大是8 若是是正数的话最后一位最大是7”能够用Integer.MIN_VALUE%10和 Integer.MAX_VALUE%10来求。

相关文章
相关标签/搜索