java实现字符串转化为整数

1、思路及注意事项

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

概括起来有几种情况

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

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

3)整数溢出问题。

看看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比较再决定是否进行下一位的添加?不言而喻。

2、参考源码实现字符串转化为整数

可以对比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来求。

时间: 2024-08-02 12:47:37

java实现字符串转化为整数的相关文章

剑指offer 把字符串转化为整数

题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 思路:字符串转化为整数的方法num = num * 10 + str[i] - '0':特殊情况:1.输入字符串为NULL: 2.输入字符串只有+/-: 3.转化的数字大于最大值或小于

将字符串转化为整数

将字符串转化为整数要考虑到很多的情况,首先对于字符串是空指针的处理,字符串开始带有'+''-'的情况,字符串中有空格等不是数字的处理,对于这些情况的处理,主要运用的方法是定义一个全局变量,在字符串中出现一些特殊情况的时候,改变全局变量的方法,作为标示符,这样就可以达到预期的效果. int symbol = -1; int fun(const char *src) {long long num = 0; int flag = 1; int symbol = 1; while (src != NUL

170319 剑指offer 1.把一个字符串转化成整数(简单问题的全面性考虑)

工作的时间越长,越感觉基础的重要性,当我们对程序的框架结构越来越熟悉的时候,越会注意这一点,在工作当中,功能的实现是重要的,但是代码的健壮性,重用性,与扩展性确往往更为重要,在学习新技术的同时,我们或许应该抽出一点时间,去思考代码可能出现的问题. 关于剑指offer的这本书,可能所有刚毕业找工作的人,或者准备找工作的人都曾经看过,但是当时我们面对一些东西的时候心情过于浮躁,往往忽视了简单的却又十分重要的环节,(ps:也可能只有我是这样) 面试中一道简单的问题(把一个字符串转化成整数) 可能接触c

字符串转化为整数

今天做了一道简单的C语言题目,比较受打击,所以把过程记录下来,算是一个小小的教训吧. 问题描述: 实现atoi,将一个字符串转化为整数,函数原型如下: int atoi(const char *string); 看到这个问题感觉也不难,代码如下: int atoi(const char* string) { int sign=1; int num=0; int i=0,j=strlen(string); while( i<j && string[i]==' ')i++; if(str

将字符串转化为整数问题(C++)

 1.将字符串转化为整数问题(C++) 仿照atoi实现代码: // 仿照atoi函数实现字符串转化为整形数据问题 // #include "stdafx.h" enum MyEnum { eValid = 0,//合法 unValid //不合法 }; int mState = eValid;//定义全局变量,输入非法时设置该全局变量: //则通过检查该全局变量就能够判断输入是否合法: //实现字符串转化为整形数据atoi问题 int StrToInt(char* str) {

算法: 把字字符串转化为整数;

算法: 把字字符串转化为整数: * @问题: 把字符串转化为整数* 题目描述* 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),* 要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0.* 输入描述:* 输入一个字符串,包括数字字母符号,可以为空* 输出描述:* 如果是合法的数值表达则返回该数字,否则返回0* @思路: 转化为数组,判断非空:然后根据数字0到9的ASIC码来确定,判断数组

java --整形字符串转化

字符串转化为整形 Java中有两个可选的方法用来将字符串转成整型. 一个是Integer.parseInt(),另外一个是Ingeger.valueOf(). 这两个方法都是java.lang.Integer类中的静态方法. 当输入的字符串不是有效的整数,这两个方法都会抛出NumberFormatException异常. Integer.parseInt()和Integer.valueOf()最主要的不同的就是Integer.parseint()方法返回基础数据类型int 而valueOf()返

Python:利用内建函数将字符串转化为整数

使用内建函数raw_input()内建函数,它读取标准输入,并将读取到的数据赋值给指定的变量.我们可以使用int()内建函数将用户输入的字符串转换为整数: >>> user = raw_input("Enter login name:") Enter login name: root >>> print "Your Login is:", user Your Login is:  root 上面这个例子只能用于文本输入,下面输入一

字符串转化成整数

1 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0), 要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0. 输入 +2147483647       1a33 输出 2147483647        0 class Solution { public: int StrToInt(string str) { int n = str.size(), s = 1; long long re