Подтвердите измерения с помощью PHP
Мне нужно проверить измерения, введенные в форму, сгенерированную PHP.
Я намерен сравнить их с верхним и нижним контрольными пределами и решить, если они не пройдут или пройдут.
В качестве первого шага я представляю функцию PHP, которая принимает строки, представляющие инженерные измерения, и преобразует их в чистые числа перед сравнением.
На данный момент я ожидаю только измерения малых напряжений и токов, поэтому
"1,234 мкА", "2,34 нА", "39,9 мВ". или "-1.003e-12"
будет преобразован в
1,234e-6, 2,34e-9, 3,99e-2 и -1,003e-12 соответственно.
Но метод должен быть обобщен на любую измеряемую величину.
3 ответа
function convert($value) {
$units = array('p' => 'e-12',
'n' => 'e-9',
'u' => 'e-6',
'm' => 'e-3');
$unitstring = implode("", array_keys($units));
$matches = array();
$pattern = "/^(-?(?:\\d*\.\\d+)|(?:\\d+))\s*([$unitstring])([a-z])$/i";
$result = preg_match($pattern, $value, $matches);
if ($result)
$retval = $matches[1].$units[$matches[2]].$matches[3];
else
$retval = $value;
return $retval;
}
Итак, чтобы объяснить, что делает вышеперечисленное:
- $ units - это массив для отображения префикса юнитов в экспоненте.
- $ unitstring объединяет единицы в одну строку (в примере это будет 'pnum')
- Регулярное выражение будет соответствовать необязательному -, за которым следуют либо 0 или более цифр, точка и 1 или более цифр, либо 1 или более цифр, за которыми следует один из префиксов единиц (только одна), а затем один алфавитный символ. Между числом и единицами может быть любое количество пробелов.
- Из-за parethesis и использования preg_match, числовой раздел, префикс единицы измерения и единица измерения все отдельно записываются в массиве $ соответствует элементам 1, 2 и 3. (0 будет содержать всю строку)
- $ result будет 1, если оно соответствует регулярному выражению, 0 в противном случае.
- $ retval создается путем простого соединения числа, экспоненты (на основе префикса единицы из массива) и предоставленных единиц, или это будет просто передаваемая строка (например, если тебе дано -1.003e-12 будет возвращено)
Конечно, вы можете настроить некоторые вещи, но в целом это хорошее начало. Надеюсь, поможет.
В вашей функции
сначала вам нужно инициализировать значения для таких единиц, как -6 для вас, -3 для м... и т. д.
разделите строку на число и единицу (т. е. микро (и), мили (м) и т. д.).
и затем скажите, что введенный номер - это NUM; и единица измерения - это UNIT.
while(NUM>10)
{
NUM=NUM/10;
x++; //x is keeping track of the DOT.
}
UNIT=UNIT+x; //i.e UNIT is increased(for M,K,etc) or decreased(for u,m,etc)
echo NUM.e.UNIT;
Может быть, это будет делать!
Мой собственный, возможно, простой подход заключался в использовании массива шаблонов в preg_replace
function convert($value) {
$result = preg_replace($patterns, $replacements, $value);
return $result;
}
куда
$patterns = array('/p[av]/i', '/n[av]/i', '/u[av]/i', '/m[av]/i');
$replacements = array('e-12', 'e-9', 'e-6', 'e-3');
И это может быть расширено до более высоких префиксов, но это кажется сложным, чтобы продолжать добавлять все более сложные регулярные выражения в массив $ Pattern.
Редактировать: сравнение, позже, должно интерпретировать возвращаемое значение как действительное число.
Я надеюсь, что кто-то может предложить что-то более элегантное.