字符串问题----将整数字符串转换成整数值

将整数字符串转换成整数值

  

  给定一个字符串str,如果str符合日常书写的规范,并属于32位整数的范围,返回str所代表的整数值,否则返回0。如 023, A13, 2147483648,均返回0。

  【解题思路】

  定义四个变量,flag表示正负,res表示结果,minq表示最小值除以10的商,minr表示最小值除以10 的余数。因为最小值是 -2147483648,最大值是2147483647,负数有更大的范围,所以以负数的形式保留绝对值,最后根据flag进行修改。

package com.test;

/**
 * Created by Demrystv.
 */
public class convertNumAtr2NumVal {

    public int convert(String str){
        if (str == null || str.equals("")){
            return 0;
        }

        //不符合格式要求,不能转
        char[] chars = str.toCharArray();
        if (!isValid(chars)){
            return 0;
        }

        boolean flag = chars[0] == '-' ? false : true;
        int minq = Integer.MIN_VALUE / 10;
        int minr = Integer.MIN_VALUE % 10;
        int res = 0;
        int cur = 0;

        for (int i = flag ? 0 : 1; i < chars.length; i++) {
            cur = '0' - chars[i]; //用当前数字的负数形式
            // 超出范围
            if (cur < minq || (res == minq && cur < minr)){
                return 0;
            }
            res = res * 10 + cur;
        }

        //正好比整数的最大值大1
        if (flag && res == Integer.MIN_VALUE){
            return 0;
        }

        return flag ? -res : res;
    }

    private boolean isValid(char[] chars){

        // A02这种情况
        if (chars[0] != '-' && (chars[0] < '0' || chars[0] > '9' )){
            return false;
        }

        // - 或者 -012 这种情况
        if (chars[0] == '-' && (chars.length == 1 || chars[1] == 0)){
            return false;
        }

        // 012这种情况
        if (chars[0] == '0' && chars.length > 1){
            return false;
        }

        // 从第二位开始,对应的是 0B2
        for (int i = 1; i < chars.length; i++) {
            if (chars[i] < '0' || chars[i] > '9'){
                return false;
            }
        }
        return true;
    }

}

猜你喜欢

转载自www.cnblogs.com/Demrystv/p/9557659.html