2

我遇到了一个问题,我需要确定用户输入的字段是整数还是浮点数。然后,答案将在表单中进一步预选一个下拉菜单。经过大量挖掘,我发现了很多框架代码,但没有一个能真正正确地完成工作。我使用的测试数据是;

空白答案,非数字 (Alpha),1.0, 10, 1.10, 2.4, 3.0, 0.30, 0.00

许多其他帖子也使用上述数据进行了测试,但我找不到正确传递所有数据的帖子。

因此,我写了以下内容,以便您的好人可以对其进行审查,并希望在遇到相同情况时对其他人有所帮助。

    function isInteger(value) 
        {
        //if(isNaN(value))return Nan;//optional check
        //test for decimal point
        if(!( /^-?\d+$/.test(String(value))))
            {
            //decimal point found
            //if parseInt changes value it must be a float
            if(parseInt(value) / 1 != value)return false; 
            }
        //no decimal point so must be integer
        return true;
        }
4

2 回答 2

10

测试整数值

ECMAScript 6 标准引入了Number.isInteger().

并非所有主流浏览器都支持此功能,但网站上列出了一个 polyfill:

Number.isInteger = Number.isInteger || function isInteger (value) {
  return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value
}

在用户输入的情况下(这是一个字符串,而不是整数),我们可以使用该Number函数将类型转换为数字:

var input = '123' // Imagine this came from user

if (Number.isInteger(Number(input)) {
  // User entered a valid integer value
}

但是请注意,即使对于十六进制或八进制字符串,类型转换也会返回一个有效的类似整数的值。如果不需要,您需要进一步验证原始字符串。有关类型转换如何工作的详细信息,请参阅MDN

如果需要这种严格的验证,MDN 还提供了一个使用 Regex 的良好实现(参见示例输出的链接):

function filterInt (value) {
  if(/^(\-|\+)?([0-9]+|Infinity)$/.test(value))
    return Number(value)

  return NaN
}

测试浮点数

isFinite()结合Number.isInteger()可以帮助实现我们的目标。

如果是用户输入(这是一个字符串,而不是浮点数),我们必须使用 Number 函数将类型转换为数字:

var input = '123.5'
// Perform type conversion to a number
input = Number(input)

if (Number.isFinite(input) && ! Number.isInteger(input)) {
  // A finite number that is not an integer can only be a float
}

或者,可以使用更严格的实现变体,如MDNparseFloat()上所列(参见示例输出的链接):

function filterFloat (value) {
  if(/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/
    .test(value))
    return Number(value)
  return NaN
}
于 2015-05-27T09:32:26.377 回答
1

由于您提到了用户输入,因此您的问题是关于字符串的,因此Number.isInteger不是一个选项。

为了正确回答这个问题,我们必须更准确地定义“整数”在应用于字符串时的含义。是吗

  1. 一个数字序列?(例如১২৪৫:)
  2. 还是一串阿拉伯数字?(例如0000001:)
  3. 或任何数学上有效的整数表示?(例如989238402389402394820394802:)
  4. 还是可以在 Javascript 中精确表示的数学上有效的整数(即小于MAX_SAFE_INTEGER)?

我的猜测是您正在寻找 4),这是此案例的代码:

function isValidIntegerRepresentation(str) {
  return /^-?\d+$/.test(str) && String(Number(str)) === str;
}



test = ['0', '00', '123', '-123', '239482039482309820394820394'];
test.forEach(function(n) {
  document.write(n + "=" + isValidIntegerRepresentation(n) + "<br>");
});

这与您已经拥有的非常相似。

于 2015-05-27T09:49:41.157 回答