下午在FCC(FreeCodeCamp)中文网上做到一道练习题:将给定的数字转换成罗马数字。折磨了一个多小时,终于能把基本功能给实现了。过程如下:

关于罗马数字

  罗马数字的详细介绍可见百度,或者罗马数字。这里作一下简单的介绍(图片选自罗马数字):

1.罗马数字选用7个罗马字母(大写)作数字,代表的十进制数字如下:

          

一些数字用罗马数字表示为:

                 

2.罗马数字的计数规则:

(1) 相同数字连写,则值相加,如III = 3;

(2) 小的数在大的数右边,也是累加,如VI = 6;

(3) 小的数在大的数左边,结果为大数减小数,如IV = 4;

(4) 在数的上方划一条横线,表示扩大1000倍。

一个简单粗暴的例子:

            

但是,我们会遇到一些特别的情况:

(1) 3999 = MMMCMXCIX,3999 = MMMDCCCCLXXXXVIIII,两种结果都是3999,但是我们一般会选择简单的,也就是前者;

(2) 同理,3444 = MMMCDXLIV, 3444 = MMMCCCCXXXXIIII,也是选择前者的方式。

于是,先把1~9的情况都列举一下:

可以看出,罗马数字对4和9的处理是不同与其他的。

列举4、9有关的部分数字:

思路和代码实现

  1.先把数字转化为相应的罗马字母,如3999 = MMMDCCCCLXXXXVIIII;

  2.再通过replace()将4和9的情况进行替换,使得3999 = MMMCMXCIX。

 function convert(num) {
var newArr = [];
var newStr;
//先把数字转化为相应的罗马字母
while(num > 0) {
if(num - 1000 >= 0) {
newArr.push('M');
num -= 1000;
} else if (num - 500 >= 0) {
newArr.push('D');
num -= 500;
} else if (num - 100 >= 0) {
newArr.push('C');
num -= 100;
} else if (num - 50 >= 0) {
newArr.push('L');
num -= 50;
} else if(num - 10 >= 0) {
newArr.push('X');
num -= 10;
} else if(num - 5 >= 0) {
newArr.push('V');
num -= 5;
} else if(num - 1 >= 0) {
newArr.push('I');
num -= 1;
}
}
newStr = newArr.join('');
//将4和9的情况进行替换
newStr = newStr.replace(/VI{4}|LX{4}|DC{4}|I{4}|X{4}|C{4}/g, function(match) {
switch(match) {
case 'VIIII':
return "IX";
case 'LXXXX':
return "XC";
case 'DCCCC':
return "CM";
case 'IIII':
return "IV";
case 'XXXX':
return "XL";
case 'CCCC':
return "CD";
}
});
return newStr;
}

测试部分数字:

console.log(convert(3999));    // MMMCMXCIX
console.log(convert(3444));   // MMMCDXLIV
console.log(convert(1234));   // MCCXXXIV 
console.log(convert(83));    // LXXXIII
console.log(convert(123));   // CXXIII

至此,基本功能已经实现了。

另外,用for循环测试了前几千个较小的数,都是能正常转换的,较大的数长度会较长,因为没有对5000,10000等数进行处理。

Javascript--将十进制数字转换成罗马数字显示的更多相关文章

  1. javascript将浮点数转换成整数的三个方法

    浮点数转换成整数方法有很多,本例为大家介绍常用的三个方法,如果读者想到其他好用方法,也可以交流一下   Summary 暂时我就想到3个方法而已.如果读者想到其他好用方法,也可以交流一下 parseI ...

  2. javascript将浮点数转换成整数

    Summary 临时我就想到3个方法而已.假设读者想到其它好用方法,也能够交流一下 parseInt 位运算符 Math.floor Math.ceil Description 一.parseInt ...

  3. JavaScript 将当地时间转换成其它时区

    毫无疑问,用JavaScript脚本可以通过直接查看用户的时钟,方便地在网页上显示本地时间. 但是,如果你想显示不同地区的时间—--例如,如果你的本部在别的国家,你想查看“本国”时间而非当地时间,又该 ...

  4. Javascript中字符串转换成Date的方法

    //字符串转成Time(dateDiff)所需方法 function stringToTime(string) { var f = string.split(' ', 2); var d = (f[0 ...

  5. javaScript将string转换成array,并将汉字按汉语拼音排序方法

    亲测,代码如下: var str = '中华人民共和国民主富强': var arr = str.split("");//字符串装换数组方法一 //arr = str.replace ...

  6. javascript将毫秒转换成hh:mm:ss的形式

    function formatMilliseconds(value) { var second = parseInt(value) / 1000; // second var minute = 0; ...

  7. 用javascript操作xml(二)JavaScript 将XML转换成字符串(xml to string)

    function xmlToString(xmlData) { var xmlString; //IE if (window.ActiveXObject){ xmlString = xmlData.x ...

  8. javaScript中将时间戳转换成日期格式

    function DateFormt(time, format) { ); var o = { , "d+": testDate.getDate(), "h+" ...

  9. javascript 字符数组转换成以逗号隔开的字符串

    var ids = [];angular.forEach(pulsarServers,function (server) { ids.push(server.id);});ids = ids.join ...

随机推荐

  1. Angular入门教程一

    1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟时代潮流,学习掌握新知识自然是不敢怠慢. AngularJS是google在维护,其在国外已经十分火热,可是国内的 ...

  2. C语言指针数组(每个元素都是指针)

    转载:http://c.biancheng.net/cpp/html/3246.html 注意:数组指针的区别 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组.指针数组的定义形式一般 ...

  3. C#--动态加载DLL,通过反射调用参数,方法,窗体

    一些文章: 反射插件插件 http://bbs.csdn.net/topics/391950257?page=1 反射窗体 http://www.sufeinet.com/thread-2984-1- ...

  4. sql server2008安装时提示重启计算机失败怎么办?

    在键盘上按下组合键[Win]+[R],调出运行窗口. 在窗口中输入“regedit”,点击确定,打开注册表管理界面. 在注册表左侧目录栏中找到如下位置:“HKEY_LOCAL_MACHINE\SYST ...

  5. Gitlab installtation

    环境:Centos7 安装配置(安装开启http和sshd): 1 yum -y install curl openssh-server postfix 2 systemctl enable sshd ...

  6. Json转Map

    http = new HttpClient**();//此处封装一下发请求的类 Map<String, String> map = new HashMap<String, Strin ...

  7. CSS边框长度控制

    以前需要边框长度比容器小一些时,我用div嵌套.后来发现伪类在实现这个效果时很方便,只需要一个div就够了,另外调整padding和margin都不会很麻烦. <div class=" ...

  8. LNMP-day2-进阶

    部署LNMP环境 http://www.cnblogs.com/wazy/p/8386493.html 安装部署wordpress #下载wordpress [root@locahost downlo ...

  9. [BZOJ 2763][JLOI 2011] 飞行路线

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3203  Solved: 1223[Submit][Stat ...

  10. 双十一问题:在洪峰数据来临的瞬间,redis出现连接超时异常

    如图所示,在大数据量来袭时,部署服务的机器中存在一台机器突然出现该报错,并且一直持续下去,直到洪峰数据结束也未恢复,重启机器后该问题解决 原因分析: 在请求redis过多时,因为未及时的释放掉redi ...