如何在PHP中将罗马数字转换为整数?

2022-08-30 15:09:18

使用PHP,我想将包含罗马数字的字符串转换为其整数表示形式。我需要这个,因为我需要对它们进行计算。

关于罗马数字的维基百科

仅识别基本的罗马数字字符就足够了,例如:

$roman_values=array(
    'I' => 1,
    'V' => 5,
    'X' => 10,
    'L' => 50,
    'C' => 100,
    'D' => 500,
    'M' => 1000,
);

这意味着最高可能的数字是3999(MMMCMXCIX)。我将用于表示零,除了只支持正整数。N

我不能将PEAR库用于罗马数字。

我在SO上发现了一个很好的问题,关于如何测试字符串是否包含有效的罗马数字:

如何仅将有效的罗马数字与正则表达式匹配?

编码的最佳方式是什么?


答案 1

怎么样:

$romans = 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,
);

$roman = 'MMMCMXCIX';
$result = 0;

foreach ($romans as $key => $value) {
    while (strpos($roman, $key) === 0) {
        $result += $value;
        $roman = substr($roman, strlen($key));
    }
}
echo $result;

这应该为提供的 输出 3999。它似乎适用于我的有限测试:$roman

MCMXC = 1990
MM = 2000
MMXI = 2011
MCMLXXV = 1975

您可能还想先进行一些验证:-)


答案 2

我不确定你是否有采埃孚,但如果你(或你们中的任何一个正在阅读这篇文章的人)在这里是我的片段:

$number = new Zend_Measure_Number('MCMLXXV', Zend_Measure_Number::ROMAN);
$number->convertTo (Zend_Measure_Number::DECIMAL);
echo $number->getValue();

推荐