1 package gnu.text; 2 import java.text.FieldPosition ; 3 import gnu.lists.*; 4 5 public class EnglishIntegerFormat extends java.text.NumberFormat 6 { 8 private static EnglishIntegerFormat cardinalEnglish; 9 private static EnglishIntegerFormat ordinalEnglish; 10 11 public boolean ordinal; 12 13 public EnglishIntegerFormat(boolean ordinal) 14 { 15 this.ordinal = ordinal; 16 } 17 18 public static EnglishIntegerFormat getInstance (boolean ordinal) 19 { 20 if (ordinal) 21 { 22 if (ordinalEnglish == null) 23 ordinalEnglish = new EnglishIntegerFormat(true); 24 return ordinalEnglish; 25 } 26 else 27 { 28 if (cardinalEnglish == null) 29 cardinalEnglish = new EnglishIntegerFormat(false); 30 return cardinalEnglish; 31 } 32 } 33 34 public static final String [] ones = 35 { 36 null, "one", "two", "three", "four", 37 "five", "six", "seven", "eight", "nine", 38 "ten", "eleven", "twelve", "thirteen", "fourteen", 39 "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" 40 }; 41 42 public static final String [] onesth = 43 { 44 null, "first", "second", "third", "fourth", 45 "fifth", "sixth", "seventh", "eighth", "ninth", 46 "tenth", "eleventh", "twelveth", "thirteenth", "fourteenth", 47 "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth" 48 }; 49 50 public static final String [] tens = 51 { 52 null, null, "twenty", "thirty", "forty", 53 "fifty", "sixty", "seventy", "eighty", "ninety" 54 }; 55 56 public static final String [] tensth = 57 { 58 null, null, "twentieth", "thirtieth", "fortieth", 59 "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth" 60 }; 61 62 public static final String [] power1000s = 63 { 64 null, " thousand", " million", " billion", " trillion", " quadrillion", 65 " quintillion", " sextillion", " septillion", " octillion", " nonillion", 66 " decillion", " undecillion", " duodecillion", " tredecillion", 67 " quattuordecillion", " quindecillion", " sexdecillion", 68 " septendecillion", " octodecillion", " novemdecillion", " vigintillion" 69 }; 70 71 74 75 void format999 (StringBuffer sbuf, int num, boolean ordinal) 76 { 77 if (num >= 100) 78 { 79 int num100s = num / 100; 80 num = num % 100; 81 if (num100s > 1) 82 { 83 sbuf.append(ones[num100s]); 84 sbuf.append(' '); 85 } 86 sbuf.append("hundred"); 87 if (num > 0) 88 sbuf.append(' '); 89 else if (ordinal) 90 sbuf.append("th"); 91 } 92 if (num >= 20) 93 { 94 int num10s = num / 10; 95 num = num % 10; 96 sbuf.append((ordinal && num == 0 ? tensth : tens)[num10s]); 97 if (num > 0) 98 sbuf.append('-'); 99 } 100 if (num > 0) 101 { 102 sbuf.append((ordinal ? onesth : ones)[num]); 103 } 104 } 105 106 void format (StringBuffer sbuf, long num, int exp1000, boolean ordinal) 107 { 108 if (num >= 1000) 109 { 110 format(sbuf, num / 1000, exp1000 + 1, false); 111 num = num % 1000; 112 if (num > 0) 113 sbuf.append(", "); 114 else if (ordinal) 115 sbuf.append("th"); 116 } 117 if (num > 0) 118 { 119 format999(sbuf, (int) num, ordinal && exp1000 == 0); 120 if (exp1000 >= power1000s.length) 121 { 122 sbuf.append(" times ten to the "); 123 format(sbuf, exp1000 * 3, 0, true); 124 sbuf.append(" power"); 125 } 126 else if (exp1000 > 0) 127 sbuf.append(power1000s[exp1000]); 128 } 129 } 130 131 public void writeInt (int value, Consumer out) 132 { 133 writeLong(value, out); 134 } 135 136 public void writeLong (long value, Consumer out) 137 { 138 StringBuffer sbuf = new StringBuffer (); 139 format (value, sbuf, null); 140 141 out.write(sbuf, 0, sbuf.length()); 142 143 145 } 146 147 public void writeObject (Object value, Consumer out) 148 { 149 writeLong(((Number ) value).longValue(), out); 150 } 151 152 public void writeBoolean(boolean value, Consumer out) 153 { 154 writeLong(value ? 1 : 0, out); 155 } 156 157 public StringBuffer format(long num, StringBuffer sbuf, FieldPosition fpos) 158 { 159 if (num == 0) 160 sbuf.append(ordinal ? "zeroth" : "zero"); 161 else 162 { 163 if (num < 0) 164 { 165 sbuf.append("minus "); 166 num = - num; } 168 format(sbuf, num, 0, ordinal); 169 } 170 if (fpos != null) 171 { 172 } 174 return sbuf; 175 } 176 177 public StringBuffer format(double num, StringBuffer sbuf, FieldPosition fpos) 178 { 179 long inum = (long) num; 180 if ((double) inum == num) 181 return format(inum, sbuf, fpos); 182 sbuf.append(Double.toString(num)); 183 return sbuf; 184 } 185 186 public java.lang.Number parse(String text, java.text.ParsePosition status) 187 { 188 throw new Error ("EnglishIntegerFormat.parseObject - not implemented"); 189 } 190 } 191 | Popular Tags |