0

我需要验证输入到 PHP 生成的表单中的测量值。

我打算将它们与控制上限和下限进行比较,并决定它们是失败还是通过。

作为第一步,我想象一个 PHP 函数,它接受代表工程测量的字符串,并在比较之前将它们转换为纯数字。

目前我只期望测量小电压和电流,所以字符串像

“1.234uA”、“2.34 nA”、“39.9mV”。或“-1.003e-12”

将转换为

分别为 1.234e-6、2.34e-9、3.99e-2 和 -1.003e-12。

但是该方法应该可以推广到任何测量的量。

4

3 回答 3

1
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 个或多个数字,后跟一个单位前缀(只有一个),然后是单个字母字符。数字和单位之间可以有任意数量的空格。
  • 由于括号和 preg_match 的使用,数字部分、单位前缀和单位都被单独捕获在数组 $matches 中作为元素 1、2 和 3。(0 将包含整个字符串)
  • 如果匹配正则表达式,$result 将为 1,否则为 0。
  • $retval 是通过仅连接数字、指数(基于数组中的单位前缀)和提供的单位来构造的,或者它只是传入的字符串(例如,如果给您 -1.003e-12 ,它将被退回)

当然你可以调整一些东西,但总的来说这是一个好的开始。希望能帮助到你。

于 2009-08-20T03:42:11.170 回答
0

在您的函数
中,首先您需要初始化单位的值,例如 -6 表示 u,-3 表示 m...等
将字符串划分为 Number 和 Unit(即 micro(u)、mili(m) 等)。
然后说输入的 no 是 NUM;单位是 UNIT ..(char like u,m etc);

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;

也许它会做!

于 2009-08-19T13:46:33.083 回答
0

我自己可能头脑简单的方法是在 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');

并且它可以扩展到更高的前缀,但是继续向 $patterns 数组添加越来越复杂的正则表达式似乎很笨拙。

编辑:稍后的比较应该将返回值解释为实数。

我希望有人可以提出更优雅的建议。

于 2009-08-19T13:49:17.777 回答