如何验证从表单发布的数字的精度/比例,以确保它可以存储在Oracle NUMBER列中?例如:
<input type="number" name="foo" value="123.45" />
用户将表单提交给PHP后端......
<?php
function isValidNumber($number, $precision, $scale) {
// ???
return $isValid;
}
// The precision and scale here are actually dynamic
$isValid = isValidNumber($_POST['foo'], 5, 2);
...我希望能够验证数字而不尝试在Oracle中插入/更新它并处理任何精度溢出错误(主动设计,而不是被动)。我没有能够提出一种准确验证所有各种边缘情况的方法(Oracle不会产生规模溢出的错误 - 它只是舍入到最大值,但这种舍入可能导致精度溢出,这会产生错误等等。)。
答案 0 :(得分:2)
function isValidNumber($number, $precision, $scale) {
$isValid = false;
if (is_numeric($number)) {
$num = round(abs($number), $scale);
$max = str_repeat('9',$precision - $scale).'.'.str_repeat('9',$scale);
$isValid = $num <= $max;
}
return $isValid;
}
isValidNumber($number, 5, 2)
123.456 (valid)
9999.999 (invalid)
99999.999 (invalid)
12.003 (valid)
999.99 (valid)
999.999 (invalid)
1234.5 (invalid)
最后
isValid(1234567890123456789012345678.90, 30, 2) == **valid**
答案 1 :(得分:0)
您可以使用多种方式实现此目的。以下可以是起点
建议的方法可以是仅使用HTML5使用基于正则表达式模式的匹配。
input type="text" pattern="regex"
免责声明:模式逻辑尚未经过测试,因此您必须在使用之前对其进行测试
-?([0-9]{0,precision-scale}\.[0-9]{1,scale}|[0-9]{1,precision-scale})
相同的Regex逻辑也可用于以下任何有自己的加号和负号的层
答案 2 :(得分:-1)
获取字符串的长度,获取小数位 这将给你小数位总数
$len = strlen($num);
$p = strpos($num, '.');
$dec_plcs = ($len - $p) - 1;