前端之家收集整理的这篇文章主要介绍了
PHP 将数字转为罗马字符的简单示例,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对
PHP将数字转换为罗马字符感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!
/**
* PHP将数字转换为罗马字符
*
* @param
* @arrange 512-笔记网: 512Pic.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,"I" => 1);
$oldChunk = 1001;
# Looping through line
for($start = 0; $start < strlen($linje); $start++) {
$chunk = substr($linje,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++;
}
}
/*** 来自编程之家 jb51.cc(jb51.cc) ***/