最近一個項目有這個需求,瑣碎就找找這方面的資料來實現一下,順便就拿來分享之。
什么是羅馬數字?
羅馬數字是最早的數字表示方式,比阿拉伯數字早2000多年,起源於羅馬。如今我們最常見的羅馬數字就是鍾表的表盤符號:
Ⅰ, Ⅱ , Ⅲ ,Ⅳ ,Ⅴ ,Ⅵ ,Ⅶ ,Ⅷ ,Ⅸ ,Ⅹ ,Ⅺ ,Ⅻ ……對應阿拉伯數字(就是現在國際通用的數字),就是1,2,3,4,5,6,7,8,9,10,11,12。阿拉伯數字其實是古代印度人發明的,后來由阿拉伯人傳入歐洲,被歐洲人誤稱為阿拉伯數字。
羅馬數字記數方法
基本字符:
I、V、X、L、C、D、M
相應的阿拉伯數字表示為:
1、5、10、50、100、500、1000
(1)相同的數字連寫,所表示的數等於這些數字相加得到的數,如:Ⅲ = 3;
(2)小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數, 如:Ⅷ = 8;Ⅻ = 12;
(3)小的數字,(限於Ⅰ、X 和C)在大的數字的左邊,所表示的數等於大數減小數得到的數,如:Ⅳ= 4;Ⅸ= 9;
(4)正常使用時,連寫的數字重復不得超過三次。(表盤上的四點鍾“IIII”例外)
(5)在一個數的上面畫一條橫線,表示這個數擴大1000倍。
組數規則
(1)基本數字Ⅰ、X 、C 中的任何一個,自身連用構成數目,或者放在大數的右邊連用構成數目,都不能超過三個;放在大數的左邊只能用一個。
(2)不能把基本數字V 、L 、D 中的任何一個作為小數放在大數的左邊采用相減的方法構成數目;放在大數的右邊采用相加的方式構成數目,只能使用一個。
(3)V 和X 左邊的小數字只能用Ⅰ。
(4)L 和C 左邊的小數字只能用X。
(5)D 和M 左邊的小數字只能用C。
算法實現
代碼是用JS實現的,干貨如下:
Arabit2Roman: function(arabic){ var alpha:[ 'I', 'V', 'X', 'L', 'C', 'D', 'M' ]; var roman=""; var bit = 0; while (arabic > 0) { var tempnum = arabic % 10; switch (tempnum) { case 3: { roman=this.alpha[bit]+roman; tempnum--; } case 2: { roman=this.alpha[bit]+roman; tempnum--; } case 1: { roman=this.alpha[bit]+roman; break; } case 4: { roman=this.alpha[bit + 1]+roman; roman=this.alpha[bit]+roman; break; } case 8: { roman=this.alpha[bit]+roman; tempnum--; } case 7: { roman=this.alpha[bit]+roman; tempnum--; } case 6: { roman=this.alpha[bit]+roman; tempnum--; } case 5: { roman=this.alpha[bit + 1]+roman; break; } case 9: { roman=this.alpha[bit + 2]+roman; roman=this.alpha[bit]+roman; break; } default: { break; } } bit += 2; arabic = Math.floor(arabic / 10); } return roman; }