1 4 package gnu.text; 5 import java.text.FieldPosition ; 6 import java.io.Writer ; 7 8 11 12 public class IntegerFormat extends ReportFormat 13 { 14 public int base; 15 16 19 public int minWidth; 20 21 22 public int padChar; 23 24 public int commaChar; 25 public int commaInterval; 26 27 public int flags; 28 29 public static final int SHOW_GROUPS = 1; 30 31 32 public static final int SHOW_PLUS = 2; 33 34 35 public static final int SHOW_SPACE = 4; 36 37 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 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 [] args, int start, 58 Writer dst, FieldPosition fpos) 59 throws java.io.IOException 60 { 61 return format((Object ) args, start, dst, fpos); 62 } 63 64 public int format(Object arg, int start, 65 Writer dst, FieldPosition fpos) 66 throws java.io.IOException 67 { 68 Object [] args = arg instanceof Object [] ? (Object []) 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 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 convertToIntegerString(Object x, int radix) 164 { 165 if (! (x instanceof Number )) 166 return null; 167 else if (x instanceof java.math.BigInteger ) 168 return ((java.math.BigInteger ) x).toString(radix); 169 else 170 return Long.toString(((Number ) x).longValue(), radix); 171 } 172 } 173 | Popular Tags |