KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > text > IntegerFormat


1 // Copyright (c) 2001, 2003 Per M.A. Bothner.
2
// This is free software; for terms and warranty disclaimer see ./COPYING.
3

4 package gnu.text;
5 import java.text.FieldPosition JavaDoc;
6 import java.io.Writer JavaDoc;
7
8 /** Handle formatting of integers.
9  * Used to implement the Common Lisp ~D (Decimal), ~X (Hexadecimal),
10  * ~O (Octal), ~B (Binary), and ~R (Radix) Common Lisp formats operators. */

11
12 public class IntegerFormat extends ReportFormat
13 {
14   public int base;
15
16   /** Minimal width of the result, includiing sign, commas, etc.
17    * However, if the MIN_DIGITS flag is given, it's the minimum number
18    * of digits instead. This is used for printf-style "precision". */

19   public int minWidth;
20
21   /** The padding characters, by default ' '. */
22   public int padChar;
23
24   public int commaChar;
25   public int commaInterval;
26
27   public int flags;
28   /** Do groups (for example thousands, using commas). */
29   public static final int SHOW_GROUPS = 1;
30
31   /** If value is non-negative, emit a '+'. */
32   public static final int SHOW_PLUS = 2;
33
34   /** If value is non-negative, emit an initial ' '. */
35   public static final int SHOW_SPACE = 4;
36
37   /** Add "0x" (hex) or "0" (octal) prefix. */
38   public static final int SHOW_BASE = 8;
39
40   public static final int PAD_RIGHT = 16;
41
42   public static final int UPPERCASE = 32;
43
44   /** The minWidth is minimum number of digits, not minimum total width. */
45   public static final int MIN_DIGITS = 64;
46
47   public IntegerFormat ()
48   {
49     base = 10;
50     minWidth = 1;
51     padChar = (int) ' ';
52     commaChar = (int) ',';
53     commaInterval = 3;
54     flags = 0;
55   }
56
57   public int format(Object JavaDoc[] args, int start,
58             Writer JavaDoc dst, FieldPosition JavaDoc fpos)
59     throws java.io.IOException JavaDoc
60   {
61     return format((Object JavaDoc) args, start, dst, fpos);
62   }
63
64   public int format(Object JavaDoc arg, int start,
65             Writer JavaDoc dst, FieldPosition JavaDoc fpos)
66     throws java.io.IOException JavaDoc
67   {
68     Object JavaDoc[] args = arg instanceof Object JavaDoc[] ? (Object JavaDoc[]) arg : null;
69     int minWidth = getParam(this.minWidth, 1, args, start);
70     if (this.minWidth == PARAM_FROM_LIST) start++;
71     char padChar = getParam(this.padChar, ' ', args, start);
72     if (this.padChar == PARAM_FROM_LIST) start++;
73     char commaChar = getParam(this.commaChar, ',', args, start);
74     if (this.commaChar == PARAM_FROM_LIST) start++;
75     int commaInterval = getParam(this.commaInterval, 3, args,start);
76     if (this.commaInterval == PARAM_FROM_LIST) start++;
77     boolean printCommas = (flags & SHOW_GROUPS) != 0;
78     boolean padRight = (flags & PAD_RIGHT) != 0;
79     boolean padInternal = padChar == '0';
80     if (args != null)
81       {
82     if (start >= args.length)
83       {
84         dst.write("#<missing format argument>");
85         return start;
86       }
87     arg = args[start];
88       }
89     String JavaDoc sarg = convertToIntegerString(arg, base);
90     if (sarg != null)
91       {
92         char sarg0 = sarg.charAt(0);
93     boolean neg = sarg0 == '-';
94     int slen = sarg.length();
95     int ndigits = neg ? slen - 1 : slen;
96     int numCommas = printCommas ? (ndigits-1)/commaInterval : 0;
97     int unpadded_len = ndigits + numCommas;
98     if (neg || (flags & (SHOW_PLUS|SHOW_SPACE)) != 0)
99       unpadded_len++;
100
101         if ((flags & SHOW_BASE) != 0)
102           {
103             if (base == 16)
104               unpadded_len += 2;
105             else if (base == 8 && sarg0 != '0')
106               unpadded_len += 1;
107           }
108     if ((flags & MIN_DIGITS) != 0)
109       {
110         unpadded_len = ndigits;
111         if (slen == 1 && sarg0 == '0' && minWidth == 0)
112           slen = 0;
113       }
114         if (! padRight && ! padInternal)
115           for (; minWidth > unpadded_len; --minWidth)
116             dst.write(padChar);
117     int i = 0;
118     if (neg)
119       {
120         dst.write('-');
121         i++;
122         slen--;
123       }
124     else if ((flags & SHOW_PLUS) != 0)
125       dst.write('+');
126     else if ((flags & SHOW_SPACE) != 0)
127       dst.write(' ');
128         boolean uppercase = base > 10 && (flags & UPPERCASE) != 0;
129         if ((flags & SHOW_BASE) != 0)
130           {
131             if (base == 16)
132               {
133                 dst.write('0');
134                 dst.write(uppercase ? 'X' : 'x');
135               }
136             else if (base == 8 && sarg0 != '0')
137               dst.write('0');
138           }
139         if (padInternal)
140           for (; minWidth > unpadded_len; --minWidth)
141             dst.write(padChar);
142     for (;;)
143       {
144         if (slen == 0)
145           break;
146             char ch = sarg.charAt(i++);
147             if (uppercase)
148               ch = Character.toUpperCase(ch);
149         dst.write(ch);
150         --slen;
151         if (printCommas && slen > 0 && (slen % commaInterval) == 0)
152           dst.write(commaChar);
153       }
154         if (padRight)
155           for (; minWidth > unpadded_len; --minWidth)
156             dst.write(padChar);
157       }
158     else
159       print(dst, arg.toString());
160     return start + 1;
161   }
162
163   public String JavaDoc convertToIntegerString(Object JavaDoc x, int radix)
164   {
165     if (! (x instanceof Number JavaDoc))
166       return null;
167     else if (x instanceof java.math.BigInteger JavaDoc)
168       return ((java.math.BigInteger JavaDoc) x).toString(radix);
169     else
170       return Long.toString(((Number JavaDoc) x).longValue(), radix);
171   }
172 }
173
Popular Tags