验证数字精度/比例

时间:2011-09-10 01:41:03

标签: php oracle validation scale precision

如何验证从表单发布的数字的精度/比例,以确保它可以存储在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不会产生规模溢出的错误 - 它只是舍入到最大值,但这种舍入可能导致精度溢出,这会产生错误等等。)。

3 个答案:

答案 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验证的客户端验证

建议的方法可以是仅使用HTML5使用基于正则表达式模式的匹配。

input type="text" pattern="regex"

免责声明:模式逻辑尚未经过测试,因此您必须在使用之前对其进行测试

-?([0-9]{0,precision-scale}\.[0-9]{1,scale}|[0-9]{1,precision-scale})

相同的Regex逻辑也可用于以下任何有自己的加号和负号的层

  • 使用Java脚本验证的客户端
  • 使用php验证的服务器端
  • 在DB层进行验证并在不同的情况下抛出错误 层

答案 2 :(得分:-1)

获取字符串的长度,获取小数位 这将给你小数位总数

$len = strlen($num); 
$p = strpos($num, '.'); 
$dec_plcs = ($len - $p) - 1;