Zahlen in römische Zahlen mit php

Lesezeit: 6 Minuten

Benutzer-Avatar
LukasMakey

Ich muss gewöhnliche Zahlen mit PHP in römische Ziffern umwandeln und habe diesen Code:

        <?php

function roman2number($roman){
    $conv = array(
        array("letter" => 'I', "number" => 1),
        array("letter" => 'V', "number" => 5),
        array("letter" => 'X', "number" => 10),
        array("letter" => 'L', "number" => 50),
        array("letter" => 'C', "number" => 100),
        array("letter" => 'D', "number" => 500),
        array("letter" => 'M', "number" => 1000),
        array("letter" => 0, "number" => 0)
    );
    $arabic = 0;
    $state = 0;
    $sidx = 0;
    $len = strlen($roman);

    while ($len >= 0) {
        $i = 0;
        $sidx = $len;

        while ($conv[$i]['number'] > 0) {
            if (strtoupper(@$roman[$sidx]) == $conv[$i]['letter']) {
                if ($state > $conv[$i]['number']) {
                    $arabic -= $conv[$i]['number'];
                } else {
                    $arabic += $conv[$i]['number'];
                    $state = $conv[$i]['number'];
                }
            }
            $i++;
        }

        $len--;
    }

    return($arabic);
}


function number2roman($num,$isUpper=true) {
    $n = intval($num);
    $res="";

    /*** roman_numerals array ***/
    $roman_numerals = array(
        'M' => 1000,
        'CM' => 900,
        'D' => 500,
        'CD' => 400,
        'C' => 100,
        'XC' => 90,
        'L' => 50,
        'XL' => 40,
        'X' => 10,
        'IX' => 9,
        'V' => 5,
        'IV' => 4,
        'I' => 1
    );

    foreach ($roman_numerals as $roman => $number)
    {
        /*** divide to get matches ***/
        $matches = intval($n / $number);

        /*** assign the roman char * $matches ***/
        $res .= str_repeat($roman, $matches);

        /*** substract from the number ***/
        $n = $n % $number;
    }

    /*** return the res ***/
    if($isUpper) return $res;
    else return strtolower($res);
}

/* TEST */
echo $s=number2roman(6,true);
echo "\n and bacK:\n";
echo roman2number($s);


?>

versuche es so, funktioniert aber nicht:

echo $s=number2roman((.$row['id'].),true);
echo "\n and bacK:\n";
echo roman2number($s);

das problem ist, dass ich zum ändern von nummern meine sql datenbank auslesen muss und nicht weiß wie, aus und durch.

  • Mögliches Duplikat: stackoverflow.com/questions/267351/…

    – Matt

    21. Februar 2013 um 5:10 Uhr

  • Oh, Ihr Titel ist rückwärts. Bitte schön: stackoverflow.com/questions/6265596/…

    – Matt

    21. Februar 2013 um 5:23 Uhr

  • Zahl zu Roman in PHP

    – Antonius

    21. Februar 2013 um 5:26 Uhr

  • mkaatman diese Seite ist die Umkehrung meines Problems!

    – LukasMakey

    21. Februar 2013 um 17:34 Uhr

Ich habe diesen Code hier gefunden: http://php.net/manual/en/function.base-convert.php

Optimierte und verschönerte Funktion:

/**
 * @param int $number
 * @return string
 */
function numberToRomanRepresentation($number) {
    $map = array('M' => 1000, 'CM' => 900, 'D' => 500, 'CD' => 400, 'C' => 100, 'XC' => 90, 'L' => 50, 'XL' => 40, 'X' => 10, 'IX' => 9, 'V' => 5, 'IV' => 4, 'I' => 1);
    $returnValue="";
    while ($number > 0) {
        foreach ($map as $roman => $int) {
            if($number >= $int) {
                $number -= $int;
                $returnValue .= $roman;
                break;
            }
        }
    }
    return $returnValue;
}

  • aber ich muss ein lesendes MYSQL umwandeln und dieser Code funktioniert nicht: echo romanic_number(. $row['id'].); Es tut mir leid, das PHP funktioniert noch nicht gut.

    – LukasMakey

    23. Februar 2013 um 17:25 Uhr


  • Nein, das Problem ist nicht die Funktion. Ich schlage vor, Sie lernen, wie man mit Variablen in Funktionen und Arrays umgeht, Sie müssen sagen …”.echo romanic_number($row_id).”…

    Benutzer2095686

    23. Februar 2013 um 18:49 Uhr

  • Ich habe das End-Tag für PHP hinzugefügt und die $upcase-Unterstützung implementiert

    – Joran

    16. August 2014 um 13:38 Uhr

  • wurde user2095686 gelöscht oder warum erscheint er ausgegraut?

    – Georg Tiganila

    30. November 2020 um 19:07 Uhr

Eine andere Möglichkeit, dies zu tun

<?php 
function ConverToRoman($num){ 
    $n = intval($num); 
    $res=""; 

    //array of roman numbers
    $romanNumber_Array = array( 
        'M'  => 1000, 
        'CM' => 900, 
        'D'  => 500, 
        'CD' => 400, 
        'C'  => 100, 
        'XC' => 90, 
        'L'  => 50, 
        'XL' => 40, 
        'X'  => 10, 
        'IX' => 9, 
        'V'  => 5, 
        'IV' => 4, 
        'I'  => 1); 

    foreach ($romanNumber_Array as $roman => $number){ 
        //divide to get  matches
        $matches = intval($n / $number); 

        //assign the roman char * $matches
        $res .= str_repeat($roman, $matches); 

        //substract from the number
        $n = $n % $number; 
    } 

    // return the result
    return $res; 
} 

