Frage

Hier bin ich mit einem Problem konfrontiert, dass ich glaube (oder zumindest die Hoffnung) 1 Million mal schon gelöst wurde. Was ich als Eingang bekam eine Zeichenfolge, die eine Länge eines Objektes in imperialen Einheiten darstellen. Es kann so aus:

$length = "3' 2 1/2\"";

oder wie folgt aus:

$length = "1/2\"";

oder in der Tat auf andere Weise würden wir normalerweise schreiben Sie es.

Im Bemühen globales Rad Erfindung zu reduzieren, frage ich mich, wenn es eine Funktion, die Klasse oder regexp-ish Sache, die mir erlauben, Kaiser Länge in Metric Länge zu konvertieren?

War es hilfreich?

Lösung

Hier ist meine Lösung. Es verwendet eval () den Ausdruck auszuwerten, aber keine Sorge, die Regex Prüfung am Ende macht es völlig sicher.

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

So zum Beispiel der Zeichenfolge

3' 2 1/2"

wird zum Ausdruck konvertiert

3*12+2+1/2

was wird ausgewertet

38.5

, welche auf 0,9779 Meter wird schließlich umgewandelt.

Andere Tipps

Das Zend Framework verfügt über eine Messkomponente für genau diesen Zweck. Ich schlage vor, Sie, check it out -. hier

$unit = new Zend_Measure_Length($length,Zend_Measure_Length::YARD);
$unit -> convertTo(Zend_Measure_Length::METER);

Die Kaiser String-Werte sind ein wenig komplizierter, so habe ich folgenden Ausdruck:

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;

Vielleicht besuchen Sie die Einheiten Bibliothek ? Es scheint nicht ein PHP-Bindung für ihn, aber zu sein.

Die regexp würde wie folgt aussehen:

"([0-9]+)'\s*([0-9]+)\""

(wobei \ s Leerzeichen repräsentiert - ich bin nicht sicher, wie es in PHP funktioniert). Dann extrahieren Sie die erste + zweite Gruppe und tun

(int(grp1)*12+int(grp2))*2.54

in Zentimeter umzuwandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top