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

标签 php integer roman-numerals

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

Wikipedia on Roman numerals

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

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

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

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

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

How do you match only valid roman numerals with a regular expression?

最好的编码方式是什么?

最佳答案

这个怎么样:

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

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

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

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

关于php - 如何在 PHP 中将罗马数字转换为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265596/

相关文章:

php - 论坛帖子显示加载缓慢

php - PHP 中的容错 HTML/XML/SGML 解析

php - php中Mysql 1041查询限制

numbers - prolog 将数字转换为罗马数字

java - Java 新手,请帮助我的程序运行!我的任务是编写一个将整数转换为罗马数字的程序

java - 正则表达式匹配标点符号和小写罗马字

php - 如何从图像资源创建 base64 编码的字符串

c++ - 通过 Rcpp 和 bit64 R 包将最大的 int64_t 变量值从 C++ 传递到 R

c++ - 如何测试迭代器值是否具有整数类型?

java - Java 编译器在混合数字类型时是否优化类型转换?