Проверка достоверности числа / масштаба - PullRequest
0 голосов
/ 10 сентября 2011

Как мне проверить точность / масштаб числа, отправленного из формы, чтобы убедиться, что оно может быть сохранено в столбце 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 ]

2 голосов
/ 10 сентября 2011
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**

0 голосов
/ 10 сентября 2011

Вы можете достичь этого, используя n способов. Следующее может быть отправной точкой

  • Проверка на стороне клиента с использованием проверки HTML5

Предлагаемый способ - использовать сопоставления на основе шаблонов Regex, используя только HTML5.

input type="text" pattern="regex"

Отказ от ответственности: логика шаблона не была проверена, поэтому вам придется проверить ее, прежде чем использовать где-либо

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

та же логика Regex также может использоваться на любом из следующих слоев, которые имеют свои собственные плюс и минус

  • Клиентская сторона с использованием проверки Java-скрипта
  • Серверная часть с использованием проверки php
  • Проверка на уровне БД и выдача ошибок по всем
    слои
0 голосов
/ 10 сентября 2011

Получить длину строки, получить десятичную позицию это даст вам общее количество знаков после запятой

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