Подтвердите измерения с помощью 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.

Редактировать: сравнение, позже, должно интерпретировать возвращаемое значение как действительное число.

Я надеюсь, что кто-то может предложить что-то более элегантное.

Другие вопросы по тегам