精华内容
下载资源
问答
  • 前几天面试遇到这个问题:在Java中如何将字符串转化为整数,当时too young too naive,随便回答了一下。今天跑去看Java源码中paresInt函数的写法,Oh my god!其实不看也能写出来,但是我觉得源码中的实现更好。下面...

    前几天面试遇到这个问题:在Java中如何将字符串转化为整数,当时too young too naive,随便回答了一下。今天跑去看Java源码中paresInt函数的写法,Oh my god!其实不看也能写出来,但是我觉得源码中的实现更好。下面贴出源码顺道分析一下:

    1 /*@param s the {@code String} containing the integer2 * representation to be parsed3 * @param radix the radix to be used while parsing {@code s}.4 * @return the integer represented by the string argument in the5 * specified radix.6 * @exception NumberFormatException if the {@code String}7 * does not contain a parsable {@code int}.8 */

    9 public static int parseInt(String s, intradix)10 throwsNumberFormatException11 {12 /*

    13 * WARNING: This method may be invoked early during VM initialization14 * before IntegerCache is initialized. Care must be taken to not use15 * the valueOf method.16 */

    17

    18 if (s == null) {19 throw new NumberFormatException("null");20 }21

    22 if (radix

    24 " less than Character.MIN_RADIX");25 }26

    27 if (radix >Character.MAX_RADIX) {28 throw new NumberFormatException("radix " + radix +

    29 " greater than Character.MAX_RADIX");30 }31

    32 int result = 0;33 boolean negative = false;34 int i = 0, len =s.length();35 int limit = -Integer.MAX_VALUE;36 intmultmin;37 intdigit;38

    39 if (len > 0) {40 char firstChar = s.charAt(0);41 if (firstChar < '0') { //Possible leading "+" or "-"

    42 if (firstChar == '-') {43 negative = true;44 limit =Integer.MIN_VALUE;45 } else if (firstChar != '+')46 throwNumberFormatException.forInputString(s);47

    48 if (len == 1) //Cannot have lone "+" or "-"

    49 throwNumberFormatException.forInputString(s);50 i++;51 }52 multmin = limit /radix;53 while (i

    55 digit = Character.digit(s.charAt(i++),radix);56 if (digit < 0) {57 throwNumberFormatException.forInputString(s);58 }59 if (result

    首先参数:1)第一个是String,表示需要被转化的字符串;2)第二个是进制,表示字符串需要当做什么进制的字符串去解析。

    18-30行表示:如果是空字符串,或者进制低于能解析的最小进制(2)或者高于能解析的最大进制(36),则抛出异常;

    接下来看40-51行:这里主要是根据第一个字符去判断字符串代表的数字是正的还是负的,通过flag negative标记。

    剩余的部分比较复杂,先解释一下基本思想:取出字符串中的每一位字符,按照进制radix转化为数字,倘若不是数字,则返回值为-1,抛出异常。到这里都很好理解,包括39行的判断,都是很基本的。其实我一开始想的是,可以检测字符串的长度n,然后直接得出最后正数结果相应位置上的数字,大体算法如下:

    1 public static intparseInt(String s){2 int result = 0;3

    4 int length =s.length();5

    6 for(int index = 0; index < length; index ++){7 int number = s.charAt(index) - '0';//获取字符代表的数字8 result += number * Math.pow(10, length - index - 1);9 }10

    11 returnresult;12 }

    这里是简写,很多情况包括正负都没有考虑,并且默认是10进制,这是我的想法。但是我发现源码的想法并非如此,抽象出来大致如下:

    1 public static intparseInt(String s){2 int result = 0;3

    4 int length =s.length();5

    6 for(int index = 0; index < length; index ++){7 int number = s.charAt(index) - '0';8 result *= 10;9 result +=number;10 }11

    12 returnresult;13 }

    这样子写,减少了很多的乘法,原先在进位上需要做(1+n)n/2次乘法,后面则只需要n次,这是一次改进。

    接着代码要解决的是另外一个很重要的问题,Java中整数值都是32位的,它是有范围的。我们需要验证字符串转化之后是不是在这个范围以内,即[Integer.MIN_VALUE, Integer.MAX_VALUE]。这就是59-65行要做的事情。

    正数最大值可以达到2147483647,如果给出字符串“2147483648”,则解析出来肯定超范围。如何检测呢,根据上面的算法,假设解析到214748364,我们打断解析最后一位,可以通过Integer.MAX_VALUE-214748364 * radius <= 下一个digit来判断,如果表达式成立,则可以继续解析,否则不可以解析。但是这样想是有局限的,比如我们实际要解析的字符串是“89”,则可以看到其实上面那个表达式并不成立,但是89明显小于最大范围,可以解析,这里如何解决呢?

    我们可以这样:将范围同时缩小一个量级,即解析出来的结果不去和2147483647比较,而是和214748364比较,当超出这个范围的时候,我们再使用上面的表达式进行判断。负数亦然。按照这个思想,我将上面的代码改了一下:

    1 public static intparseInt(String s){2 int result = 0;3 int limit =Integer.MAX_VALUE;4 int upLimit = limit / 10;5

    6 int length =s.length();7

    8 for(int index = 0; index < length; index ++){9 int number = s.charAt(index) - '0';10

    11 if(result > upLimit)//这个时候乘以result * 10,必然大于Integer.MAX_VALUE

    12 return -1;13

    14 if(result == upLimit && (limit - result * 10)

    17 result *= 10;18 result +=number;19 }20

    21 returnresult;22 }

    注意代码中11行的注释。我使用几个边界数字测试的结果是正确的,这里同样默认是正数,最大只能解析到2147483647。Java的实现和这个就差不多了,但是Java奇怪的地方是在于使用减法而非加法,可以详细对比一下Java源码的66行和上面我的代码的第18行。Java的这种想法在其代码的第71行也有表现,我们可以看到,当值是负数的时候,直接返回result,否则是要取负数的。

    Java源码在52行设置了multmin,59-61行代码和我的代码的11-12行作用一样,62-65行则和我代码的14-15行代码一样。但是我的代码这样写,是需要分类讨论的,即需要分为正负数去讨论。Java的精妙在于:将传入的字符串去掉正负号,根据正负设定下限,然后使用同一种方法去解析剩余的字符串,而可以不管正负!

    在Java的源码中,如果传入的是正数,则下限是-Integer.MAX_VALUE,如果是负数,则下限是Integer.MIN_VALUE,然后使用negative去判断返回的时候是不是应该添加负号。中间则按照上面的思路,59-61行用来确保result * radix不会超出界限,62-65行则用来判断最终是否超出界限。注意,我的代码和Java的代码其实都注意到一点,Java代码中63行比较符合思维的写法应该是:

    1 if (result - digit < limit) {

    但是Java并没有这样写,而是写成源码中的形式,我的代码14行也是如此,这里的主要原因是,这行代码本身就是检测result-digit是否超出界限的,如果按照上面的写法,result-digit如果超出界限,则会报错,但是按照Java源码的写法,limit+digit是肯定在表示范围内的!

    另外,注意,这里并不存在统一设置上限的写法,因为-Integer.MIN_VALUE > Integer.MAX_VALUE!

    展开全文
  • Java实现字符串转换整数

    万次阅读 多人点赞 2019-07-21 14:52:11
    输入一个由数字组成的字符串,请把它转换整数并输出。例如,输入字符串“123”,输出整数123。 请写出一个函数实现该功能,不能使用库函数。 2 解决方案 解答本问题的基本思路:从左至右扫描字符串中的每个字符,...

    1 问题描述
    输入一个由数字组成的字符串,请把它转换成整数并输出。例如,输入字符串“123”,输出整数123。

    请写出一个函数实现该功能,不能使用库函数。

    2 解决方案
    解答本问题的基本思路:从左至右扫描字符串中的每个字符,把之前扫描得到的数字乘以10,再加上当前字符表示的数字。

    但是,基本思路是这样,还要注意以下几点:

    (1)最好判断一下输入是否为空。

    (2)如果字符串的第一个字符是‘-’号,最终得到的整数必为负整数。

    (3)输入的字符串中不能含有不是数字的字符。

    (4)输入的字符串不能太长,否则转换成整数后会导致整数溢出。

    package com.liuzhen.string_1;
    
    import java.util.Scanner;
    
    public class StringToInt {
        public static int Max_INT = Integer.MAX_VALUE;
        public static int Min_INT = Integer.MIN_VALUE;
        
        public int getStringToInt(String A){
            char[] arrayA = A.toCharArray();
            int n = 0;
            if(A.equals("") || A.equals(null))     //判断输入是否为空
                return 0;
            int i = 0;
            while(arrayA[i] == ' ')   //处理字符串首位的空格
                i++;
            int sign = 1;   //用于判定输入字符串数字的正负,初始化为1表示为正数
            if(arrayA[i] == '+' || arrayA[i] == '-'){
                if(arrayA[i] == '-')
                    sign = -1;
                i++;
            }
            while(i < arrayA.length && Character.isDigit(arrayA[i])){  //确定是数字0~9才执行循环
                int c = arrayA[i] - '0';
                //当输入字符串表示数为正数,且大于Max_INT
                if(sign > 0 && (n > Max_INT/10 || (n == Max_INT/10 && c > Max_INT%10))){
                    n = Max_INT;
                    break;
                }
                //当输入字符串表示数为负数,且小于Min_INT
                if(sign < 0 && (n + Min_INT/10 > 0 || (n + Min_INT/10 == 0 && c + Min_INT%10 > 0))){
                    n = Min_INT;
                    break;
                }
                //把之前得到的数字乘以10,再加上 当前字符表示的数字
                n = n*10 + c;
                i++;
            }
            
            return sign > 0 ? n : -n;
        }
        public static void main(String[] args){
            StringToInt test = new StringToInt();
            Scanner in = new Scanner(System.in);
            System.out.println("请输入一个由数字组成的字符串:");
            String A = in.nextLine();
            int result = test.getStringToInt(A);
            System.out.println("整数result = "+result);
        }
    }
    

    运行结果:

    请输入一个由数字组成的字符串:
      -1000
    整数result = -1000
    
    
    请输入一个由数字组成的字符串:
    +100000
    整数result = 100000
    
    
    请输入一个由数字组成的字符串:
    a1212
    整数result = 0
    
    
    请输入一个由数字组成的字符串:
    整数result = 2147483647
    
    
    请输入一个由数字组成的字符串:
    -10000000000
    整数result = -2147483648
    
    展开全文
  • 今天小编就大家分享一篇Java判断字符串是否是整数或者浮点数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 8.字符串转换整数 题目 请你来实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符正或者负号时,...

    8.字符串转换整数

    题目

    请你来实现一个 atoi 函数,使其能将字符串转换成整数。

    首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

    当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

    该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

    注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

    在任何情况下,若函数不能进行有效的转换时,请返回 0。

    说明:

    假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。

    示例 1:

    输入: "42"
    输出: 42
    

    示例 2:

    输入: "   -42"
    输出: -42
    解释: 第一个非空白字符为 '-', 它是一个负号。
         我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
    

    示例 3:

    输入: "4193 with words"
    输出: 4193
    解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
    

    示例 4:

    输入: "words and 987"
    输出: 0
    解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
         因此无法执行有效的转换。
    

    示例 5:

    输入: "-91283472332"
    输出: -2147483648
    解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
         因此返回 INT_MIN (−231) 。
    

    我的代码

    	public static int myAtoi(String str) {
        	int n = str.length();
        	//字符串的长度
        	int i = 0;
        	//用于索引字符串的指针
        	while(i < n && str.charAt(i) == ' ') {
        		i ++;
        	}
        	//跳过空格
        	if(i == n||!((str.charAt(i) >= '0' && str.charAt(i) <= '9' )|| str.charAt(i) == '+' || str.charAt(i) == '-'))
        		return 0;
        	//判断是不是已经到达了字符串的顶端,判断当前索引位置的元素是不是【0,9】,‘+’,‘-’。
        	StringBuilder s = new StringBuilder();
        	//构造一个StringBuilder 的字符串。(StringBuilder中有很方便的字符串操作方法)。
        	if(str.charAt(i) == '-') {
        		s.append('-');
        		i ++;
        		//判断当前索引位置的元素是不是‘-’,如果是直接将其append进新建的字符串中。
        	}else if (str.charAt(i) == '+') {
        		i ++;
        		//判断当前索引位置的元素是不是‘+’,如果是就进入下一个索引的位置(正数我们没有必要再在前边加一个‘+’)。
        	}
        	if(i == n||!(str.charAt(i) >= '0' && str.charAt(i) <= '9' ))
        		return 0;
        	//再判断一次,如果超过字符串长度,那么直接结束。如果不是【0,9】那么直接返回0.
        	while(i < n && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
        		s.append(str.charAt(i));
        		i ++;
        	}
        	System.out.println(s);
        	try {
        		return Integer.valueOf(s.toString());
        	}catch(Exception e){
        		if(s.substring(0,1).equals("-")) {
        			return Integer.MIN_VALUE;
        		}else {
        			return Integer.MAX_VALUE;
        		}
        	}
        	//try……catch……,判断异常,抛异常时直接进入。
        	//valueOf()返回保存指定的 String 的值的 Integer对象。(java的number方法)
        	//equals,对比字符,必须用""。不然,不然就会跟我一样,花好长时间。
        	//substring(beging,ending),获取字符串的【beging,ending)的
        }
    

    我的理解

    这个题就是需要考虑很多的条件,
    1.判断是不是空格开头,
    2.判断第一个非空是不是“+”或者“-”
    3.判断第一个是不是非数字
    4.判断得到的数是否大于INT_MAX,或者小于INT_MIN
    5.判断第一个非空不是正负号,不是数字时的处理。
    
    valueOf(String s):返回保存指定的 String 的值的 Integer 对象。(java的number方法)
    Integer.toString(): 返回表示 Integer 值的 String 对象。
    	string.toString();
    

    这个程序真的很有趣,它完全时一种全新的。我们一般都会想着在一个循环中解决问题,但是这个就是利用一个变量来把这个问题给解决了。详细注释在程序中!

    大佬的代码

    	public int myAtoi(String str) {
    		if (str.isEmpty())
    			return 0;
    		char[] mychar = str.toCharArray();
    		long ans = 0;
    		int index = 0, flag = 1, n = str.length();
    		//排除字符串开头的空格元素
    		while (index < n && mychar[index] == ' ') {
    			index++;
    		}
    		//排除空格后判断首字符是+还是-还是都不是
    		if (index < n && mychar[index] == '+') {
    			index++;
    		} else if (index < n && mychar[index] == '-') {
    			index++;
    			flag = -1;
    		}
    		//重点:只管是数字的时候,其余取0
    		while (index < n && (mychar[index] >= '0' && mychar[index] <= '9')) {
    			if (ans != (int) ans) {//超出int范围
    				return (flag == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;//提前结束
    			}
    			ans = ans * 10 + mychar[index++] - '0';
    		}
    
    		if (ans != (int) ans) {
    			return (flag == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;
    		}
    
    		return (int) (ans * flag);
    
    	}
    

    我对大佬代码的理解

    首先判断字符串是不是为空,如果是空,返回0。然后把字符串转化成字符数组。判断非空(拿到非空的位置)。再判断这个元素是不是“+”或者“-”,按找其对应的方法处理。然后判断后边的元素是不是在【0,9】,再判断结果有没有超出int范围,没超过则处理数据。最终再判断一次有没有超出【0,9】,再判断结果有没有超出int范围。最终输出得到的值。过程都比较复杂。

    通过这个算法,get到了这种循环处理方式。

    展开全文
  • Java字符串转换整数的方法:首先,输入数字字符串;然后,代码是[字符串s = & quot123456;int b = Integer . Parseint(s);】。本教程的操作环境:windows7系统,java10版本10,DELL G3电脑。此方法适用于...

    Java将字符串转换成整数的方法:首先,输入数字字符串;然后,代码是[字符串s = & quot123456;int b = Integer . Parseint(s);】。

    本教程的操作环境:windows7系统,java10版本10,DELL G3电脑。此方法适用于所有品牌的电脑。

    Java的字符串转换成整数的方法;

    输入的第一步

    "字符串s = & quot123456;int b = Integer . Parseint(s);system . out . println(b);"代码,将字符串a转换为整数b,如下图所示:

    第二步,运行程序后,可以看到字符串成功转换为整数123456,如下图所示:

    在第三步中,我们还可以按整数进行转换,如下图所示:

    第四步是运行程序,可以看到字符串成功转换为整数数据,如下图所示:

    第五步需要注意的是,使用上述两种方法将字符串转换为整数时,字符串需要是数字字符串,否则会报错,如下图所示:

    相关免费学习推荐:java基础教程

    这是java如何将字符串转换成整数的细节,等等

    展开全文
  • 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值0或者字符串不是一个合法的数值则返回0 。输入一个字符串,包括数字字母符号,可以空;如果是合法的数值表达则返回该数字,否则返回0;...
  • //将自字符串放进数组 for(i=0;i if(stringArr[i]||stringArr[i]>57) { throw new MathException(); //抛出异常 } } System.out.println(String.valueOf(t)); } public static void main(String args[]) { try { ...
  • 字符串转换整数Java实现)

    千次阅读 2017-05-19 12:26:56
    本题剑指offer面试题49 ... 时间限制:1秒空间限制:32768K ...将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符
  • 字符串转换整数pythonIn this tutorial you’ll see two ways to convert string to integer in python. 在本教程中,您将看到在python中将字符串转换整数的两种方法。 As we know we don’t have to declare ...
  • java中将字符串(String)转换为整型

    千次阅读 2021-02-12 19:45:20
    字符串(String)转换为整型我们在开发中常用到了因为java是一个非常严格编程语言了所以对数据类型要求也非常的严了,今天我们来看一些关于字符串(String)转换为整型例子吧。String转换为整型1.使用Intger.parseInt...
  • java 怎么把字符串转化成整型

    千次阅读 2021-03-04 03:58:26
    Java中有两个可选的方法用来将字符串转成整型。...当输入的字符串不是有效的整数,这两个方法都会抛出NumberFormatException异常。Integer.parseInt()和Integer.valueOf()最主要的不同的就是Intege...
  • 字符串转换整数pythonUnlike many other programming languages out there, Python does not implicitly typecast integers (or floats) to strings when you concatenate them to strings. 与现有的许多其他编程...
  • 字符串转换整数

    2021-03-22 17:53:33
    将一个字符串转换成一个整数,字符串不是一个合法的数值则返回 0,要求不能使用字符串转换整数的库函数。Iuput:+21474836471a33Output:21474836470这看起来是很简单的题目,实现基本功能 ,大部分人都能用10行之内的...
  • 字符串转换整数Java

    万次阅读 2018-05-27 09:24:26
    题目:字符串转换为整数。注意事项(思考点):(1)字符串中包含有非数字字符;(2)字符串中包含正负符号;(3)考虑最大的正整数;(4)考虑最小的负整数;(4)溢出。开始时我的想法只考虑了第一,第二种情况:/...
  • 将个数字字符串转换为整数字符串转换为整数或将整数转换为字符串是开发人员每天面临的常见任务。 Go Standard库随附了软件包,以使此任务更容易。 Go开发人员需要知道使用标准库以及何时寻找第三方库来解决任务。...
  • 字符串转换为整数:public static void main(String[] args) {String test = "445";int number = Integer.parseInt(test);System.out.println(number);}public static void main(String[] args) {String test = "445...
  • 字符串转成整数(Java)

    2021-03-05 17:00:35
    /*题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以空返回值描述:如果是合法的数值表达则...
  • 题目: 下面的代码考虑了null指针、空字符串、只有一个“+”、只有一个“-”、字符串中有非法字符、上溢、下溢、正确的整数、正确的负数、0等不同的输入的情况。    ...
  • 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值0或者字符串不是一个合法的数值则返回0。 输入描述 输入一个字符...
  • 这就是什么在转换为字节码时,function_2“”1真的被“1”取代.getOne()结果在编译时是未知的,因此连接将在运行时完成.但是因为concatenation()效率不高,编译器可能会将此更改基于StringBuilder.append()的实现....
  • 小编典典如果我想在Java中将字符串转换为int,您是否知道我是否可以检测到溢出?是。捕获解析异常将是正确的方法,但是这里的困难在于,对 任何 解析错误(包括溢出)都Integer.parseInt(Strings)抛出a。您可以通过...
  • 要求:实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。算法如下: 1. 读入字符串并丢弃无用的前导空格。 2.检查第一个字符(假设还未到字符末尾)正...
  • python整数转换字符串Given a string with digits and we have to convert the string to its ... 给定一个带有数字的字符串,我们必须将该字符串转换为Python中与之等效的整数列表。 Example: 例: Input: s...
  • //把字符串强制转换为数字int num=Integer.valueOf(str);//如果是数字,返回Truereturn true;} catch (Exception e) {//如果抛出异常,返回Falsereturn false;}2. 使用正则表达式判断String str = "abc123";boolean ...
  • java 字符串转化为整数溢出问题处理

    千次阅读 2015-05-03 16:54:16
    1、思路及注意事项 ...1)字符串开头是“+”号或“-”号的处理 2)非法字符的判断(不是数字) 3)整数溢出问题。  看看Java函数库中的Integer.parseInt(String sting)的源码如何处理这些问题的
  • 今天小编就大家分享一篇对Java字符串与整形、浮点类型之间的相互转换方法总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 字符串转换整数java版)

    千次阅读 2017-06-07 11:16:17
    【题目描述】将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值0或者字符串不是一个合法的数值则返回0【输入说明】输入一个字符串,包括数字字母符号,可以空【输出说明】如果是合法的数值...
  • Java把带小数点的字符串转换整数

    千次阅读 2020-05-27 10:05:54
    带小数点的字符串是不能直接转成整数的,应该先将它转成double类型再转int整数。 具体操作如下: String str = "80.0"; nt intValue = Double.valueOf(str).intValue();

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 183,260
精华内容 73,304
关键字:

java字符串转化为整数

java 订阅