java parseint(12.0),如何实现一个parseInt

如何实现一个parseInt

function(string, [radix]) {}

如果string不为字符串类型, 则先将string转化为字符串类型

string会忽略前后的空白

依次解析字符, 如果字符不是指定基数中的字符( 例如:2进制中的3、 10进制中的'f' )则停止解析( 首字符为'+'或'-'时除外 ), 返回已经解析好的整数

如果无法解析为整数, 则返回NaN

radix 默认值不为10, 在radix为undefined、0或者没有指定时, 做以下处理

如果string以'0X'或'0x'开头时, 基数为16

如果string以'0'开头时, 基数为8或者10(每个浏览器的具体实现不同, es5规定此时为10)

如果string以其他任何字符开头时, 基数为10

radix的范围为2-36

不考虑进制radix

代码实现

const _parseInt = (str, radix) => {

if (typeof str !== 'string') str = String(str)

str = str.trim()

const regex = /^(?[+|-]*)(?d+)/

if (!regex.test(str)) return NaN

const groups = str.match(regex).groups

radix = 10

const arr = groups.num.split('')

const len = arr.length

let result = 0

for(let i = 0; i < len; i++) {

const num = arr[i] * Math.pow(10, len - i - 1)

if (isNaN(num)) break

else result += num

}

return result * (groups.fuhao === '-' ? -1 : 1)

}

测试用例

const assert = require('assert')

assert.strictEqual(_parseInt(null), NaN)

assert.strictEqual(_parseInt('0e0'), 0)

assert.strictEqual(_parseInt('08'), 8)

assert.strictEqual(_parseInt(0.0000003), 3)

assert.strictEqual(_parseInt(0.00003), 0)

assert.strictEqual(_parseInt(-0.0000003), -3)

assert.strictEqual(_parseInt('6.022e23'), 6)

assert.strictEqual(_parseInt(6.022e2), 602)

考虑radix

代码实现

const _parseInt = (str, radix) => {

// 不为string类型先转化为string 类型

if (typeof str !== 'string') str = String(str)

// 删除首尾空白

str = str.trim()

// 正则匹配[+|-]?[0]?[Xx]?[0-9a-fA-F]+

const regex = /^(?[+|-]*)(?[0]?[Xx]?)(?[0-9a-fA-F]+)/

// 无法匹配返回NaN

if (!regex.test(str)) return NaN

// 匹配出符号、进制、数字三个分组

const groups = str.match(regex).groups

// radix的有效范围为 2-36

if (radix && (radix < 2 || radix > 36)) return NaN

// 如果没有指定radix, radix 会有以下默认值

if (!radix) {

if (groups.radix.toUpperCase() === '0X') radix = 16

else if (groups.radix === '0') radix = 8

else radix = 10

}

// 挨个字符串解析,如果遇到无法解析时则停止解析,返回已经解析好的整数

let splitArr = groups.num.split('')

const arr = []

for(let i = 0; i < splitArr.length; i++) {

// 根据charCode来做转行为实际数据, 0-9为[48-57],A-F为[65-70]

const charCode = splitArr[i].toUpperCase().charCodeAt()

let num

// 字符为[A-F]时, 实际数字为charCode -55

if(charCode >= 65) num = charCode - 55

// 字符为[0-9]时, 实际数字为charCode - 48

else num = charCode - 48

// 当实际数字大于radix时, 无法解析则停止字符串遍历

if (num > radix) {

break

} else {

arr.push(num)

}

}

const len = arr.length

// 当实际数字数组长度为0时, 返回NaN

if(!len) return NaN

let result = 0

// 依次解析实际数字数组, 组合成真正的数字

for(let i = 0; i < len; i++) {

const num = arr[i] * Math.pow(radix, len - i - 1)

result += num

}

// 算法匹配到的正负号

return result * (groups.fuhao === '-' ? -1 : 1)

}

测试用例

const assert = require('assert')

// 以下返回15

assert.strictEqual(_parseInt('0xF', 16), 15)

assert.strictEqual(_parseInt('F', 16), 15)

assert.strictEqual(_parseInt('17', 8), 15)

assert.strictEqual(_parseInt(021, 8), 15)

assert.strictEqual(_parseInt('015', 10), 15)

assert.strictEqual(_parseInt(15.99, 10), 15)

assert.strictEqual(_parseInt('15,123', 10), 15)

assert.strictEqual(_parseInt('FXX123', 16), 15)

assert.strictEqual(_parseInt('1111', 2), 15)

assert.strictEqual(_parseInt('15 * 3', 10), 15)

assert.strictEqual(_parseInt('15e2', 10), 15)

assert.strictEqual(_parseInt('15px', 10), 15)

assert.strictEqual(_parseInt('12', 13), 15)

