return怎么返回字符串_【前端冷知识】如何正确判断一个字符串是数值?

在网页中,我们从用户输入的内容中获取的值通常是字符串,但是有时候我们希望用户输入的内容一定要能转成数值:

<input id="userInput">

userInput.addEventListener('change', (e) => {

  const value = e.target.value;

  console.log(typeof value); // string

  console.assert(isNumeric(value), `Not a numeric value: ${value}`);

});

即我们要实现一个isNumeric方法,判断用户输入的值是能转为数值的字符串。

我们讨论isNumeric实现前,先说一下限制用户输入的方式。

?? 如果我们设置input的type为number,并不能保证输入的内容一定是数值,因为如果input的type是number,它依然可以输入多个“+“、”-”、“.”、“e”

<input type="number" step="0.0000001" id="userInput">

b64d7b7ea042aad4efacd5c80b7b9aa3.pnginput[type=number]并不阻止输入多个e

这是因为“+/-”(正负符号),“.”(小数点)和“e”(科学记数法)都是Number允许输入的字符。

不过如果在form提交的时候,浏览器会对input[type=number]内容再做一次检查:

<form id="myForm">

  <input type="number">

  <input type="submit">

form>

1dd450b1001dcf56e2ff06eb1fa6ba8c.png

但是,不管怎样,用户还是可以通过修改页面上的元素,绕过这些检查,所以我们还是要用到isNumeric来判断用户输入的合法性。

我们先看一下isNumeric应该返回什么。

如果参考input[type=number]的规则,那么它应该支持所有合法的有穷数值写法:

function isNumeric(str) {

  ...

}

console.assert(isNumeric('1000'));

console.assert(isNumeric('-100.'));

console.assert(isNumeric('.1'));

console.assert(isNumeric('-3.2'));

console.assert(isNumeric('001'));

console.assert(isNumeric('+4.5'));

console.assert(isNumeric('1e3'));

console.assert(isNumeric('1e-3'));

console.assert(isNumeric('-100e-3'));

console.assert(!isNumeric('++3'));

console.assert(!isNumeric('-100..'));

console.assert(!isNumeric('3abc'));

console.assert(!isNumeric('abc'));

console.assert(!isNumeric('-3e3.2'));

console.assert(!isNumeric('Infinity'));

console.assert(!isNumeric('-Infinity'));

console.assert(!isNumeric(''));

那么具体要怎么实现呢?

parseFloat?

有同学想到用parseFloat,这个行不行呢?

function isNumeric(str) {

  return !Number.isNaN(parseFloat(str));

}

这个显然是不行的,因为parseFloat('123abc')结果是123,因为parseFloat会尝试转部分数值,而忽略掉不能转数值的部分。

所以:

console.assert(!isNumeric('-100..'));

console.assert(!isNumeric('3abc'));

console.assert(!isNumeric('-3e3.2'));

这三个case是过不去的,另外这里用了Number.isNaN处理parseFloat之后的结果,由于±Infinity是数值,Number.isNaN会返回false,所以:

console.assert(!isNumeric('Infinity'));

console.assert(!isNumeric('-Infinity'));

也pass不了。

isNaN

有同学说,那我们直接使用isNaN如何?

function isNumeric(str) {

  return !isNaN(str);

}

这次结果好得多,但是最后三条规则过不了:

console.assert(!isNumeric('Infinity'));

console.assert(!isNumeric('-Infinity'));

console.assert(!isNumeric(''));

±Infinity和上面的原因一样,但是为什么''也pass不了呢?这是因为isNaN会先尝试将参数转为Number,而空字符串被转为了数值0。

console.log(Number('')); // 0

这里面就不得不提一下ECMA-262规范里面[[ToNumber]]的转换规则了:

e208b19d68340aaed5167e358b00ba07.png

根据规则,Null、Boolean都会转成Number,Undefined被转成NaN,Undefined会被转成NaN,而Symbol直接抛TypeError...

加上空字符串''被转成0,isNaN就会有些怪异的行为了:

console.log(isNaN(undefined)); // true

console.log(isNaN(null)); // false

console.log(isNaN(true)); // false

console.log(isNaN(false)); // false

console.log(isNaN('')); // false

其实字符串除了''还有一些:

console.log(isNaN(' ')); // false

console.log(isNaN(' ')); // false

console.log(isNaN('\t')); // false

console.log(isNaN('\r')); // false

console.log(isNaN('\n')); // false

这就是为什么ES2015之后,又增加了Number.isNaN方法。

?? 冷知识:isNaN方法对参数做[[ToNumber]]转换,会导致一些比较怪异的结果,所以ES2015增加了Number.isNaN,该方法不会对参数做类型转换,只要参数不是NaN,不管是什么类型,Number.isNaN一律返回false。

