如何在PHP中验证十进制数。我查看了is_numeric(),但这对我不起作用:
bool is_numeric(混合变量)
查找给定变量是否为 数字。数字字符串由 可选标志,任意位数, 可选的小数部分和可选 指数部分。因此+ 0123.45e6是一个 有效的数值。的十六进制 也允许使用表示法(0xFF)但是 只有没有标志,小数和 指数部分。
我不想要指数部分或十六进制表示法。用户将输入简单的十进制值,我不想要一个恰好是有效指数的类型o或者十进制值滑过。我只想将“传统”十进制数字视为有效。
编辑这里是一个简单(强力)页面,其中包含更完整的测试数据(应该和不应该被视为数值)。
<html><head></head>
<body>
<?php
function TestFunction($s_value) {
//
// your code here
//
return; //true or false;
}
print '<b>these are valid numbers and should return "true"</b><br>';
print '<pre>';
$s_value='123'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='+1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='-1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value=' 1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='1 '; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value=' 1 '; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='12345.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='6789.01'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='-1.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='+1.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='0'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='00001.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='.0000001';print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='5.'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
print '</pre>';
print '<br><b>these are NOT valid numbers and should return "false"</b><br>';
print '<pre>';
$s_value='--------------------------------';print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value=null; print "\n".'$s_value=null, TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='.'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value=''; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value=' '; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value=' '; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='1abc'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='$1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='1@'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='1.2.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='abc'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='1.45e6'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='0xFF'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='++1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='--1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='1+'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='1-'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='a1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='#1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='10.e5'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='0x1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
$s_value='0x'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
print '</pre>';
?>
</body>
</html>
答案 0 :(得分:6)
更新了测试数据。
function TestFunction($s_value) {
$regex = '/^\s*[+\-]?(?:\d+(?:\.\d*)?|\.\d+)\s*$/';
return preg_match($regex, $s_value);
}
$valid = TestFunction($input);
首先修剪输入
function TestFunction($s_value) {
$regex = '/^[+\-]?(?:\d+(?:\.\d*)?|\.\d+)$/';
return preg_match($regex, $s_value);
}
$input = trim($input);
$valid = TestFunction($input);
答案 1 :(得分:1)
$decimal = preg_match('/^[+\-]?\d+(\.\d+)?$/', $value) ? (float)$value : 0.0;
答案 2 :(得分:0)
$number = preg_match($number, '/\\A\\s*[+\\-]?\\d*(\\.\\d+)?\\s*\\Z/') ?
trim($number) :
'INVALID';
if ($number === '') { $number = '0'; }
if ($number === 'INVALID') {
// handle
}
答案 3 :(得分:0)
正则表达式怎么样? preg_match(/[+\-]?\d*(\.\d+)?([eE][+\-]?d+)?/,$var);
[eE]
位之后允许人们输入2.3e2作为真正大或非常小的数字,所以如果你不想要它就把它留下来。整件事情将允许:
2
0.3
.3
2.2
+2.2
-2.2
2.3e3
2.3E-3
答案 4 :(得分:0)
正则表达式看起来像
[me@home ~]$ cat test.php
<?php
$regex = "/^([+-]{1})?[0-9]+(\.[0-9]+)?$/";
$numbers = array("1", "12345.1", "6789.01", "-1.1", "+1.1", "0", "00001.1");
foreach($numbers as $number) {
print preg_match($regex, $number)."\n";
}
[me@home ~]$ php -e test.php
1
1
1
1
1
1
1
答案 5 :(得分:0)
$value = (float)$value;