2
|
1 package edu.unc.utils;
|
|
2
|
|
3 // Rudimentary Class for doing Arabic Integer -> Roman Numeral conversion
|
|
4 // Adapted by Timothy Palpant
|
|
5 // File : gui/componenents/calculators/Roman.java
|
|
6 // Description: A static method for converting binary integers to Roman numbers.
|
|
7 // Illustrates: Static inner value class, StringBuffer, throw exceptions.
|
|
8 // Author : Fred Swartz - 2006-12-29 - Placed in public domain.
|
|
9 public class RomanNumeral {
|
|
10
|
|
11 // This could be alternatively be done with parallel arrays.
|
|
12 // Another alternative would be Pair<Integer, String>
|
|
13 final static RomanValue[] ROMAN_VALUE_TABLE = {
|
|
14 new RomanValue(1000, "M"),
|
|
15 new RomanValue( 900, "CM"),
|
|
16 new RomanValue( 500, "D"),
|
|
17 new RomanValue( 400, "CD"),
|
|
18 new RomanValue( 100, "C"),
|
|
19 new RomanValue( 90, "XC"),
|
|
20 new RomanValue( 50, "L"),
|
|
21 new RomanValue( 40, "XL"),
|
|
22 new RomanValue( 10, "X"),
|
|
23 new RomanValue( 9, "IX"),
|
|
24 new RomanValue( 5, "V"),
|
|
25 new RomanValue( 4, "IV"),
|
|
26 new RomanValue( 1, "I")
|
|
27 };
|
|
28
|
|
29 public static String int2roman(int n) {
|
|
30 if (n >= 4000 || n < 1) {
|
|
31 throw new NumberFormatException("Numbers must be in range 1-3999");
|
|
32 }
|
|
33 StringBuilder result = new StringBuilder(10);
|
|
34
|
|
35 //... Start with largest value, and work toward smallest.
|
|
36 for (RomanValue equiv : ROMAN_VALUE_TABLE) {
|
|
37 //... Remove as many of this value as possible (maybe none).
|
|
38 while (n >= equiv.intVal) {
|
|
39 n -= equiv.intVal; // Subtract value.
|
|
40 result.append(equiv.romVal); // Add roman equivalent.
|
|
41 }
|
|
42 }
|
|
43 return result.toString();
|
|
44 }
|
|
45
|
|
46 private static class RomanValue {
|
|
47 //... No need to make this fields private because they are
|
|
48 // used only in this private value class.
|
|
49 int intVal; // Integer value.
|
|
50 String romVal; // Equivalent roman numeral.
|
|
51
|
|
52 RomanValue(int dec, String rom) {
|
|
53 this.intVal = dec;
|
|
54 this.romVal = rom;
|
|
55 }
|
|
56 }
|
|
57 } |