java string类型转换成int类型(string怎么强转int)

String是引用类型,int是基本类型,所以两者的转换并不是基本类型间的转换,这也是该问题提出的意义所在,SUN公司提供了相应的类库供编程人员直接使用

大家好,又见面了,我是你们的朋友全栈君。

1.问题思考:

需要明确的是String是引用类型,int是基本类型,所以两者的转换并不是基本类型间的转换,这也是该问题提出的意义所在,SUN公司提供了相应的类库供编程人员直接使用。

2.Integer.parseInt(str) 与 Integer.valueOf(Str).intValue() :

其实查看Java源码不难发现后者的实现是基于parseInt函数来实现的,所以很有必要分析parseInt源码。

3.Integer.parseInt(str) 源码分析:

 public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken to not use
         * the valueOf method.
         */

        if (s == null) {
            throw new NumberFormatException("null");
        }

        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        int result = 0;
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;
    }

加红源码如下:

public static int digit(char ch, int radix) {
        return digit((int)ch, radix);
    }
    /* @param   codePoint the character (Unicode code point) to be converted.
     * @param   radix   the radix.
     * @return  the numeric value represented by the character in the
     *          specified radix.
     * @see     Character#forDigit(int, int)
     * @see     Character#isDigit(int)
     * @since   1.5
     */
    public static int digit(int codePoint, int radix) {
        return CharacterData.of(codePoint).digit(codePoint, radix);
    }



可以看出加红代码是将字符 => Unicode(字符统一编码) =>  Unicode(数字统一编码) => 数字。

从上面的分析可以发现源码是取出字符串中的每个字符,然后将字符转换为数字进行拼接,但是在拼接的过程中SUN公司的编程人员是将其先拼接为负数,再用三元运算转换选择输出。自己并不认同,因为这样的做法是不利于理解,当然作者可能有自己的考虑,值得揣摩。

4.自己动手,丰衣足食:

  思路:

化整为零 ->  将引用类型的String分解为char;

逐个击破 ->  进本数据类型之间的转换Character.digit(ch,radix) / Character.getNumericValue(ch) 原理相同;

    由点及线-> 将数字放到不同权值得相应位置上,组成int型数值。

 注:

    正负号判断,数值长度判断,数字合法性校验(0-9)…

 CODEING:

public static int change(String s){
		int result = 0;     //数值
		int len = s.length(); 
		int indexEnd = len - 1;             //控制由右及左取字符(数字)
		int indexBegin = 0;     //起始位置(存在+ - 号)
		boolean negative = false;     //确定起始位置及输出结果标志符
		int position = 1;                   //权值:起始位置为个位
		int digit = 0;     //数字
		
	if(len > 0){
	    char firstChar = s.charAt(0);
            if (firstChar < '0') { 
                if (firstChar == '-') {
                    negative = true;
                    indexBegin = 1;
                }else if(firstChar == '+'){
                	indexBegin = 1;
                }else if (firstChar != '+'){
                	throw new NumberFormatException(s);
                } 
                if (len == 1) throw new NumberFormatException(s);
            }
            
            while (indexEnd >= indexBegin) {
            	//(int) s.charAt(indexEnd--);只是该字符的数字编码,十进制数字的Unicode码范围为48-57
            	if(s.charAt(indexEnd) < 48 || s.charAt(indexEnd)> 57){
            		throw new NumberFormatException(s);
            	}
                //int temp = Character.getNumericValue(s.charAt(indexEnd--));
                int temp = Character.digit(s.charAt(indexEnd--), 10);
                digit = temp * position;
                result += digit;
                position *= 10;
            }
		}
		return negative ? -result : result;
	}


5.C++的写法: 

handle four cases: – discards all leading whitespaces;- sign of the number;- overflow;- invalid input

