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


    如果你比较熟悉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作了特殊的处理,读者可以慢慢品味。

    工欲善其事必先利其器
  • 相关阅读:
    在前后端分离的SpringBoot项目中集成Shiro权限框架
    过账销售订单装箱单报错:用库存单位数量表示的实际剩余数量不能为零
    外部系统调用AX服务
    InventSum Closed and ClosedQty
    固定资产日志过账报错
    AX批处理相关
    AX2012打开报表报错
    有折扣的销售订单过账
    AX版本查询
    AX2012 SSRS Report 相关
  • 原文地址:https://www.cnblogs.com/CodeGuy/p/3069264.html
Copyright © 2020-2023  润新知