console.log(isNaN('abc')); // true

console.log(Number.isNaN('abc')); // false

console.log(isNaN('')); // false

console.log(Number.isNaN('')); // false

isFinite

我们把isNaN换成isFinite看看:

function isNumeric(str) {

  return isFinite(str);

}

这下'±Infinity'的问题解决了,因为Number中的±Infinite和NaN的isFinite结果都返回false。

不过与isNaN一样,isFinite也一样会对参数进行类型转换,所以,这几个case问题还是存在:

console.assert(!isNumeric(''));

console.assert(!isNumeric(' '));

console.assert(!isNumeric(' '));

console.assert(!isNumeric('\t'));

console.assert(!isNumeric('\r'));

console.assert(!isNumeric('\n'));

?? 冷知识:isFinite与isNaN一样,会对参数做[[ToNumber]]转换,因此对应的,ES2015也提供了一个Number.isFinite,这是不转换参数类型的版本。如果参数不是Number类型,Number.isFinite一律返回false。

console.log(isFinite('123')); // true

console.log(Number.isFinite('123')); // false

console.log(isFinite('')); // true

console.log(Number.isFinite('')); // false

好了,那么讨论到这里,最后的解决方法已经呼之欲出了。

因为对于isNumeric用法,我们只需要处理字符串,非字符串的case我们可以不管;那么我们剩下的就是处理这一堆字符串case:

console.assert(!isNumeric(''));

console.assert(!isNumeric(' '));

console.assert(!isNumeric(' '));

console.assert(!isNumeric('\t'));

console.assert(!isNumeric('\r'));

console.assert(!isNumeric('\n'));

这个有很多方式可以处理了,比如它们都匹配正则/^\s*$/,所以:

function isNumeric(str) {

  return !/^\s*$/.test(str) && isFinite(str);

}

这个版本就可以通过所有的case了。

另外,这些字符串的parseFloat都是NaN,所以,也可以这样:

function isNumeric(obj) {

  return !isNaN(parseFloat(obj)) && isFinite(obj);

}

实际上这个比上面那个正则的版本更好,因为这个还同时处理了非字符串的case,因为:

parseFloat(null);

parseFloat(true);

parseFloat(false);

上面这些的结果都是NaN。

实际上,上面这个版本就是著名的jQuery框架中的jQuery.isNumeric的实现方式。

因为现在不建议用isNaN和isFinite,而推荐使用Number.isNaN和Number.isFinite替代,所以一些linter的规则可能会禁止使用这两个函数,但是没有关系,因为我们可以这么写:

function isNumeric(obj) {

  return !Number.isNaN(parseFloat(obj))

    && Number.isFinite(Number(obj));

}

所以,这个就是最终的版本。

原来,实现一个小小的函数isNumeric,有那么多需要注意的地方。

关于判断字符串是数值,你还有什么想法,欢迎在issue中讨论。

