如何检查一个字符串是否为浮点数?

54

我正在传递一个名为value的参数。我想知道value是否为浮点数。 到目前为止,我有以下代码:

if (!isNaN(value))
{
    alert('this is a numeric value but not sure if it is a float.');
}

如何进一步将该字符串转换为可以评估为浮点数的内容?


value 是怎么传递的?是通过表单还是其他方式? - David G
https://dev59.com/yG865IYBdhLWcg3wTcpY - Alvin Pradeep
请仅允许输入浮点数:https://dev59.com/SGw15IYBdhLWcg3wv-VM在jQuery中检查输入的数字是否为数字:https://dev59.com/K3M_5IYBdhLWcg3wslRW - Alvin Pradeep
17个回答

49

像这样:

if (!isNaN(value) && value.toString().indexOf('.') != -1)
{
    alert('this is a numeric value and I\'m sure it is a float.');
}​

2
嗯,对于大多数人的逻辑来说,9.0可以完全被接受为整数,不是说这是确切的答案,但它可以完成工作。 - Nelson
36
"-1" 只适用于一些国家。许多国家使用句点作为千分位分隔符,或者根本不使用分隔符。欧洲大部分地区使用逗号作为浮点数的小数点分隔符。 - Keith
1
如果值包含两个或更多点(“。”),则它将无法正常工作。 - SAI GIRI CHARY AOUSULA
2
@Keith:JavaScript的浏览器实现在所有国家/地区都是一样的吗?也就是说,它们是否都将句点作为小数分隔符?无论如何,JavaScript解释器都不会将带有千位分隔符的字符串(无论是逗号还是句点)视为有效数字。 - kloddant
1
@kloddant JS可以,用户输入不行。如果您有一个可能包含数字的JS字符串,则_可能_不会遇到此问题。如果您有一个JS数字,您可以使用toString来获取不变格式或toLocaleString来获取特定格式 - 因此,如果您可以确保字符串中的数字使用toString,则此答案就可以了。但是,如果您有用户输入,则此答案中的测试仅会找到不变格式,但用户可能希望千位分隔符或其文化小数指示器起作用。 - Keith

42
您可以使用parseFloat函数。 如果传递的值以浮点数形式开始,函数将返回转换为浮点数的值,否则它将返回 NaN。 类似下面这样的内容:

function beginsWithFloat(val) {
  val = parseFloat(val);
  return ! isNaN(val);
}
console.log(beginsWithFloat("blabla")); // shows false
console.log(beginsWithFloat("123blabla")); // shows true


11
@Mangiucugna 我试过了,但是它有问题。例如,你试过将“3.2.1.release”输入其中吗?猜猜会发生什么... 这是parseXXX的一个非常棘手的故障。此外,你回答了转换部分,但没有回答测试部分 - 你从未测试过值是否为浮点数,而是测试了任何类型的数字(这可能也没关系,因为在JS中技术上每个“Number”都是浮点数)。 - Powerslave
7
parseFloat('2016-03-01') 返回 true。咦?这不是一个数字,而是一个日期! - Michael
1
如果 parseFloat 遇到除了符号 (+ 或 -)、数字 (0-9)、小数点或指数以外的字符,它将返回到该点的值,并忽略该字符及其后续字符。因此,parseFloat('1asd2sd%.') 也会转换为一个浮点数。 - dnaranjo
1
这不太对。parseFloat("123blah456")的结果是数字123,这是一个有效的数字。 - Sarhanis
我已经编辑了答案,使其清晰明了:parseFloat 将像 "123blabla" 这样的字符串视为数字。 - Flimm

18

以下函数还会检查格式。例如,JavaScript 内置的 parseIntparseFloat 函数也会解析包含非数字字符的字符串,上述函数对此有影响。

// For example, following code will work
var n = parseInt('123asd');
n == 123

对于这样的字符串,这些函数将返回false

function isFloat(val) {
    var floatRegex = /^-?\d+(?:[.,]\d*?)?$/;
    if (!floatRegex.test(val))
        return false;

    val = parseFloat(val);
    if (isNaN(val))
        return false;
    return true;
}

function isInt(val) {
    var intRegex = /^-?\d+$/;
    if (!intRegex.test(val))
        return false;

    var intVal = parseInt(val, 10);
    return parseFloat(val) == intVal && !isNaN(intVal);
}

