Javascript--将十进制数字转换成罗马数字显示
下午在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--将十进制数字转换成罗马数字显示的更多相关文章
- javascript将浮点数转换成整数的三个方法
浮点数转换成整数方法有很多,本例为大家介绍常用的三个方法,如果读者想到其他好用方法,也可以交流一下 Summary 暂时我就想到3个方法而已.如果读者想到其他好用方法,也可以交流一下 parseI ...
- javascript将浮点数转换成整数
Summary 临时我就想到3个方法而已.假设读者想到其它好用方法,也能够交流一下 parseInt 位运算符 Math.floor Math.ceil Description 一.parseInt ...
- JavaScript 将当地时间转换成其它时区
毫无疑问,用JavaScript脚本可以通过直接查看用户的时钟,方便地在网页上显示本地时间. 但是,如果你想显示不同地区的时间—--例如,如果你的本部在别的国家,你想查看“本国”时间而非当地时间,又该 ...
- Javascript中字符串转换成Date的方法
//字符串转成Time(dateDiff)所需方法 function stringToTime(string) { var f = string.split(' ', 2); var d = (f[0 ...
- javaScript将string转换成array,并将汉字按汉语拼音排序方法
亲测,代码如下: var str = '中华人民共和国民主富强': var arr = str.split("");//字符串装换数组方法一 //arr = str.replace ...
- javascript将毫秒转换成hh:mm:ss的形式
function formatMilliseconds(value) { var second = parseInt(value) / 1000; // second var minute = 0; ...
- 用javascript操作xml(二)JavaScript 将XML转换成字符串(xml to string)
function xmlToString(xmlData) { var xmlString; //IE if (window.ActiveXObject){ xmlString = xmlData.x ...
- javaScript中将时间戳转换成日期格式
function DateFormt(time, format) { ); var o = { , "d+": testDate.getDate(), "h+" ...
- javascript 字符数组转换成以逗号隔开的字符串
var ids = [];angular.forEach(pulsarServers,function (server) { ids.push(server.id);});ids = ids.join ...
随机推荐
- 自定义动画(仿Win10加载动画)
一.源代码 源代码及demo 二.背景 先看看Win10的加载动画(找了很久才找到): CPA推广甲爪广告联盟满30日结 [点击进入] 甲爪广告联盟,提供各类高单价CPA广告 单价高 收益好 日付广告 ...
- JMeter测试WEB性能入门
一.JMeter介绍 1.Apache JMeter是什么 Apache JMeter 是Apache组织的开放源代码项目,是一个100%纯Java桌面应用,用于压力测试和性能测量.它最初被设计用于W ...
- 通过注解实现Spring 声明式事务管理
小Alan接着上一篇Spring事务管理入门与进阶做一些补充,如果对Spring事务管理还不了解的可以看看上一篇文章. 实例 在我们开始之前,至少有两个数据库表是至关重要的,在事务的帮助下,我们可以实 ...
- bootstrap-table sum总数量统计
写了一个分页要显示数据中所有金额的总数 但是使用 footerformatter 却不知道该怎么赋值 没办法只能放到页脚了 先上个效果图: 这样做要修改源码: bootstrap-table. ...
- .net core系列之《在.net core中使用MemoryCache实现本地缓存》
说到内存缓存MemoryCache不由的让我想起.Net Framework中的MemoryCache,它位于 System.Runtime.Caching 程序集中. 接下来我们来看看.net co ...
- SQLServer数据库执行较大的脚本
当我们需要在SQLServer数据库里面执行一个比较大的文件(比如2GB)时,会发现数据库根本无法打开该脚本文件,原因是因为查询分析器只能执行100M以内的文件,所以脚本过大就会造成内存溢出.下面是具 ...
- java "Too small initial heap" 错误
Tomcat内存配置 JAVA_OPTS="-server -Duser.timezone=GMT+08-Xms1024m -Xmx1024m -XX:PermSize=1024m -Xmn ...
- 【Python学习】Python中的数据类型精度问题
Python真的很神奇...神奇到没有直接的数据类型概念,并且精度可以是任意精度.想当初,第一次接触OI算法时,写得第一个算法就是高精度加法,捣鼓了半天.一切在Python看来,仅仅三行代码即可完成. ...
- 6 Dockerfile指令详解 && ENTRYPOINT 指令
ENTRYPOINT 的格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式. ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数. ENTRYPOINT 在 ...
- Retrieving failed records after an SqlBulkCopy exception
Let me start by saying that the idea I used in this article is not originally mine, but since I have ...