weixin_39796116
关注 关注
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript常用字符串方法-面试题
JackieDYH的博客
05-03 865
一、charAt() 返回在指定位置的字符。 var str="abc"console.log(str.charAt(0))//a 二、charCodeAt() 返回在指定的位置的字符Unicode 编码。 var str="abc" console.log(str.charCodeAt(1))//98 三、concat() 连接字符串。 var a = "abc"; var b = "def"; var c = a.concat(b); console.log(c);/
前端js】算法全归纳(三)字符串:最常用的20个正则表达式(附实例详解)
敲敲的博客
03-25 1848
文章目录一、表单验证用:1.颜色2.用户名3.时间4.日期5.验证密码问题6.不匹配任何东西二、获取匹配/子表达式:1.url2. id3.html标签三、修改原字符串:1.数字千分位2.字符串 trim 去除空格模拟3.将每个单词的首字母换为大写4.连字符驼峰化5.驼峰化成连字符 一、表单验证用: (结合test方法) 1.颜色 /rgb\((\d+)\s*,\s*(\d+)\s*,\s*...
C语言常见问题--return返回字符串
小豹Miss鲍的博客
03-24 5967
C语言常见问题–return返回字符串 问题来源: 想 C语言函数 返回字符串)数据。 一、问题来源 demo: #include <stdio.h> #include <string.h> #include <stdlib.h> char * test() { char str[10] = {0}; strcpy(str, "abc"...
c++统计字符串中某个字符出现的次数_Excel统计一个单元格内的某字符串的出现次数...
weixin_39517199的博客
12-05 373
在单元格A1输入,例如:在单元格B1输入想要在A1中查找和统计的字符串,例如:we我们在单元格C1输入公式:=(LEN(A1)-LEN(SUBSTITUTE(A1,B1,"")))/LEN(B1)按下回车键Enter,得到计算结果为2如果要求忽略大小写,我们改写单元格C1公式:=(LEN(A1)-LEN(SUBSTITUTE(LOWER(A1),LOWER(B1),"")))/LEN(B1)如果统...
return怎么返回字符串_数据结构的实践心得(字符串管理:mystring)
weixin_39813009的博客
12-04 1252
头文件(mystring.h):#pragma once#include "seqList.h"#define StringERROR -99999999#define StringNumberLENGTH 20// 取得字符串长度int mystrlen(char *s);// 进行内存初始化char* mymemset(char *p, char val, size_t size);...
return 返回字符串
weixin_30693183的博客
10-27 856
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApplication3 7 { 8 /*******************************************...
Excel判断字符是否包含在特定字符串
辉的博客
02-26 9万+
Excel中可以利用find(search)函数、substitute函数或者countif函数,或者mid函数结合数组公式等来判断某单元格里是否包含某个字符。 工具:Office2013 方法如下: 判断A列单元格里是否包含“木”: 方法一:利用find函数判断 公式如下图所示,结果为数字,则说明包含;结果为#value,则不包含: - 方法二:利用substitute函数判断 公式如下图所示...
js 字符串加减法_基于字符串数值之加减乘除JS算法研究
weixin_35483528的博客
01-17 2806
在我们的日常js项目中,我们不免会碰到需要进行前端计算的场景。而大家都知道,计算机进行计算时存在精度问题,且数值域,偶尔会碰到溢出问题。在最近的一个项目中,由于遇到了一个超过20位的数,因此,又不得不再来对js中数值的运算进行研究。在js中,一旦遇到非常大的数,例如一个超过Number.MAX_SAFE_VALUE的,在运算时就会出现问题,而且在展示时(toString)会出现把大数指数化后...
用JavaScript计算在UTF-8下存储字符串占用字节数
10-27
然而,String对象的length属性仅返回字符串字符数,并不能直接反映出字符串在UTF-8编码下的字节长度。这就需要我们通过编写特定的JavaScript函数来计算实际占用的字节数。 在UTF-8编码中,一个字符占用的字节数是...
python 数值字符串实现四舍五入 decimal_Python将科学计数法数值换为指定精度浮点数...
weixin_39630744的博客
12-15 1519
Python将科学计数法数值换为指定精度浮点数 In [20]:money = 1190000.0 In [21]: traded_maket_value = 13824000000 In [22]: money / traded_maket_value Out[22]: 8.608217592592592e-05 In [23]: '{:.10f}'.format( money / trade...
C语言实现返回字符串函数的四种方法
12-25
前言 C语言返回字符串函数共有四种方式,分别如下:       使用堆空间,返回申请的堆地址,注意释放       函数参数传递指针,返回该指针       返回函数内定义的静态变量(共享)       返回全局变量 下面来看看详细的介绍 其实就是要返回一个有效的指针,尾部变量退出后就无效了。 使用分配的内存,地址是有效 char *fun() { char* s = (char*)calloc(100, sizeof(char*) ); if (s) strcpy ( s , "abc " ); return s; } 但这种方式需要注意,必须由使
return怎么返回字符串_LintCode 题解丨微软面试题:字符串查找
weixin_39592137的博客
12-05 177
对于一个给定的 source 字符串一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1。 在线评测地址:LintCode 领扣​www.lintcode.com说明在面试中我是否需要实现KMP算法?不需要,当这种问题出现在面试中时,面试官很可能只是想要测试一下你的基础应用能力。当然你需要先跟面试官确认清楚要...
Excel表格判断是否包含某个字符串
皇位无忧的工作室
08-21 3934
FIND + ISNUMBER 举例 在单元格B1输入公式 = IF(ISNUMBER(FIND(“A”,A1)),“有”,“无”) 在单元格B2输入公式 = IF(ISNUMBER(FIND(“A”,A2)),“有”,“无”) A B C 1 ABCD 有 2 aBCD 无
C语言return返回问题(字符串
Shuimanjing的博客
07-28 3196
C语言return字符串
Excel如何判断某单元格或者字符串是否包含某些字符
热门推荐
weixin_50853979的博客
04-10 13万+
1.判断字符串是否含有某字符,区分大小写 比如判断字符串是否包含大写字母A,可用公式=IF(ISNUMBER(FIND("A",A2)),"有","无")。含有小写字母a的结果是无,该公式里的FIND函数提取的是指定的字符区分大小写,如下图所示 2.判断字符串是否含有某英文字符,区分大小写,可用SEARCH函数代替FIND函数 比如判断字符串是否包含字母A且不区分大小写,公式=IF(ISNUMBER(SEARCH("A",A2)),"有","无"),如下图所示。 3.判断.
return返回问题和字符串问题
chengchaonan的博客
04-07 3647
在 C 语言中下面那个语句的结果是 1 ? 1.return 7&1; 2.char *p="hello"; return p == "hello"; 首先,这两条语句的返回都是1,因为如果return的表达式中有计算,需要先计算出结果。 对于char *p="hello",在常量区存放这个字符串,指针p指向这个字符串,也就是指针p中存放的是hello字符串的地址,...
return怎么返回字符串_JavaScript Api系列之字符串方法操作集合(match、模版字符串、隐式包装)...
weixin_39729837的博客
12-03 937
前言 字符串一个或多个字符的序列,可以由字母,数字或符号组成。JavaScript 中的字符串是基本数据类型,在业务开发中,单独操作字符串的场景相对较少,但却是不可忽略的基础,本文整理了比较常用的字符串方法,希望本文对你有所帮助。常用的String原型方法 字符串包含includes检查字符串是否包含指定的字符conststr='你好,欢迎来到海洋里的魔鬼鱼';console.l...
函数 return,文档字符串,函数作用域和命名空间以及递归函数详解
weixin_46700209的博客
02-03 391
1.函数的返回 1.返回就是函数以后返回的结果 2.通过return来指定函数的返回 3.return后面可以跟任意的函数 *其中return r的返回 和print(fun(1,2,3,4))的相同 因为函数fun2()没有返回所有时None 1.return的特性 在函数中,return后面的代码都不会执行,return一旦执行,函数自动结束 2.文档字符串 也可以叫做长字符串 运用于对函数或者面向对象做功能,参数等说明帮助文档 help(print) help(input)等
返回字符串的四种方法
qq_41557631的博客
12-05 3566
看到一篇好文章,但是菜鸡不会载,只好截图贴过来了。。。下面是原博客的链接。 https://blog.csdn.net/luna_zhan/article/details/80433196
前端面试必备:深入解析JS闭包与字符串操作
- `typeof(NaN)` 返回 "number",尽管NaN(Not-a-Number)是一个特殊的数值类型,但它的不等于任何数字,包括自身。 - 对于NaN的比较,`NaN == NaN` 和 `NaN == undefined` 的结果都是 `false`,因为NaN与任何...
写文章

热门文章

  • 计算机磁盘管理找不到第二块硬盘,新加的硬盘没有显示怎么办?新加硬盘分区方法... 21159
  • 拉普拉斯变换_8种常见的拉普拉斯变换,想搞不懂都难! 12175
  • c语言关键字及其含义,C语言关键字解析 11125
  • matlab 函数怎么写,MATLAB怎样定义函数(入门) 有一函数 f(x,y)=x^2+sinxy+2y , 写一程序, 输入自变量的值,输出函数值.... 7434
  • chrome全屏隐藏状态栏_Chrome浏览器必知必会的小技巧 6700

大家在看

  • 帝国CMS – AutoTitlePic 自动生成文章标题图片插件
  • 帝国CMS7.0 7.2 7.5微信登录插件

最新文章

  • 天刀服务器的位置2018,天涯明月刀2018新春大促_天涯明月刀2018新春大促活动地址_游戏堡...
  • 服务器系统升级介绍,服务器操作系统升级方案
  • php分布式文件服务器,PHP简单分布式锁-PHP服务器
2021年148篇
2020年227篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家昆明动物玻璃钢雕塑制作宁波玻璃钢雕塑制作厂家山西玻璃钢雕塑厂家源头好货商场美陈展活动策划玻璃钢抽象景观雕塑定制盐城玻璃钢仿铜雕塑厂家供应扬州玻璃钢动物雕塑厂家推广玻璃钢雕塑的发展湖南抽象校园玻璃钢雕塑厂家大型主题商场美陈售价湛江户外景观玻璃钢雕塑蝴蝶玻璃钢雕塑现货肇庆商场美陈雕塑玻璃钢茶杯雕塑湖州火烈鸟玻璃钢雕塑生产厂家万源玻璃钢雕塑制作湖南专业玻璃钢雕塑厂家美陈玻璃钢动物雕塑甘南玻璃钢景观雕塑制作宿州创意玻璃钢雕塑销售电话儿童区商场美陈标识标牌玻璃钢景观雕塑价格常平玻璃钢花盆花器玻璃钢柠檬卡通雕塑兰州人物玻璃钢雕塑公司潍坊玻璃钢雕塑哪家好湖州玻璃钢广场雕塑信阳标识标牌玻璃钢卡通雕塑成品雕塑玻璃钢兄嘉兴人物玻璃钢雕塑制作香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化