当前位置: 首页 > 面试题库 >

验证字符串是否为正整数

齐意致
2023-03-14
问题内容

我想要最简单的故障安全测试来检查JavaScript中的字符串是否为正整数。

isNaN(str)对于各种非整数值返回true,并且parseInt(str)为浮点字符串返回整数,例如“
2.5”。而且我也不想使用某些jQuery插件。


问题答案:

为您提供两个答案:

  • 基于解析

  • 正则表达式

请注意,在两种情况下,我都将“正整数”解释为包括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 0s

test(" 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 0s

test(" 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*之前$

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



 类似资料:
  • 我想要最简单的故障安全测试来检查JavaScript中的字符串是否为正整数。 为所有类型的非整数值返回true,为浮点字符串返回整数,如“2.5”。我也不想使用jQuery插件。

  • 我的Java应用程序“A”正在从另一个Java应用程序获取移动电话号码作为字符串。因此,在应用程序A获得手机号码字符串后,我需要验证该手机号码字符串中是否只有数字。为了验证我使用了如下的简单逻辑, 我正在检查I=1,因为国家代码的第一个字符将是“”。这种方法是O(n)。还有另一种方法,我们可以使用。这将抛出<代码> No.MultFrimeExtry,以便我们可以捕获并考虑它是一个字母数字字符串。

  • 本文向大家介绍C#验证给定字符串是否为数字的方法,包括了C#验证给定字符串是否为数字的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#验证给定字符串是否为数字的方法。分享给大家供大家参考。具体分析如下: 这段C#代码用于验证给定的字符串是否为数字,不能用于验证负数,字符串中只能出现数字和小数点,否则认为不是数字,不验证数字的长度,也就是说,给定的字符串再长,哪怕是1万个字符,也可以

  • 我的控制器中有请求,是MongoId的字符串版本。如果我使用无效的字符串格式(与MongoId格式不匹配)调用此请求,则该请求将一直执行,直到MongoDB调用抛出内部服务器错误。 我如何验证,例如或"ANWPINREBAFSOFASD"未被验证,并在我的请求中尽早停止 电流控制器endpoint: 该服务称为:

  • 问题内容: 我正在尝试确定字符串数组中的特定项目是否为整数。 我是形式上的中缀表达式,然后尝试将结果数组拆分为两个数组;一个用于整数,一个用于运算符,同时丢弃括号和其他杂项。做到这一点的最佳方法是什么? 我以为我也许可以找到一种方法或某种方法,但是没有运气。 问题答案: 最幼稚的方式是遍历String并确保所有元素对于给定的基数都是有效数字。由于你必须至少查看一次每个元素,因此这将尽可能地提高效率

  • 问题内容: 如何检查字符串是否是Java中的URL? 问题答案: 您可以尝试用它创建一个对象。如果该URL不正确,则会引发a。