// 以下返回NaN

assert.strictEqual(_parseInt('Hello', 8), NaN)

assert.strictEqual(_parseInt('546', 2), NaN)

// 以下返回-15

assert.strictEqual(_parseInt('-F', 16), -15)

assert.strictEqual(_parseInt('-0F', 16), -15)

assert.strictEqual(_parseInt('-0XF', 16), -15)

assert.strictEqual(_parseInt(-15.1, 10), -15)

assert.strictEqual(_parseInt(' -17', 8), -15)

assert.strictEqual(_parseInt(' -15', 10), -15)

assert.strictEqual(_parseInt('-1111', 2), -15)

assert.strictEqual(_parseInt('-15e1', 10), -15)

assert.strictEqual(_parseInt('-12', 13), -15)

// 以下返回4

assert.strictEqual(_parseInt(4.7, 10), 4)

assert.strictEqual(_parseInt(4.7 * 1e22, 10), 4)

assert.strictEqual(_parseInt(0.00000000000434, 10), 4)

// 以下返回224

assert.strictEqual(_parseInt('0e0', 16), 224)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 类 继承,继承MATLAB中的密封类

在MATLAB中,一个类的attributes之一(在classdef之后定义)是Sealed,这意味着没有类可以将它用作超类(或者更确切地说,“表示这些类没有被设计为支持子类. “1).例如,如果我尝试实例化一个定义如下的类(考虑表是密封的)&#xff1a;classdef SomeLie < tableend我会得到’MATL…

smarty 引用php类,smarty 的PHP引用

摘要&#xff1a;<?phpsession_start ();//改时区date_default_timezone_set("PRC");//引入模板引擎require smarty.init.php;//对象class test{public $site"php中文网";public function welcome(){return &session_start();//改时区date_default…

平行志愿遵循分数优先php,2020平行志愿的录取规则是什么有哪些优势

摘要&#xff1a; 2020平行志愿的录取规则是什么有哪些优势为你介绍平行志愿的投档原则仍为“分数优先&#xff0c;遵循志愿”&#xff0c;而传统的顺序志愿则是根据“志愿优先&#xff0c;按分排序”。 2020平行志愿录取规则 平行志愿的投档原则仍为“分数优先&#xff0c;遵循…

qq收不到oracle邮件,腾讯企业邮箱发送邮件失败

一直使用的腾讯企业邮箱&#xff0c;但是最近发现发送邮件全是失败的&#xff0c;提示&#xff1a;javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 25;nested exception is:java.net.ConnectException: 连接超时 (Connection time…

Oracle quartile函数,Oracle分析函数六——数据分布函数及报表函数

Oracle 分析函数——数据分布函数及报表 函数CUME_DIST功能描述&#xff1a;计算一行在组中的相对位置&#xff0c; CUME_DIST 总是返回大于 0 、小于或等于 1 的数&#xff0c;该数表示该行在 N 行中的位置。例如&#xff0c;在一个 3 行的组中&#xff0c;返回的累计分布值为…

oracle ora 03137,今天遇到奇怪的ORA-03137错误(包含trc文件)

今天下午同事突然反映&#xff0c;打开一个用户数据的时候报错&#xff1a;ora-03114:未连接数据库很奇怪的错误信息&#xff0c;查看alert log文件系统在报错&#xff1a;2010/6/24 13:46:46 Thu Jun 24 13:46:46 2010Errors in file /u01/oracle/diag/rdbms/orcl/orcl/t…

redhat配置oracle yum源,Redhat5和6 YUM源配置的区别

一、概述随着各个软件版本的不断升级&#xff0c;我们需要掌握的软件特性也越来越多&#xff0c;技术的不断更新也促进了我们脑细胞的循环。 今天在配置RedHat6.3的yum源时也出现了一个有趣的事情&#xff0c;下面请听俺道来。二、问题处理问题源于哥们处&#xff0c;自己就搭建…

脚本自启动oracle,自动启动和关闭Oracle 脚本

配置完ASM实例后&#xff0c;每次启动oracle数据库服务器的时候要先启动ASM实例&#xff0c;然后启动数据库实例&#xff1b;关闭的时候&#xff0c;需要先关闭oracle数据库实例&#xff0c;然后关闭ASM实例&#xff1b;敲起命来来麻烦的很&#xff0c;因而改进了原来的shell脚…

php中fread()函数,php fread()函数

定义fread()函数用于读取文件。语法PHP fread()函数具有以下语法。fread(file,length)参数参数是否必须描述file需要。要读取的打开文件length需要。要读取的最大字节数返回值此函数返回读取的字符串&#xff0c;或失败时为FALSE。实例1/*http://www.manongjc.com/article/1800…

linux启动tongweb命令,linux7开机自启动东方通tongweb

