PHP ile ölçümleri doğrulamak

3 Cevap php

PHP tarafından oluşturulan bir forma girilen ölçümleri doğrulamak gerekir.

Ben üst ve alt kontrol limitlerinin bunları karşılaştırmak ve başarısız ya da geçmek karar niyetinde.

İlk adım olarak, ben mühendislik ölçümleri temsil eden dizeleri kabul ve karşılaştırmadan önce saf numaraları onları dönüştüren bir PHP işlevini düşünün.

Şu anda ben sadece küçük bir gerilim ve akımların ölçümleri, şöyle dizeleri bekliyorum

'1 .234 UA, '39 .9 mV ', 0,34 nA '2'. veya '-1.003e-12'

dönüştürülecektir

1.234e-6, 2.34e-9, 3.99e-2 ve-1.003e-12, sırası ile.

Fakat yöntem, herhangi bir ölçülebilir miktar genellenebilir olmalıdır.

3 Cevap

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;
}

Yani yukarıda ne anlatmaya:

  • $ Birimleri üsse birim önek haritasına bir dizidir.
  • $ Unitstring (örnekte o ürün numarası 'olacak) tek bir dize içine birimleri yığma
  • Düzenli ifade isteğe bağlı bir maç olacak -, birim önekleri (tek) biri ve daha sonra bir tek alfabetik karakter tarafından takip, 0 veya daha fazla ya da basamak, bir dönem ve 1 veya daha fazla basamak OR 1 veya daha fazla basamak izledi. Sayısı ve birimler arasında boşluk bir miktar olabilir.
  • Çünkü parethesis ve preg_match'in, sayı bölümüne, birim öneki ve birimin bütün kullanım ayrı ayrı unsurları 1, 2 ve 3 olarak array $ maçlarda yakalanır. (0 tüm dizeyi içerir)
  • Aksi regex, 0 eşleşmiş $ sonuç 1 olacaktır.
  • $ Retval sadece (diziden birim öneki dayalı) numarasını, üs bağlayan ve birimleri sağlanan, ya da sadece dize (örneğin geçilecek tarafından inşa edilmiştir Eğer-1.003e-12 verilmiş ise , o) iade edilecektir

Tabii ki bazı şeyleri çimdik, ama genel olarak bu iyi bir başlangıçtır. Umarım yardımcı olur.

In your function
first you need to initialize values for units like -6 for u, -3 for m...etc
divide the string in Number and Unit(i.e micro(u),mili(m),etc).
and then say the entered no is NUM; and unit is 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;

Yapacağım olabilir!

Benim belki basit fikirli yaklaşımı preg_replace desenleri bir dizi kullanmak olmuştur

function convert($value) {
    $result = preg_replace($patterns, $replacements, $value);
    return $result;
}

Nerede

$patterns = array('/p[av]/i', '/n[av]/i', '/u[av]/i', '/m[av]/i');
$replacements = array('e-12', 'e-9', 'e-6', 'e-3');

Ve daha yüksek öneklerine uzun olabilir, ama $ desenler dizi giderek karmaşık ifadelerin eklemeye devam eli ağır görünüyor.

Edit: karşılaştırma, daha sonra, gerçek bir sayı olarak dönüş değeri yorumlamak gerekir.

Birisi daha zarif bir şey önerebilir umuyorum.