int atoi(const char *str) {    int sign = 1, base = 0, i = 0;    while (str[i] == ' ') { i++; }    if (str[i] == '-' || str[i] == '+') {        sign = 1 - 2 * (str[i++] == '-'); //神一般的写法 或者 凡人 sign = str.charAt(i++) == '-' ? -1 : 1;    }    while (str[i] >= '0' && str[i] <= '9') {        if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {            if (sign == 1) return INT_MAX;            else return INT_MIN;        }        base  = 10 * base + (str[i++] - '0');    }    return base * sign;}


6.学无止境,Java升级版:

public static int myAtoi(String str) {
	    int index = 0, sign = 1, total = 0;
	    //1. Empty string
	    if(str.length() == 0) return 0;

	    //2. Remove Spaces
	    while(str.charAt(index) == ' ' && index < str.length()) // str = str.trim();
	        index ++;

	    //3. Handle signs
	    if(str.charAt(index) == '+' || str.charAt(index) == '-'){
	        sign = str.charAt(index) == '+' ? 1 : -1;
	        index ++;
	    }
	    
	    //4. Convert number and avoid overflow
	    while(index < str.length()){
	        int digit = str.charAt(index) - '0';
	        if(digit < 0 || digit > 9) break;

	        //check if total will be overflow after 10 times and add digit
	        if(Integer.MAX_VALUE/10 < total || Integer.MAX_VALUE/10 == total && Integer.MAX_VALUE %10 < digit)
	            return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;

	        total = 10 * total + digit;
	        index ++;
	    }
	    return total * sign;
	}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128955.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月15日 下午1:40
下一篇 2022年4月15日 下午1:40


相关推荐

  • idea 2021 mac 激活码【2021免费激活】[通俗易懂]

    (idea 2021 mac 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsaWNlbnNlSWQi…

    2022年3月25日
    68
  • 考研复试-数据库面试题[通俗易懂]

    考研复试-数据库面试题[通俗易懂]准备复试时自己从别的博客上复制的一些面试题,因为当时都复制到一个文本文件中了,也不知道从谁的博客上复制的。触发器的作用?答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。什么是存储…

    2022年6月21日
    33
  • meta标签设置用极速模式打开网页

    meta标签设置用极速模式打开网页1浏览器集成了多种浏览器内核,需要强制使用极速模式<metaname=”renderer”content=”webkit”/>2meta标签中X-UA-Compatible属性的使用的极速模式<metahttp-equiv=”X-UA-Compatible”content=”IE=edge,chrome=1″/>…

    2025年6月13日
    7
  • ASP.NET 状态服务 及 session丢失问题解决方案总结

    ASP.NET 状态服务 及 session丢失问题解决方案总结原文地址:http://www.cnblogs.com/weixing/archive/2009/09/08/session.html十分感谢作者这篇文章ASP.NET2.0系统时,在程序中做删除或创建文件操作时,出现session丢失问题。采用了如下方法:1、asp.netSession的实现:asp.net的Session是基于HttpModule技术做的

    2022年7月15日
    13
  • SQL 聚合函数之字符串分组合并[通俗易懂]

    SQL 聚合函数之字符串分组合并[通俗易懂]本文介绍了如何通过SQL函数对字符串进行聚合,也就是将多行字符串合并成单个字符串。包括Oracle(LISTAGG函数)、MySQL(GROUP_CONCAT函数)、SQLServer(STRING_AGG函数)、PostgreSQL(STRING_AGG函数)以及SQLite(GROUP_CONCAT函数)的语法和差异。

    2022年6月21日
    118
  • 函数局部有界性定理_函数有界性的定理如何证明

    函数局部有界性定理_函数有界性的定理如何证明2006 05 122 多元函数的值域是否为区间 2 多元函 2 多元函数的值域是否为区间 说是一个实数集更妥当 在大多数情形下 初等函数的值域是区间或若干个区间的并 3 一 详解一元函数为何 1 可导 可微 书上有专门的定理 并严格给出了证明 2 可导 连续 书上有专门的定理 并严格给出了证明 连续 可导 书上有专门的例子 是 y x 在 x 0 处 二 详解二元函数为何 1 可微 可偏导 书

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号