atoi

作者: hekirakuno | 来源:发表于2019-09-29 16:16 被阅读0次

atoi指的是将字符型转换为整型的一种函数方法。
一开始我看到这个表述,并且示例字符串为“1234”的时候,我承认,我想当然地认为,要求写的这个函数就是针对于这个字符串的,所以什么范围界定,什么异常字符,统统抛之脑后,写完还沾沾自喜。最后,显而易见地,自然就是886。

atoi的功能,在java中对应的也就是Integer.valueOf方法,打开源码看一看,打脸啪啪啪。时刻感慨为什么自己就是个菜鸡呢?(点文集题,加分吗?)
如果大家看到上一行之后已经去阅读源码了,那么下文其实就不需要看了,学好源码定然是比看我的次等实现更好的。
如果大家看完源码想用鼻子嗤笑一下笔者究竟要如何弄大斧头欢迎继续,如果不想看源码只想瞅瞅简单地实现思路,也可以看下去,总之各位看官们给增加阅读量就很开心了。(www)

先看一下如何把String类型转化成int类型吧。
String类的value的类型是一个char[]数组。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
    ……
}

所以我们可以使用
char[] sc = s.toCharArray();
或者
char sc= s.charAt(i);//i表示数组的下标位
来获取它的具体值。
char转int就要涉及ASCII码的知识了,如果我们不记得相对应的码值,我们可以设置一个名为base的char表示0的码值,想要获取1的int值,就用1的char减去0的char就可以拿到了。

接下来我们需要考虑的是各种异常场景。
(1)传入的字符串为空;
(2)传入的数是符号数,如“-100”,“+200”;
(3)传入的数超过int值的范围;
(4)传入的不是数,如“abc”;

好了,开始写代码了。

public class AtoiStudy{
    private static final int MIN_VALUE = 0X80000000;
    private static final int MAX_VALUE = 0X7FFFFFFF;

    public static int atoi(String s){
        //传入的字符串为空
        if(s==null){
            throw new IllegalArgumentException("当前没有可转换的数据");
        }
        //使用long型,不然在临界值的时候会直接变成-1返回,无法拿到想要的异常报错
        long targetInt = 0;
        //转化后的数据
        int endInt = 0;
        //界限
        int limit = MAX_VALUE;
        //是否为负数
        boolean nagetive = false;
        //s的长度
        int len = s.length();
        //字符串char当前位置
        int i = 0;
        //字符串字符起始位置
        int j = 0;
        //进位
        int radix = 1;
        //判断首位
        if(len>0){
            //char类型比较使用==,并且单引号
            char head = s.charAt(j);
            //不是正常数字开头
            if(head<'0'){
                if('-' == head){
                    nagetive = true;
                    limit = -MIN_VALUE;
                }else {
                    if('+'!=head){
                        throw new IllegalArgumentException("不是标准的数据");
                    }
                    if(len == 1){
                        throw new IllegalArgumentException("不是标准的数据");
                    }
                }
                j++;
            }
        }
        //倒着从个位拿取
        for(i = len-1;i>=j;i--){
            int base = '0';
            char inVal = s.charAt(i);
            //不在数字域内
            if(inVal<'0'|| inVal>'9'){
                throw new IllegalArgumentException("不是标准的数据");
            }
            if(inVal-base>=0){
                if (nagetive) {
                    if(limit>(-targetInt)) {
                        throw new IllegalArgumentException("超出范围");
                    }
                }else{
                    if(limit<targetInt) {
                        throw new IllegalArgumentException("超出范围");
                    }
                }
                targetInt = targetInt + (inVal-base)*radix;
                radix = radix*10;
            }
        }
        endInt = (int)targetInt;
        return nagetive?-endInt:endInt;
    }
    public static void main(String[] args){
        String s = "-1000009";
        int value = atoi(s);
        System.out.println(value);
    }
}

相关文章

网友评论

      本文标题:atoi

      本文链接:https://www.haomeiwen.com/subject/pzvfpctx.html