Nikola,"," 是有效的浮点数分隔符吗?我认为只有点号是。 - Dragomir Ivanov
1
@DragomirIvanov,我们正在讨论用户输入。数字格式取决于用户的语言环境。例如,在德国,您会使用逗号作为小数点分隔符,句点作为千位分隔符。不过,您对语言语法的看法是正确的。编程语言通常使用句点作为小数分隔符,但这不是最初的问题。从某种意义上说,这是正则表达式的问题,因为没有严格的语言环境实现,但需要在一个地方支持两种格式。我认为这超出了这个问题的范围,因为它需要整篇文章来解决。 - Nikola Radosavljević
1
这个“floatRegex”能够匹配到“1231.”或者“87.”,但是我认为以下的正则表达式更好:/^-?\d+([.,]?\d+)?$/。顺便一提,它也可以匹配整数。 - haffla
2
小心处理带有指数的数字。 如果要正确处理这些数字,您可以使用例如: /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/ 来源:https://www.regular-expressions.info/floatingpoint.html - Jan

9

检查一个字符串是否为整数或者浮点数

function isFloat(n) {
    return parseFloat(n.match(/^-?\d*(\.\d+)?$/))>0;
}

//alert(isFloat("3.444"));

0,-10 返回 false。 - Дмитрий Васильев
这不适用于负数和零值。 - André Abreu

6
在我的情况下,一个非常简单的正则表达式就可以解决问题。 我需要验证用户输入是否为有效的货币值。 我只是使用了 -
/^[0-9]+(\.)?[0-9]*$/.test(number)

//之间的所有内容都是正则表达式。

/^表示匹配从单词开头开始,$/表示匹配以该单词结尾。如果您认为该单词不能以数字0开头,则表达式将如下所示:[1-9][0-9]*

[0-9]+表示该单词必须以至少一个数字开头。

注意:*表示零个或多个,+表示一个或多个,?表示一个或没有。

到此为止,表达式为/^[1-9][0-9]*$/,这只会验证整数。

要测试数字中是否有句点(.),我们需要在表达式中使用\..是特殊字符,可以匹配任何内容,而\.仅匹配句点。

最后,另一个字符类[0-9]*将与零个或多个数字匹配。

测试用例

/^[0-9]+(\.)?[0-9]$/.test("21.38a") // ==> false
/^[0-9]+(\.)?[0-9]$/.test("21.38") // ==> true
/^[0-9]+(\.)?[0-9]$/.test("y2781.68") // ==> false
/^[0-9]+(\.)?[0-9]$/.test("2781r.68") // ==> false

科学计数法呢?2e3是2000。负数怎么办? - doug65536
1
不匹配20,35 - rovr138

5
Number.prototype.isFloat = function() {
    return (this % 1 != 0);
}

然后你可以:
var floatValue = parseFloat("2.13");
var nonFloatValue = parseFloat("11");

console.log(floatValue.isFloat()); // will output true
console.log(nonFloatValue.isFloat()); // will output false

JS中像2.00这样的数值不能被视为浮点数,或者更确切地说,在JS中每个数字都是浮点数


编辑:忘记提到,在内置类型的原型上进行扩展被认为是一种不良实践(有很好的理由),在生产环境中不鼓励使用。您仍然可以将此检查实现为普通函数。


这段代码无法处理大浮点数。 ( Number.MAX_VALUE * Math.random() ) % 1 != 0 // 返回 false。这是因为模运算在大浮点数上会返回 0。 - Mient-jan Stelling
1
@Mient-janStelling 这是浮点数的技术限制。它们存在精度问题,粗略地说,在某个阈值以上,没有任何数字会被正确地表示为浮点数。POC:Math.round(Number.MAX_VALUE - 0.001) === Number.MAX_VALUE - 0.001(实际上,您可以使用此“四舍五入值方程”检查替换上面的模块方法)。 - Powerslave
你是正确的,扩展内置类型的原型被认为是不好的实践。 - Flimm

4

使用这个:

var isNumber = /^\d+\.\d+$/.test(value);

3
function checkFloat(value) {
    let parsed = Number.parseFloat(value);
    return (!Number.isNaN(parsed)) && (!Number.isInteger(parsed))
}

2

检查字符串是否为浮点数(避免整数值)

function isFloat(n) {
   if( n.match(/^-?\d*(\.\d+)?$/) && !isNaN(parseFloat(n)) && (n%1!=0) )
      return true;
   return false;
}

var nonfloat = isFloat('12'); //will return false
var nonfloat = isFloat('12.34abc'); //will return false
var float = isFloat('12.34'); //will return true

1

如果您需要检查值是整数还是浮点数:

function isFloatOrInt(n) {
    return !isNaN(n) && n.toString().match(/^-?\d*(\.\d+)?$/);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接