1 package gnu.text; 2 import java.text.FieldPosition ; 3 4 public class RomanIntegerFormat extends java.text.NumberFormat 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 codes = "IVXLCDM"; 37 38 public static String format(int num, boolean oldStyle) 39 { 40 if (num <= 0 || num >= 4999) 41 return Integer.toString(num); 42 StringBuffer sbuf = new StringBuffer (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 format(int num) 72 { 73 return format(num, false); 74 } 75 76 public StringBuffer format(long num, StringBuffer sbuf, FieldPosition fpos) 77 { 78 String 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 long tval = 1; 87 int len = str.length(); 88 for (int i = len; --i > 0; ) 89 tval = 10 * tval + 9; 90 StringBuffer tbuf = new StringBuffer (len); 92 new java.text.DecimalFormat ("0").format(tval, tbuf, fpos); 93 } 94 sbuf.append(str); 95 return sbuf; 96 } 97 98 public StringBuffer format(double num, StringBuffer sbuf, FieldPosition 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 parse(String text, java.text.ParsePosition status) 108 { 109 throw new Error ("RomanIntegerFormat.parseObject - not implemented"); 110 } 111 } 112 | Popular Tags |