KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > text > EnglishIntegerFormat


1 package gnu.text;
2 import java.text.FieldPosition JavaDoc;
3 import gnu.lists.*;
4
5 public class EnglishIntegerFormat extends java.text.NumberFormat JavaDoc
6 // or extends AbstractFormat?
7
{
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 JavaDoc[] 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 JavaDoc[] 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 JavaDoc[] tens =
51   {
52     null, null, "twenty", "thirty", "forty",
53     "fifty", "sixty", "seventy", "eighty", "ninety"
54   };
55
56   public static final String JavaDoc[] tensth =
57   {
58     null, null, "twentieth", "thirtieth", "fortieth",
59     "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth"
60   };
61
62   public static final String JavaDoc[] 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   // Inspired by the Slib version, which is inspired
72
// by Bruno Haible's CLisp function format-small-cardinal.
73

74   /** Convert numbers in the range 1 to 998. */
75   void format999 (StringBuffer JavaDoc 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 JavaDoc 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 JavaDoc sbuf = new StringBuffer JavaDoc();
139     format (value, sbuf, null);
140     /* #ifdef use:java.lang.CharSequence */
141     out.write(sbuf, 0, sbuf.length());
142     /* #else */
143     // out.write(sbuf.toString());
144
/* #endif */
145   }
146
147   public void writeObject (Object JavaDoc value, Consumer out)
148   {
149     writeLong(((Number JavaDoc) 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 JavaDoc format(long num, StringBuffer JavaDoc sbuf, FieldPosition JavaDoc 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; // What about -2**31?
167
}
168     format(sbuf, num, 0, ordinal);
169       }
170     if (fpos != null)
171       {
172     // FIXME [using JDK 1.2]
173
}
174     return sbuf;
175   }
176
177   public StringBuffer JavaDoc format(double num, StringBuffer JavaDoc sbuf, FieldPosition JavaDoc 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 JavaDoc parse(String JavaDoc text, java.text.ParsePosition JavaDoc status)
187   {
188     throw new Error JavaDoc("EnglishIntegerFormat.parseObject - not implemented");
189   }
190 }
191
Popular Tags