PHP将数字转换为罗马字符的实例代码

发布时间:2019-12-05编辑:脚本学堂
分享一例php代码,用于将数字转换为罗马字符的表示形式,有需要的朋友参考下。

本节主要内容:
php实现数字转换为罗马字符的代码。

例子:
 

复制代码 代码示例:

<?PHP
/*
Decimal <--> Roman 1.1
用到了二个函数

string dec2roman (integer $number)
where $number is a number you want to convert to a roman one.

integer roman2dec (string $linje)
where $linje is the roman number you want to conver to an integer.

edit: www.jb200.com
*/

function dec2roman ($number) {
    # Making input compatible with script.
    $number = floor($number);
    if($number < 0) {
        $linje = "-";
        $number = abs($number);
    }

    # Defining arrays
    $romanNumbers = array(1000, 500, 100, 50, 10, 5, 1);
    $romanLettersToNumbers = array("M" => 1000, "D" => 500, "C" => 100, "L" => 50, "X" => 10, "V" => 5, "I" => 1);
    $romanLetters = array_keys($romanLettersToNumbers);

    # Looping through and adding letters.
    while ($number) {
        for($pos = 0; $pos <= 6; $pos++) {

            # Dividing the remaining number with one of the roman numbers.
            $dividend = $number / $romanNumbers[$pos];

            # If that division is >= 1, round down, and add that number of letters to the string.
            if($dividend >= 1) {
                $linje .= str_repeat($romanLetters[$pos], floor($dividend));

                # Reduce the number to reflect what is left to make roman of.
                $number -= floor($dividend) * $romanNumbers[$pos];
            }
        }
    }

    # If I find 4 instances of the same letter, this should be done in a different way.
    # Then, subtract instead of adding (smaller number in front of larger).
    $numberOfChanges = 1;
    while($numberOfChanges) {
        $numberOfChanges = 0;

        for($start = 0; $start < strlen($linje); $start++) {
            $chunk = substr($linje, $start, 1);
            if($chunk == $oldChunk && $chunk != "M") {
                $appearance++;
            } else {
                $oldChunk = $chunk;
                $appearance = 1;
            }

            # Was there found 4 instances.
            if($appearance == 4) {
                $firstLetter = substr($linje, $start - 4, 1);
                $letter = $chunk;
                $sum = $firstNumber + $letterNumber * 4;

                $pos = array_search($letter, $romanLetters);

                # Are the four digits to be calculated together with the one before? (Example yes: VIIII = IX Example no: MIIII = MIV
                # This is found by checking if the digit before the first of the four instances is the one which is before the digits in the order
                # of the roman number. I.e. MDCLXVI.

                if($romanLetters[$pos - 1] == $firstLetter) {
                    $oldString = $firstLetter . str_repeat($letter, 4);
                    $newString = $letter . $romanLetters[$pos - 2];
                } else {
                    $oldString = str_repeat($letter, 4);
                    $newString = $letter . $romanLetters[$pos - 1];
                }
                $numberOfChanges++;
                $linje = str_replace($oldString, $newString, $linje);
            }
        }
    }
    return $linje;
}

function roman2dec ($linje) {
    # Fixing variable so it follows my convention
    $linje = strtoupper($linje);

    # Removing all not-roman letters
    $linje = ereg_replace("[^IVXLCDM]", "", $linje);

    print("$linje  = $linje<br>");

    # Defining variables
    $romanLettersToNumbers = array("M" => 1000, "D" => 500, "C" => 100, "L" => 50, "X" => 10, "V" => 5, "I" => 1);

    $oldChunk = 1001;

    # Looping through line
    for($start = 0; $start < strlen($linje); $start++) {
        $chunk = substr($linje, $start, 1);

        $chunk = $romanLettersToNumbers[$chunk];

        if($chunk <= $oldChunk) {
            $calculation .= " + $chunk";
        } else {
            $calculation .= " + " . ($chunk - (2 * $oldChunk));
        }

        $oldChunk = $chunk;
    }

    # Summing it up
    eval("$calculation = $calculation;");
    return $calculation;
}

# Implementation of the array_search function. Works only with numerical arrays.
function array_search($searchString, $array) {
    foreach ($array as $content) {
        if($content == $searchString) {
            return $pos;
        }
        $pos++;
    }
}
?>

您可能感兴趣的文章:

php数字转换为指定长度字符串的函数
php全角数字转半角数字的代码一例
php实现IP地址与数字互换的代码
php数字格式化的例子(number_format函数应用)
php 数字格式化函数 number_format 简介
阿拉伯数字转中文数字的php自定义函数
人民币金额数字转中文大写的php函数
货币数字转换为中文大写的php代码
php批量获取首字母(汉字、数字、英文)的代码
将IP地址和数字相互转化的php代码