功能说明
罗马数字转换常用于题解、章节编号和格式化输出。该实现使用从大到小的数值表处理减法组合,编码范围限定 1 到 3999;解码时逐字符累加,并在遇到小于后继符号的值时改为减法。最后通过回环编码拒绝不规范写法。
关键代码
NUMERALS 表按降序排列,包含 900、400、90、40、9、4 等减法形式。toRoman 反复减去当前值并拼接符号。fromRoman 先校验字符集,再从左到右比较相邻值,最后用 toRoman 核对结果是否与输入完全一致。
for (const [amount, symbol] of NUMERALS) {
while (remaining >= amount) {
output += symbol;
remaining -= amount;
}
}
使用注意
仅支持标准罗马数字,不接受 IIII 等非标准写法。输入必须是 1 到 3999 的整数。解码区分大小写,只接受大写字符。回环校验会增加一次编码开销,但能拒绝 IC 之类语法合法却非规范的组合。空字符串会因正则失败而抛错。
验证方式
断言 toRoman(1994) 返回 MCMXCIV,fromRoman(“MCMXCIV”) 返回 1994。toRoman(0) 与 toRoman(4000) 抛 RangeError。fromRoman(“ABC”) 抛 RangeError,fromRoman(“IIII”) 因回环不一致抛 RangeError。toRoman(4) 应返回 IV。