KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > text > RomanIntegerFormat


1 package gnu.text;
2 import java.text.FieldPosition JavaDoc;
3
4 public class RomanIntegerFormat extends java.text.NumberFormat JavaDoc
5 {
6   private static RomanIntegerFormat newRoman;
7   private static RomanIntegerFormat oldRoman;
8
9   public boolean oldStyle;
10
11   public RomanIntegerFormat(boolean oldStyle)
12   {
13     this.oldStyle = oldStyle;
14   }
15
16   public RomanIntegerFormat()
17   {
18   }
19
20   public static RomanIntegerFormat getInstance (boolean oldStyle)
21   {
22     if (oldStyle)
23       {
24     if (oldRoman == null)
25       oldRoman = new RomanIntegerFormat(true);
26     return oldRoman;
27       }
28     else
29       {
30     if (newRoman == null)
31       newRoman = new RomanIntegerFormat(false);
32     return newRoman;
33       }
34   }
35
36   static final String JavaDoc codes = "IVXLCDM";
37
38   public static String JavaDoc format(int num, boolean oldStyle)
39   {
40     if (num <= 0 || num >= 4999)
41       return Integer.toString(num);
42     StringBuffer JavaDoc sbuf = new StringBuffer JavaDoc(20);
43     int power = 3;
44     int unit = 1000;
45     for ( ; power >= 0; unit = unit / 10, power--)
46       {
47     int digit = num / unit;
48     num -= digit * unit;
49     if (digit == 0)
50       continue;
51     if (! oldStyle && (digit == 4 || digit == 9))
52       {
53         sbuf.append(codes.charAt(2 * power));
54         sbuf.append(codes.charAt(2 * power + (digit + 1) / 5));
55         continue;
56       }
57     int rest = digit;
58     if (rest >= 5)
59       {
60         sbuf.append(codes.charAt(2 * power + 1));
61         rest -= 5;
62       }
63     while (--rest >= 0)
64       {
65         sbuf.append(codes.charAt(2 * power));
66       }
67       }
68     return sbuf.toString();
69   }
70
71   public static String JavaDoc format(int num)
72   {
73     return format(num, false);
74   }
75
76   public StringBuffer JavaDoc format(long num, StringBuffer JavaDoc sbuf, FieldPosition JavaDoc fpos)
77   {
78     String JavaDoc str;
79     if (num > 0 && num < (oldStyle ? 4999 : 3999))
80       str = format((int) num, oldStyle);
81     else
82       str = Long.toString(num);
83     if (fpos != null)
84       {
85     // Kludge because FieldPosition fields not settable (in JDK 1.1)!
86
long tval = 1;
87     int len = str.length();
88     for (int i = len; --i > 0; )
89       tval = 10 * tval + 9;
90     // tval now has same number of digits as str
91
StringBuffer JavaDoc tbuf = new StringBuffer JavaDoc(len);
92     new java.text.DecimalFormat JavaDoc("0").format(tval, tbuf, fpos);
93       }
94     sbuf.append(str);
95     return sbuf;
96   }
97
98   public StringBuffer JavaDoc format(double num, StringBuffer JavaDoc sbuf, FieldPosition JavaDoc fpos)
99   {
100     long inum = (long) num;
101     if ((double) inum == num)
102       return format(inum, sbuf, fpos);
103     sbuf.append(Double.toString(num));
104     return sbuf;
105   }
106
107   public java.lang.Number JavaDoc parse(String JavaDoc text, java.text.ParsePosition JavaDoc status)
108   {
109     throw new Error JavaDoc("RomanIntegerFormat.parseObject - not implemented");
110   }
111 }
112
Popular Tags