栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

验证字符串是否为正整数

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

验证字符串是否为正整数

为您提供两个答案:

  • 基于解析

  • 正则表达式

请注意,在两种情况下,我都将“正整数”解释为包括

0
,即使
0
它不是正数。如果您不愿意,我会提供注释
0

基于解析

如果希望它是在合理值范围内的归一化十进制整数字符串,则可以执行以下操作:

function isNormalInteger(str) {    var n = Math.floor(Number(str));    return n !== Infinity && String(n) === str && n >= 0;}

或者,如果您想允许空格和前导零:

function isNormalInteger(str) {    str = str.trim();    if (!str) {        return false;    }    str = str.replace(/^0+/, "") || "0";    var n = Math.floor(Number(str));    return n !== Infinity && String(n) === str && n >= 0;}

实时测试平台(不处理前导零或空白):

function isNormalInteger(str) {    var n = Math.floor(Number(str));    return n !== Infinity && String(n) === str && n >= 0;}function gid(id) {    return document.getElementById(id);}function test(str, expect) {    var result = isNormalInteger(str);    console.log(        str + ": " +        (result ? "Yes" : "No") +        (expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")    );}gid("btn").addEventListener(    "click",    function() {        test(gid("text").value);    },    false);test("1", true);test("1.23", false);test("1234567890123", true);test("1234567890123.1", false);test("0123", false); // false because we don't handle leading 0stest(" 123 ", false); // false because we don't handle whitespace<label>  String:  <input id="text" type="text" value=""><label><input id="btn" type="button" value="Check">

实时测试平台( 处理前导零和空白):

function isNormalInteger(str) {    str = str.trim();    if (!str) {        return false;    }    str = str.replace(/^0+/, "") || "0";    var n = Math.floor(Number(str));    return String(n) === str && n >= 0;}function gid(id) {    return document.getElementById(id);}function test(str, expect) {    var result = isNormalInteger(str);    console.log(        str + ": " +        (result ? "Yes" : "No") +        (expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")    );}gid("btn").addEventListener(    "click",    function() {        test(gid("text").value);    },    false);test("1", true);test("1.23", false);test("1234567890123", true);test("1234567890123.1", false);test("0123", true);test(" 123 ", true);<label>  String:  <input id="text" type="text" value=""><label><input id="btn" type="button" value="Check">

如果您要禁止

0
,请更改
>= 0
> 0
。(或者,在允许前导零的版本中,删除
|| "0"
replace
行。)

工作原理:

  1. 在允许空格和前导零的版本中:

    • str = str.trim();
      删除所有开头和结尾的空白。
    • if (!str)
      捕获一个空白字符串并返回,没有必要进行其余工作。
    • str = str.replace(/^0+/, "") || "0";
      从字符串中删除所有前导0,但是如果结果为空字符串,则恢复单个0。
    • Number(str)
      :转换
      str
      为数字;该数字可以是小数部分,也可以是
      NaN
  2. Math.floor
    :截断数字(切掉任何小数部分)。

  3. String(...)
    :将结果转换回普通的十进制字符串。对于很大的数字,将采用科学计数法,这可能会破坏这种方法。(我不太清楚拆分的位置,规范中有详细信息,但对于整数,我认为这是您已超过21位数字的原因[到那时,该数字变得非常不精确,如IEEE-754双精度数字的精度大约只有15位数字。)

  4. ... === str
    :将其与原始字符串进行比较。

  5. n >= 0
    :检查结果是否正确。

请注意,这对于输入

"+1"
,科学表示法的任何输入(在该
String(...)
阶段没有变回相同的科学表示法)以及Javascript使用的数字类型的任何值(IEEE-754双精度二进制浮点数)均失败不能准确表示哪个解析比给定的解析更接近不同的值(例如,包含超过9,007,199,254,740,992的许多整数;例如,
1234567890123456789
将失败)。前者是一个容易解决的问题,后两者则不是很多。

正则表达式

另一种方法是,如果您的目标是允许(说)一个可选的,

+
后面跟一个
0
或十进制格式的字符串,则通过正则表达式测试字符串的字符:

function isNormalInteger(str) {    return /^+?(0|[1-9]d*)$/.test(str);}

现场测试台:

function isNormalInteger(str) {    return /^+?(0|[1-9]d*)$/.test(str);}function gid(id) {    return document.getElementById(id);}function test(str, expect) {    var result = isNormalInteger(str);    console.log(        str + ": " +        (result ? "Yes" : "No") +        (expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")    );}gid("btn").addEventListener(    "click",    function() {        test(gid("text").value);    },    false);test("1", true);test("1.23", false);test("1234567890123", true);test("1234567890123.1", false);test("0123", false); // false because we don't handle leading 0stest(" 123 ", false); // false because we don't handle whitespace<label>  String:  <input id="text" type="text" value=""><label><input id="btn" type="button" value="Check">

工作原理:

  1. ^
    :匹配字符串的开头

  2. +?
    :允许一个可选的
    +
    (如果您不想删除此选项)

  3. (?:...|...)
    :允许以下两个选项之一(不创建捕获组):

    1. (0|...)
      :允许
      0
      自己…

    2. (...|[1-9]d*)
      :…或以非零开头的数字
      0
      ,后接任意十进制数字。

  4. $
    :匹配字符串的结尾。

如果要禁止

0
(因为它不是正数),则正则表达式将变为公正
/^+?[1-9]d*$/
(例如,我们可能会丢失需要允许的替代
0
)。

如果要允许前导零(0123、00524),则只需将替换替换

(?:0|[1-9]d*)
d+

function isNormalInteger(str) {    return /^+?d+$/.test(str);}

如果你想允许空格,加

s*
刚过
^
s*
之前
$

请注意何时将其转换为数字:在现代引擎上,使用

+str
Number(str)
执行它可能会很好,但是较旧的引擎可能会以非标准(但以前允许)的方式扩展它们,即前导零表示
八进制 (以8为底),例如“ 010” =>8。验证数字后,可以放心使用
parseInt(str,10)
以确保将其解析为十进制(以10为底)。
parseInt
会忽略字符串末尾的垃圾,但是我们确保正则表达式没有任何垃圾。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/442221.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号