自启动服务&#xff1a;可以通过把TongWeb设置为系统服务来实现。具体实现&#xff1a;以root用户进行操作&#xff0c;在/etc/init.d目录下编写TongWeb的服务脚本tongweb&#xff0c;用来控制TongWeb的启动和停止。脚本内容如下&#xff1a;#!/bin/bash## tongweb This shell …

linux默认的https端口,如何在Ubuntu 18.04 Bionic Beaver Linux上拒绝除HTTP端口80和HTTPS端口443之外的所有传入端口...

目的目的是启用UFW防火墙&#xff0c;拒绝所有传入端口&#xff0c;但是在Ubuntu 18.04 Bionic Beaver Linux上仅允许HTTP端口80和HTTPS端口443。操作系统和软件版本操作系统&#xff1a;-Ubuntu 18.04仿生海狸要求需要特权才能访问您的Ubuntu 18.04 Bionic Beaver。约定&#…

go 跨平台编译linux,golang 跨平台编译

只需要指定目标操作系统的平台和处理器架构即可&#xff1a;命令行方式因为不支持CGO&#xff0c;所以要禁用CGOSET CGO_ENABLED0 // 禁用CGOSET GOOSlinux // 目标平台是linuxSET GOARCHamd64 // 目标处理器架构是amd64然后再执行go build命令&#xff0c;得到的就是能够在Lin…

linux7 修改服务启动项目命令,centos7服务部署flask项目

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;centos7语言配置问题登录服务器&#xff0c;注意观察是否出现以下警告提示warning: setlocale: LC_CTYPE: cannot change locale (en_US.utf8): No such file or d…

虚拟机linux中怎样打开qt,虚拟机中在Centos 4.7中安装qt-x11-opensource-4.4.3

本人最近学习qt&#xff0c;把qt安装在了虚拟机下&#xff0c;用的是免费的Linux&#xff0c;qt是Linux下开发c不错的软件&#xff0c;经过了2天的奋战&#xff0c;终于把qt安装在了自己的机器上面&#xff0c;现在把安装步骤告诉大家&#xff0c;希望对你们安装错误的同志们有…

linux top p 乱码,将Linux top命令输入到指定文件时的乱码问题

根据需求&#xff0c;项目需要读取linux系统环境参数&#xff0c;所以需要将top命令的输出结果输入到文件中。用重定向命令如下&#xff1a;topresult.txt。用vi打开文件&#xff1a;viresult.txt。显示的根据需求&#xff0c;项目需要读取linux系统环境参数&#xff0c;所以需…

linux龙芯自动挂载u盘,Windows Subsystem for Linux (WSL)挂载移动硬盘U盘

WSL想通过移动硬盘处理一些数据&#xff0c;结果进去了无法发现移动硬盘&#xff0c;于是搜了好久也没有一个正确的解决办法&#xff0c;终于找到一个&#xff0c;现在贡献出来与大家共享。WSL比起linux挂载硬盘简单一些。而且windows本身自己的硬盘位ntfs格式&#xff0c;所以…

win10子linux如何重置密码,Win10如何使用Windows PowerShell命令重置本地账户密码

在win10系统中&#xff0c;都自带有本地账户&#xff0c;为了安全也会给本地商户设置密码&#xff0c;不过使用一段时间之后&#xff0c;想要重置本地账户密码&#xff0c;但是很多用户并不知道要如何操作&#xff0c;其实我们可以使用Windows PowerShell命令方式来实现&#x…

linux wine 性能,Wine 1.9.16 发布,改善 GDI 性能

Wine 1.9.16 最近发布下载&#xff0c;配备了大量的新功能&#xff0c;改进和错误修正。显着的更新包括在MacOS下能更好与64位二进制兼容性&#xff0c;提升JavaScript性能&#xff0c;对Direct3D的改进&#xff0c;在Direct3D更多的着色器指令&#xff0c;提升GDI性能&#xf…

linux上的定时器上的jiffies,Linux kernel -- 定时器/jiffies

0. 测试环境Linux 2.6.39 AT91SAM9G451. 定时器简单的测试例子#include #include MODULE_LICENSE("GPL");struct timer_list tm;static int num;static void func(){num;mod_timer(&tm, jiffies HZ);printk("Hello, timer :%d\n", num);}static int t…

二级考试c语言中 星号与字母 题型总结,2017年计算机二级考试C语言知识点归纳...

2017年计算机二级考试C语言知识点归纳计算机二级考试是全国计算机等级考试(National Computer Rank Examination&#xff0c;简称NCRE)四个等级中的一个等级&#xff0c;考核计算机基础知识和使用一种高级计算机语言编写程序以及上机调试的基本技能。下面是2017年计算机二级考试…