索鸟网

  1. 首页
  2. JavaScript实现parseInt()

JavaScript实现parseInt()


当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

只有字符串中的第一个数字会被返回。

开头和结尾的空格是允许的。

function _parseInt (string, radix) {
    if (typeof string !== "string" && typeof string !== "number") return NaN;
    if (radix && (typeof radix !== "number" || /^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$/.test(radix) || radix > 36 || radix < 2)) return NaN;
    string = String(string)
    var rexp = (radix == 10) ? /(-?)([0]?)([0-9]+)/ : /(-?)([0]?[Xx]?)([0-9a-fA-F]+)/,
        a = string.match(rexp),
        sign = a[1],
        rawRadix = a[2],
        rawNum = a[3],
        result = 0,
        strArr = rawNum.split(''),
        len = strArr.length,
        numArr = [];
    if (a && !radix) {
        if ( rawRadix.toUpperCase() === "0X") {
            radix = 16;
        } else if (rawRadix === "0") {
            radix = 8;
        } else {
            radix = 10;
        }
    }
    for (var i = 0; i < len; i++){
        var num;
        var charCode = strArr[i].toUpperCase().charCodeAt(0);
        if(radix <=36 && radix >= 11) {
            if (charCode >= 65 && charCode <= 90) {
                num = charCode - 55;
            } else {
                num = charCode - 48;
            }
        }  else {
            num = charCode - 48;
        }
        if (num < radix) {
            numArr.push(num);
        } else {
            return NaN
        };
    }
    if(numArr.length > 0) {
      numArr.forEach(function(item, j){
          result += item * Math.pow(radix, numArr.length-j-1);
      })
    }
    if(sign === "-"){
      result = -result;
    }
    return result
}

来自MDN关于parseInt()里面的测试用例

// 以下例子均返回15:
console.log(_parseInt("F", 16));
console.log(_parseInt("17", 8));
console.log(_parseInt("15", 10));
console.log(_parseInt(15.99, 10));
console.log(_parseInt("FXX123", 16));
console.log(_parseInt("1111", 2));
console.log(_parseInt("15*3", 10));
console.log(_parseInt("12", 13));

// 以下例子均返回 NaN:
console.log(_parseInt("Hello", 8)); // Not a number at all
console.log(_parseInt("546", 2));   // Digits are not valid for binary representations

// 以下例子均返回 -15:
console.log(_parseInt("-F", 16));
console.log(_parseInt("-0F", 16));
console.log(_parseInt("-0XF", 16));
console.log(_parseInt(-15.1, 10));
console.log(_parseInt(" -17", 8));
console.log(_parseInt(" -15", 10));
console.log(_parseInt("-1111", 2));
console.log(_parseInt("-15e1", 10));
console.log(_parseInt("-12", 13));
// 下例中也全部返回 17,因为输入的 string 参数以 "0x" 开头时作为十六进制数字解释,而第二个参数假如经过 Number 函数转换后为 0 或 NaN,则将会忽略。
console.log(_parseInt("0x11", 16));
console.log(_parseInt("0x11", 0));
console.log(_parseInt("0x11"));

// 下面的例子返回 224
console.log(_parseInt("0e0",16));
parseint javascript

来源地址:https://segmentfault.com/a/1190000010571914 版权归作者所有!

相关教程

  • 你不知道的parseInt

    前言 原由:偶然看到一个略微奇妙的代码['1', '2', '3']map.(parseInt)初看之时,瞬间得出答案[1, 2, 3](虽然心底有些许疑问的声音~)因此追溯根源,没想到答案让我惊呼WTF?(这里黑人问号,手动滑稽)查询了MDN、Standard ECMA-262等文档,因此得出下文结论,由于英语渣渣,所以有不恰当的地方希望各位帮忙斧正~
  • js的parseInt() map(),reduce()方法详解

    parseInt(string,radius)接收两个参数, string(必选)如果接受的是‘abc’,纯字符串,返回NaN,要是‘123’会转化为123,要是‘abc123’会转化为123,radius(可选)表示的是基数,指定前面的string是一个几进制的数(不是将string转化为多少进制,而是这个string本身是一个多少进制的数),stri
  • JavaScript实现选项卡

    本文代码实现《JavaScript进阶篇》最后一章的编程挑战“选项卡切换”内容。 这节内容对于初学者来说算是比较有挑战性的了,我摸索了四个小时了,自我觉得有些印象了,基本上能自己独立实现代码内容。深有感触的是,对于这种复杂的效果要想掌握地好,先临摹,后自己写,不会再看,看了再写,反反复复,直到熟悉掌握为止,而且隔一两天就要重新再独立写出来,以加深印象。
  • 错误提示:The method parseInt(String) is undefined for the type Loginsample

    错误提示:The method parseInt(String) is undefined for the type Loginsample 之前运行的时候,没有问题,之间没有改变,却报错。 解决办法: 之前是使用Integer.parseInt函数将String类型转为int,现在改成下面这种形式。 Integer rowid = new
  • JavaScript 实现线程锁

    JavaScript 实现线程锁 ECMAScript 2018 中增加了 SharedArrayBuffer 和 Atomics ,利用它们可以实现锁(Lock),即页面主线程和 Web Worker 线程间的锁。 SharedArrayBuffer SharedArrayBuffer(以下简称为SAB) 是一个可以主线程和 Web Worker 线程
  • JavaScript实现单项链表

    function LinkList() { function LinkNode(data) { this.data = data; this.next = null; } this.length = 0; this.head = new LinkNode(); function i
  • JavaScript实现分页效果

    初学前端不久,第一次写文章,希望大佬多多指教,谢谢!!目的:实现一个分页点击事件的js组件特效,效果如下:录gif的软出了点问题,感觉鼠标不移动 代码实现: html代码: 加上css后效果: 因为每次选中的页面在中间,则吧中间设置一个点击的class JS实现: function Paging(list_num,ali,btn){ thi
  • JavaScript数据结构 实现链表

    链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个元素有一个存储元素本身的节点和一个指向下一个元素的引用(指针)组成。 链表的好处在于,添加或删除元素的时候不需要移动其他元素。链表的另一个细节是可以直接访问任何位置的任何元素,而想要访问链表中间的一个元素,需要从起点(表头)开始迭代链表,直到找到所需的元素。  LinkedList类有以下方