echo ConverToRoman(23); 
?>

function rome($N){
    $c="IVXLCDM";
    for($a=5,$b=$s="";$N;$b++,$a^=7)
        for($o=$N%$a,$N=$N/$a^0;$o--;$s=$c[$o>2?$b+$N-($N&=-2)+$o=1:$b].$s);
    return $s;
}

// from polish wiki

  • Das scheint zu funktionieren, warnt aber: Illegal offset at ''. Ich habe gesetzt @$c[... and it seems to be perfect.

    – Vojtěch

    Mar 6, 2015 at 14:51


  • @Vojtěch that turns off error reporting, of course it’ll look perfect.

    – user3714134

    Jan 20, 2016 at 9:10

  • Works with 1, 2, 3 and then crashes on ‘A non-numeric value encountered’ for $N = 4, tested with PHP 7.3.

    – Francis Pierot

    Aug 17, 2020 at 9:19

  • This attempt at codegolf is missing its educational explanation and the snippet itself is not easy to read with the obvious deficit of spaces.

    – mickmackusa

    Jul 24, 2021 at 21:26

user avatar
Reto

There is an illegal offset issue.

Replace

$o=1:$b].$s);

mit

$o=1:$b >0 ? $b : 0].$s);

GEPRÜFT UND VERIFIZIERT DURCH PHP UNIT

Erstellen Sie eine Klasse mit Namen Römische Ziffern und fügen Sie eine geschützte statische Eigenschaft wie definiert hinzu:

protected static $lookup = [
        1000 => 'M',
        900 => 'CM',
        500 => 'D',
        400 => 'CD',
        100 => 'C',
        90 => 'XC',
        50 => 'L',
        40 => 'XL',
        10 => 'X',
        9 => 'IX',
        5 => 'V',
        4 => 'IV',
        1 => 'I',
    ];

Fügen Sie dann eine Methode wie folgt hinzu

public function output ($number)
    {
        $solution = '';

        foreach(static::$lookup as $limit => $glyph){
            while ($number >= $limit) {
                $solution .= $glyph;
                $number -= $limit;
            }
        }

        return $solution;
    }

  • Ich habe die gleiche, schnellste Methode von allen zu diesem Thema übernommen. Zeitgesteuert mit Schleifen von 1 bis 20000 ist die str_repeat-Methode viel langsamer, und die andere ‘while’-Methode ist etwas langsamer, da $map den Neustart und die lokale Zuweisung umfasst. Ich konnte den Oneliner von Jasiek oben nicht timen, da er nicht mit PHP 7.3 funktioniert und dies ein Code ist, den ich nicht lesen/debuggen werde/kann.

    – Franz Pierot

    17. August 2020 um 9:42 Uhr

Ich verbessere die rome()-Funktion von Jasiek

function rome2($N)
{
    // support for numbers greater than a thousand
    $ss="";
    while ($N > 1000) {
        $ss .= 'M';
        $N -= 1000;
    }

    $c="IVXLCDM";
    for ($a = 5, $b = 0, $s=""; $N; $b++, $a ^= 7)
        for ($o = $N % $a, $N = $N / $a ^ 0; $o--; ) {
            $s = $c[$o > 2 ? $b + $N - ($N &= -2) + $o = 1 : $b] . $s;
        }
    return $ss.$s;
}

  • Ich habe die gleiche, schnellste Methode von allen zu diesem Thema übernommen. Zeitgesteuert mit Schleifen von 1 bis 20000 ist die str_repeat-Methode viel langsamer, und die andere ‘while’-Methode ist etwas langsamer, da $map den Neustart und die lokale Zuweisung umfasst. Ich konnte den Oneliner von Jasiek oben nicht timen, da er nicht mit PHP 7.3 funktioniert und dies ein Code ist, den ich nicht lesen/debuggen werde/kann.

    – Franz Pierot

    17. August 2020 um 9:42 Uhr

Meine eigene Funktion hat die beste Leistung:

function romanNumber($n)
{
    // support for numbers greater than a thousand
    $ret1 = '';
    while ($n >= 1000) {
        $ret1 .= 'M';
        $n -= 1000;
    }

    $ret="";
    if ($n > 0) {
        $n = (string) $n;
        $l="IVXLCDM";
        $j = 0; // goes by roman letters
        for ($i = strlen($n)-1; $i >= 0; --$i) { // goes by decimal number
            switch ($n[$i]) {
                case 0: $s=""; break;
                case 1: $s = $l[$j]; break;
                case 2: $s = $l[$j].$l[$j]; break;
                case 3: $s = $l[$j].$l[$j].$l[$j]; break;
                case 4: $s = $l[$j].$l[$j+1]; break;
                case 5: $s = $l[$j+1]; break;
                case 6: $s = $l[$j+1].$l[$j]; break;
                case 7: $s = $l[$j+1].$l[$j].$l[$j]; break;
                case 8: $s = $l[$j+1].$l[$j].$l[$j].$l[$j]; break;
                case 9: $s = $l[$j].$l[$j+2]; break;
            }
            $j += 2;
            $ret = $s.$ret;
        }
    }

    return $ret1.$ret;
}

1180640cookie-checkZahlen in römische Zahlen mit php

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy