php - tabla - sistema metrico
¿Cómo convertir unidades imperiales de longitud en métricas? (5)
Aquí me encuentro con un problema que creo (o al menos espero) que se resolvió un millón de veces. Lo que obtuve como entrada es una cadena que representa la longitud de un objeto en unidades imperiales. Puede ir así:
$length = "3'' 2 1/2/"";
o así:
$length = "1/2/"";
o de hecho de cualquier otra manera, normalmente lo escribiríamos.
En un esfuerzo por reducir la invención de la rueda global, me pregunto si hay alguna función, clase o regularidad que me permita convertir la longitud imperial en longitud métrica.
Aquí está mi solución. Utiliza eval () para evaluar la expresión, pero no se preocupe, la comprobación de expresiones regulares al final lo hace completamente seguro.
function imperial2metric($number) {
// Get rid of whitespace on both ends of the string.
$number = trim($number);
// This results in the number of feet getting multiplied by 12 when eval''d
// which converts them to inches.
$number = str_replace("''", ''*12'', $number);
// We don''t need the double quote.
$number = str_replace(''"'', '''', $number);
// Convert other whitespace into a plus sign.
$number = preg_replace(''//s+/'', ''+'', $number);
// Make sure they aren''t making us eval() evil PHP code.
if (preg_match(''/[^0-9///./+/*/-]/'', $number)) {
return false;
} else {
// Evaluate the expression we''ve built to get the number of inches.
$inches = eval("return ($number);");
// This is how you convert inches to meters according to Google calculator.
$meters = $inches * 0.0254;
// Returns it in meters. You may then convert to centimeters by
// multiplying by 100, kilometers by dividing by 1000, etc.
return $meters;
}
}
Entonces, por ejemplo, la cadena
3'' 2 1/2"
se convierte a la expresión
3*12+2+1/2
que se evalúa para
38.5
que finalmente se convierte en 0.9779 metros.
La expresión regular se vería así:
"([0-9]+)''/s*([0-9]+)/""
(donde / s representa espacios en blanco - No estoy seguro de cómo funciona en php). Luego extraes el primer + segundo grupo y haces
(int(grp1)*12+int(grp2))*2.54
para convertir a centímetros.
Tal vez revise la biblioteca de unidades ? Sin embargo, no parece haber un enlace PHP para eso.
Zend Framework tiene un componente de medición solo para ese propósito. Te sugiero que lo veas, aquí .
$unit = new Zend_Measure_Length($length,Zend_Measure_Length::YARD);
$unit -> convertTo(Zend_Measure_Length::METER);
Los valores de cadena imperial son un poco más complicados, así que utilicé la siguiente expresión:
string pattern = "(([0-9]+)'')*//s*-*//s*(([0-9])*//s*([0-9]/[0-9])*/")*";
Regex regex = new Regex( pattern );
Match match = regex.Match(sourceValue);
if( match.Success )
{
int feet = 0;
int.TryParse(match.Groups[2].Value, out feet);
int inch = 0;
int.TryParse(match.Groups[4].Value, out inch);
double fracturalInch = 0.0;
if (match.Groups[5].Value.Length == 3)
fracturalInch = (double)(match.Groups[5].Value[0] - ''0'') / (double)(match.Groups[5].Value[2] - ''0'');
resultValue = (feet * 12) + inch + fracturalInch;