通常我们使用Integer的parseInt解析数字型字符串,

它的内部是怎么解析的呢?

 String num="-2147483645";int numInt=parseInt(num,10);

那么Integer中的parseInt方法是如何做的呢?

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

字符串转化为整型 Integer.parseInt(String s,int radix)

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");}

首先判断radix 基数是否大于2  并且小于36

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

然后判断是否有+或者-号 判断正负
limit 都是负数 整数的最小数

multmin = limit / radix;

这个很关键  先移除一位

while (i < len) {
通过位数循环 遍历所有的字符

digit = Character.digit(s.charAt(i++),radix);

获取下一位的字符串的数字

if (digit < 0) {throw forInputString(s);}

如果小于0 那么就不是数字 那么抛出异常

if (result < multmin) {throw  forInputString(s);}

如果最终的结果result超过multmin绝对值,咱么就异常了

咱们上面说了 multmin是少一位的最大值 为什么呢
因为result目前来说就是少一轮循环的结果,因为第一次循环的时候 result为0 还没有赋值呢

result *= radix;

这个是把结果result 进了一位 乘以底数radix,比如十进制的话 就是乘以10

if (result < limit + digit) {throw forInputString(s);}

这个时候 再判断一下 如果result进位之后,result小于 最小的值加上下一位数字(因为都是负数 所以相当于当前的结果如果加上下一位数字 大于最大值的界限的时候 那么就抛出异常)

如果没有抛出异常 那么就将结果 result -= digit;

return negative ? result : -result;
最后就是将结果扶正!该是啥就是啥

String字符串转化为int类型相关推荐

  1. 将String字符串转化为int

    将String字符串转化为int类型需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换! 1. String str = "123456&qu ...

  2. java String类型转化为Int类型

    [将String 类型转化为int 类型] 一: public class IntegerDemo {public static void main(String[] args) {String st ...

  3. 【数据采集】将16进制字符串转化为Double类型输出(依照IEEE754标准)

    因为需要读取二进制文件中包含的数据,故需要这样一个转化过程. 鄙人功力太浅,主要参照http://www.cnblogs.com/xinjun/archive/2010/07/28/1787297.h ...

  4. c++将字符串转换成 int 类型

    #include<bits/stdc++.h> using namespace std;int main() {string str = "1233";int temp ...

  5. c/c++,char型数组转化为int类型

    char型数组转int类型 这几天遇到需要将int等类型转换并保存在char数组中,同时还需要将char数组转换为int等类型进行显示. 1.int等类型转换并保存在char数组中 int为4字节,c ...

  6. js中String转化为int类型

    方案一代码: Number(String) 方案二代码: parseInt(string, radix) string 必需.要被解析的字符串. radix 可选.表示要解析的数字的基数.该值介于 2 ...

  7. C语言atoi()函数(字符串转整数int类型)(atol()转换为long)

    需包含头文件:C 标准库 - <stdlib.h> 文章目录 描述 声明 参数 返回值 实例 在windows VS上测试 20211206 用atoi转换long,发现溢出了 描述 C ...

  8. sscanf,sscanf_s及其相关用法(字符串格式化为其他类型)

    #include<stdio.h> 定义函数 int sscanf (const char *str,const char * format,........); 函数说明   sscan ...

  9. 16进制转double dotnet_IEEE 16进制字符串转化为double类型

    因项目需要,需要将内存中的64位16进制字符串表示成double.如下: #include #include #include #include #include using namespace st ...

最新文章

  1. ubuntu 14.04 LTS 右键菜单解压压缩包时出错
  2. 配置单臂路由、三层交换技术以及动态路由
  3. mysql select内部原理_数据库SQL SELECT查询的工作原理
  4. IDEA工作笔记-自动生成POJO或JPA的实体类
  5. WordPress解决上传文件大小限制问题
  6. Python菜鸟入门:day06元组与字典
  7. [Servlet] 初识Servlet
  8. 用Python显示灰度图像的灰度直方图
  9. seqkit根据基因id_AgriSeq 靶向测序法基因分型技术
  10. PRINCE2认证之项目四大管理步骤
  11. 手持式频谱分析仪TFN RMT720A 频谱分析 基站分析 路测覆盖
  12. 毕业设计3-BME280温湿度大气压传感器调试记录(STM32F103C8T6 + STM32CubeMX + BME280)
  13. IOS通过加速感应器实现手机实现手机屏幕上的足球可以来回的滚动反弹
  14. 美食app的UI设计
  15. 超市进销存之openGauss数据库的应用与实践
  16. macbook远程控制CentOS服务器
  17. 搜狗输入法 + qq
  18. 学习前端的第三十二天——ES6
  19. 2021年scrapy一分钟内爬取笔趣阁整本小说存为txt|解决章节排序问题
  20. Atcoder Beginner Contest 260D - Draw Your Cards 解题报告

热门文章

  1. JSP-简单的练习省略显示长字符串
  2. 零基础零经验自学Python,到精通Python要多久啊?
  3. 答题卡识别任务--opencv python(附代码)
  4. 安全生产管理云执法平台方案
  5. weblogic打补丁详细步骤(linux)
  6. Webpack是什么?(webpack初学简单易理解)
  7. 视频网站的工作原理-->m3u8视频文件的提取与解析(理论)
  8. 汇编语言---指令格式和基本语法
  9. 设计模式之 State(状态模式)通俗理解
  10. AD16原理图导出PCB报错Footprint not found