阿拉伯数字转换成罗马数字(二)

如果你比较熟悉Excel,并且用过里面的ROMAN()这个函数,如下:

 Microsoft Excel 中 ROMAN 函数的公式语法和用法如下:

语法

ROMAN(number, [form])

ROMAN 函数语法具有下列参数:

  • Number    必需。需要转换的阿拉伯数字。
  • Form    可选。一数字,指定所需的罗马数字类型。罗马数字的样式范围可以从经典到简化,随着 form 值的增加趋于简单。请参见下面的示例 ROMAN(499,0).

说明

  • 如果数字为负,则返回错误值 #VALUE!。
  • 如果数字大于 3999,则返回错误值 #VALUE!。

示例

显然,微软Excel中的所谓古典罗马数字样式是和维基百科上对罗马数字的书写规则一致的,但是细心者会发现它的简明版罗马数字样式却不完全符合罗马数字的规则。也就是说微软基于原始定义来重新定义了罗马数字的简明样式。那么怎么来实现呢,代码如下:

function num2roman(nVal,nMode )
{
    var pChars = ['M','D','C','L','X','V','I'];
    var pValues = [1000,500,100,50,10,5,1];
    var nMaxIndex = pValues.length-1;
    var aRoman = "";
    for(var i=0 ; i<= Math.floor( nMaxIndex/2 ); i++)
    {
            var nIndex = 2 * i;
            var nDigit = Math.floor( nVal/pValues[nIndex] );
            if((nDigit%5)==4)
            {
                var nIndex2 = (nDigit == 4) ? nIndex - 1 : nIndex - 2;
                var nSteps = 0;
                while( (nSteps < nMode) && (nIndex < nMaxIndex) )
                {
                    nSteps++;
                    if( pValues[ nIndex2 ] - pValues[ nIndex + 1 ] <= nVal )
                        nIndex++;
                    else
                        nSteps = nMode;
                }
                aRoman += pChars[ nIndex ];
                aRoman += pChars[ nIndex2 ];
                nVal = nVal + pValues[ nIndex ];
                nVal = nVal - pValues[ nIndex2 ];
            }
            else
            {
                if( nDigit > 4 )
                    aRoman += pChars[ nIndex - 1 ];
                for(var j=0 ; j<(nDigit % 5) ; j++)
                    aRoman += pChars[ nIndex ];
                nVal %= pValues[ nIndex ];
            }
    }
    return aRoman;
}

它的简化规则其实就是根据罗马记数规则,对数字的数位中包含4或9作了特殊的处理,读者可以慢慢品味。

工欲善其事必先利其器
原文地址:https://www.cnblogs.com/CodeGuy/p/3069264.html