Frames | No Frames |
1: /* NumberFormat.java -- Formats and parses numbers 2: Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2007, 2012 3: Free Software Foundation, Inc. 4: 5: This file is part of GNU Classpath. 6: 7: GNU Classpath is free software; you can redistribute it and/or modify 8: it under the terms of the GNU General Public License as published by 9: the Free Software Foundation; either version 2, or (at your option) 10: any later version. 11: 12: GNU Classpath is distributed in the hope that it will be useful, but 13: WITHOUT ANY WARRANTY; without even the implied warranty of 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15: General Public License for more details. 16: 17: You should have received a copy of the GNU General Public License 18: along with GNU Classpath; see the file COPYING. If not, write to the 19: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20: 02110-1301 USA. 21: 22: Linking this library statically or dynamically with other modules is 23: making a combined work based on this library. Thus, the terms and 24: conditions of the GNU General Public License cover the whole 25: combination. 26: 27: As a special exception, the copyright holders of this library give you 28: permission to link this library with independent modules to produce an 29: executable, regardless of the license terms of these independent 30: modules, and to copy and distribute the resulting executable under 31: terms of your choice, provided that you also meet, for each linked 32: independent module, the terms and conditions of the license of that 33: module. An independent module is a module which is not derived from 34: or based on this library. If you modify this library, you may extend 35: this exception to your version of the library, but you are not 36: obligated to do so. If you do not wish to do so, delete this 37: exception statement from your version. */ 38: 39: 40: package java.text; 41: 42: import gnu.java.locale.LocaleHelper; 43: 44: import java.io.IOException; 45: import java.io.InvalidObjectException; 46: import java.io.ObjectInputStream; 47: import java.io.ObjectOutputStream; 48: 49: import java.text.spi.NumberFormatProvider; 50: 51: import java.util.Currency; 52: import java.util.Locale; 53: import java.util.MissingResourceException; 54: import java.util.ResourceBundle; 55: import java.util.ServiceLoader; 56: 57: /** 58: * This is the abstract superclass of all classes which format and 59: * parse numeric values such as decimal numbers, integers, currency values, 60: * and percentages. These classes perform their parsing and formatting 61: * in a locale specific manner, accounting for such items as differing 62: * currency symbols and thousands separators. 63: * <p> 64: * To create an instance of a concrete subclass of <code>NumberFormat</code>, 65: * do not call a class constructor directly. Instead, use one of the 66: * static factory methods in this class such as 67: * <code>getCurrencyInstance</code>. 68: * 69: * @author Tom Tromey (tromey@cygnus.com) 70: * @author Aaron M. Renn (arenn@urbanophile.com) 71: * @date March 4, 1999 72: */ 73: /* Written using "Java Class Libraries", 2nd edition, plus online 74: * API docs for JDK 1.2 from http://www.javasoft.com. 75: * Status: Believed complete and correct to 1.2, except getAvailableLocales. 76: */ 77: public abstract class NumberFormat extends Format implements Cloneable 78: { 79: /** 80: * This is a constant used to create a <code>FieldPosition</code> object 81: * that will return the integer portion of a formatted number. 82: */ 83: public static final int INTEGER_FIELD = 0; 84: 85: /** 86: * This is a constant used to create a <code>FieldPosition</code> object 87: * that will return the fractional portion of a formatted number. 88: */ 89: public static final int FRACTION_FIELD = 1; 90: 91: public static class Field extends Format.Field 92: { 93: static final long serialVersionUID = 7494728892700160890L; 94: 95: /** 96: * Attribute set to all characters containing digits of the integer 97: * part. 98: */ 99: public static final NumberFormat.Field INTEGER 100: = new Field("integer"); 101: 102: /** 103: * Attribute set to all characters containing digits of the fractional 104: * part. 105: */ 106: public static final NumberFormat.Field FRACTION 107: = new Field("fraction"); 108: 109: /** 110: * Attribute set to all characters containing digits of the exponential 111: * part. 112: */ 113: public static final NumberFormat.Field EXPONENT 114: = new Field("exponent"); 115: 116: /** 117: * Attribute set to all characters containing a decimal separator. 118: */ 119: public static final NumberFormat.Field DECIMAL_SEPARATOR 120: = new Field("decimal separator"); 121: 122: /** 123: * Attribute set to all characters containing a sign (plus or minus). 124: */ 125: public static final NumberFormat.Field SIGN 126: = new Field("sign"); 127: 128: /** 129: * Attribute set to all characters containing a grouping separator (e.g. 130: * a comma, a white space,...). 131: */ 132: public static final NumberFormat.Field GROUPING_SEPARATOR 133: = new Field("grouping separator"); 134: 135: /** 136: * Attribute set to all characters containing an exponential symbol (e.g. 137: * 'E') 138: */ 139: public static final NumberFormat.Field EXPONENT_SYMBOL 140: = new Field("exponent symbol"); 141: 142: /** 143: * Attribute set to all characters containing a percent symbol (e.g. '%') 144: */ 145: public static final NumberFormat.Field PERCENT 146: = new Field("percent"); 147: 148: /** 149: * Attribute set to all characters containing a permille symbol. 150: */ 151: public static final NumberFormat.Field PERMILLE 152: = new Field("permille"); 153: 154: /** 155: * Attribute set to all characters containing the currency unit. 156: */ 157: public static final NumberFormat.Field CURRENCY 158: = new Field("currency"); 159: 160: /** 161: * Attribute set to all characters containing the exponent sign. 162: */ 163: public static final NumberFormat.Field EXPONENT_SIGN 164: = new Field("exponent sign"); 165: 166: /** 167: * Private fields to register all fields contained in this descriptor. 168: */ 169: private static final NumberFormat.Field[] allFields = 170: { 171: INTEGER, FRACTION, EXPONENT, DECIMAL_SEPARATOR, SIGN, 172: GROUPING_SEPARATOR, EXPONENT_SYMBOL, PERCENT, 173: PERMILLE, CURRENCY, EXPONENT_SIGN 174: }; 175: 176: /** 177: * This constructor is only used by the deserializer. Without it, 178: * it would fail to construct a valid object. 179: */ 180: private Field() 181: { 182: super(""); 183: } 184: 185: /** 186: * Create a Field instance with the specified field name. 187: * 188: * @param field_name Field name for the new Field instance. 189: */ 190: protected Field(String field_name) 191: { 192: super (field_name); 193: } 194: 195: /** 196: * This function is used by the deserializer to know which object 197: * to use when it encounters an encoded NumberFormat.Field in a 198: * serialization stream. If the stream is valid it should return 199: * one of the above field. In the other case we throw an exception. 200: * 201: * @return a valid official NumberFormat.Field instance. 202: * 203: * @throws InvalidObjectException if the field name is invalid. 204: */ 205: protected Object readResolve() throws InvalidObjectException 206: { 207: String s = getName(); 208: for (int i = 0; i < allFields.length; i++) 209: if (s.equals(allFields[i].getName())) 210: return allFields[i]; 211: 212: throw new InvalidObjectException("no such NumberFormat field called " 213: + s); 214: } 215: } 216: 217: /** 218: * This method is a specialization of the format method that performs 219: * a simple formatting of the specified <code>long</code> number. 220: * 221: * @param number The <code>long</code> to format. 222: * 223: * @return The formatted number 224: */ 225: public final String format (long number) 226: { 227: StringBuffer sbuf = new StringBuffer(50); 228: format (number, sbuf, new FieldPosition(0)); 229: return sbuf.toString(); 230: } 231: 232: /** 233: * @specnote this method was final in releases before 1.5 234: */ 235: public StringBuffer format (Object obj, StringBuffer sbuf, 236: FieldPosition pos) 237: { 238: if (obj instanceof Number) 239: return format(((Number) obj).doubleValue(), sbuf, pos); 240: 241: throw new 242: IllegalArgumentException("Cannot format given Object as a Number"); 243: } 244: 245: /** 246: * This method formats the specified <code>double</code> and appends it to 247: * a <code>StringBuffer</code>. 248: * 249: * @param number The <code>double</code> to format. 250: * @param sbuf The <code>StringBuffer</code> to append the formatted number 251: * to. 252: * @param pos The desired <code>FieldPosition</code>. 253: * 254: * @return The <code>StringBuffer</code> with the appended number. 255: */ 256: public abstract StringBuffer format (double number, 257: StringBuffer sbuf, FieldPosition pos); 258: 259: /** 260: * This method formats the specified <code>long</code> and appends it to 261: * a <code>StringBuffer</code>. 262: * 263: * @param number The <code>long</code> to format. 264: * @param sbuf The <code>StringBuffer</code> to append the formatted number 265: * to. 266: * @param pos The desired <code>FieldPosition</code>. 267: * 268: * @return The <code>StringBuffer</code> with the appended number. 269: */ 270: public abstract StringBuffer format (long number, 271: StringBuffer sbuf, FieldPosition pos); 272: 273: /** 274: * This method tests the specified object for equality against this object. 275: * This will be <code>true</code> if the following conditions are met: 276: * <p> 277: * <ul> 278: * <li>The specified object is not <code>null</code>. 279: * <li>The specified object is an instance of <code>NumberFormat</code>. 280: * </ul> 281: * <p> 282: * Since this method does not test much, it is highly advised that 283: * concrete subclasses override this method. 284: * 285: * @param obj The <code>Object</code> to test against equality with 286: * this object. 287: * 288: * @return <code>true</code> if the specified object is equal to 289: * this object, <code>false</code> otherwise. 290: */ 291: public boolean equals (Object obj) 292: { 293: if (! (obj instanceof NumberFormat)) 294: return false; 295: NumberFormat nf = (NumberFormat) obj; 296: return (groupingUsed == nf.groupingUsed 297: && maximumFractionDigits == nf.maximumFractionDigits 298: && maximumIntegerDigits == nf.maximumIntegerDigits 299: && minimumFractionDigits == nf.minimumFractionDigits 300: && minimumIntegerDigits == nf.minimumIntegerDigits 301: && parseIntegerOnly == nf.parseIntegerOnly); 302: } 303: 304: /** 305: * This method returns a list of locales for which concrete instances 306: * of <code>NumberFormat</code> subclasses may be created. 307: * 308: * @return The list of available locales. 309: */ 310: public static Locale[] getAvailableLocales () 311: { 312: Locale[] list = new Locale[1]; 313: list[0] = Locale.US; 314: return list; 315: } 316: 317: private static NumberFormat computeInstance(Locale loc, String resource, 318: String def) 319: throws MissingResourceException 320: { 321: if (loc.equals(Locale.ROOT)) 322: return new DecimalFormat(def, DecimalFormatSymbols.getInstance(loc)); 323: ResourceBundle res = 324: ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", 325: loc, ClassLoader.getSystemClassLoader()); 326: String fmt; 327: try 328: { 329: fmt = res == null ? def : res.getString(resource); 330: } 331: catch (MissingResourceException x) 332: { 333: fmt = def; 334: } 335: DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(loc); 336: return new DecimalFormat (fmt, dfs); 337: } 338: 339: /** 340: * This method returns an instance of <code>NumberFormat</code> suitable 341: * for formatting and parsing currency values in the default locale. 342: * 343: * @return An instance of <code>NumberFormat</code> for handling currencies. 344: */ 345: public static final NumberFormat getCurrencyInstance () 346: { 347: return getCurrencyInstance (Locale.getDefault()); 348: } 349: 350: /** 351: * This method returns an instance of <code>NumberFormat</code> suitable 352: * for formatting and parsing currency values in the specified locale. 353: * 354: * @return An instance of <code>NumberFormat</code> for handling currencies. 355: */ 356: public static NumberFormat getCurrencyInstance (Locale loc) 357: { 358: try 359: { 360: NumberFormat format; 361: 362: format = computeInstance (loc, "currencyFormat", 363: "\u00A4#,##0.00;(\u00A4#,##0.00)"); 364: format.setMaximumFractionDigits(format.getCurrency().getDefaultFractionDigits()); 365: return format; 366: } 367: catch (MissingResourceException e) 368: { 369: for (NumberFormatProvider p : 370: ServiceLoader.load(NumberFormatProvider.class)) 371: { 372: for (Locale l : p.getAvailableLocales()) 373: { 374: if (l.equals(loc)) 375: { 376: NumberFormat nf = p.getCurrencyInstance(loc); 377: if (nf != null) 378: return nf; 379: break; 380: } 381: } 382: } 383: return getCurrencyInstance(LocaleHelper.getFallbackLocale(loc)); 384: } 385: } 386: 387: /** 388: * This method returns a default instance for the default locale. This 389: * will be a concrete subclass of <code>NumberFormat</code>, but the 390: * actual class returned is dependent on the locale. 391: * 392: * @return An instance of the default <code>NumberFormat</code> class. 393: */ 394: public static final NumberFormat getInstance () 395: { 396: return getInstance (Locale.getDefault()); 397: } 398: 399: /** 400: * This method returns a default instance for the specified locale. This 401: * will be a concrete subclass of <code>NumberFormat</code>, but the 402: * actual class returned is dependent on the locale. 403: * 404: * @param loc The desired locale. 405: * 406: * @return An instance of the default <code>NumberFormat</code> class. 407: */ 408: public static NumberFormat getInstance (Locale loc) 409: { 410: // For now always return a number instance. 411: return getNumberInstance (loc); 412: } 413: 414: /** 415: * This method returns the maximum number of digits allowed in the fraction 416: * portion of a number. 417: * 418: * @return The maximum number of digits allowed in the fraction 419: * portion of a number. 420: */ 421: public int getMaximumFractionDigits () 422: { 423: return maximumFractionDigits; 424: } 425: 426: /** 427: * This method returns the maximum number of digits allowed in the integer 428: * portion of a number. 429: * 430: * @return The maximum number of digits allowed in the integer 431: * portion of a number. 432: */ 433: public int getMaximumIntegerDigits () 434: { 435: return maximumIntegerDigits; 436: } 437: 438: /** 439: * This method returns the minimum number of digits allowed in the fraction 440: * portion of a number. 441: * 442: * @return The minimum number of digits allowed in the fraction 443: * portion of a number. 444: */ 445: public int getMinimumFractionDigits () 446: { 447: return minimumFractionDigits; 448: } 449: 450: /** 451: * This method returns the minimum number of digits allowed in the integer 452: * portion of a number. 453: * 454: * @return The minimum number of digits allowed in the integer 455: * portion of a number. 456: */ 457: public int getMinimumIntegerDigits () 458: { 459: return minimumIntegerDigits; 460: } 461: 462: /** 463: * This method returns a default instance for the specified locale. This 464: * will be a concrete subclass of <code>NumberFormat</code>, but the 465: * actual class returned is dependent on the locale. 466: * 467: * @return An instance of the default <code>NumberFormat</code> class. 468: */ 469: public static final NumberFormat getNumberInstance () 470: { 471: return getNumberInstance (Locale.getDefault()); 472: } 473: 474: /** 475: * This method returns a general purpose number formatting and parsing 476: * class for the default locale. This will be a concrete subclass of 477: * <code>NumberFormat</code>, but the actual class returned is dependent 478: * on the locale. 479: * 480: * @return An instance of a generic number formatter for the default locale. 481: */ 482: public static NumberFormat getNumberInstance (Locale loc) 483: { 484: try 485: { 486: return computeInstance (loc, "numberFormat", "#,##0.###"); 487: } 488: catch (MissingResourceException e) 489: { 490: for (NumberFormatProvider p : 491: ServiceLoader.load(NumberFormatProvider.class)) 492: { 493: for (Locale l : p.getAvailableLocales()) 494: { 495: if (l.equals(loc)) 496: { 497: NumberFormat nf = p.getNumberInstance(loc); 498: if (nf != null) 499: return nf; 500: break; 501: } 502: } 503: } 504: return getNumberInstance(LocaleHelper.getFallbackLocale(loc)); 505: } 506: } 507: 508: /** 509: * This method returns an integer formatting and parsing class for the 510: * default locale. This will be a concrete subclass of <code>NumberFormat</code>, 511: * but the actual class returned is dependent on the locale. 512: * 513: * @return An instance of an integer number formatter for the default locale. 514: * @since 1.4 515: */ 516: public static final NumberFormat getIntegerInstance() 517: { 518: return getIntegerInstance (Locale.getDefault()); 519: } 520: 521: /** 522: * This method returns an integer formatting and parsing class for the 523: * default locale. This will be a concrete subclass of <code>NumberFormat</code>, 524: * but the actual class returned is dependent on the locale. 525: * 526: * @param locale the desired locale. 527: * 528: * @return An instance of an integer number formatter for the desired locale. 529: * @since 1.4 530: */ 531: public static NumberFormat getIntegerInstance(Locale locale) 532: { 533: try 534: { 535: NumberFormat format = computeInstance (locale, 536: "integerFormat", "#,##0"); 537: format.setMaximumFractionDigits(0); 538: format.setParseIntegerOnly (true); 539: return format; 540: } 541: catch (MissingResourceException e) 542: { 543: for (NumberFormatProvider p : 544: ServiceLoader.load(NumberFormatProvider.class)) 545: { 546: for (Locale l : p.getAvailableLocales()) 547: { 548: if (l.equals(locale)) 549: { 550: NumberFormat nf = p.getIntegerInstance(locale); 551: if (nf != null) 552: return nf; 553: break; 554: } 555: } 556: } 557: return getIntegerInstance(LocaleHelper.getFallbackLocale(locale)); 558: } 559: } 560: 561: /** 562: * This method returns an instance of <code>NumberFormat</code> suitable 563: * for formatting and parsing percentage values in the default locale. 564: * 565: * @return An instance of <code>NumberFormat</code> for handling percentages. 566: */ 567: public static final NumberFormat getPercentInstance () 568: { 569: return getPercentInstance (Locale.getDefault()); 570: } 571: 572: /** 573: * This method returns an instance of <code>NumberFormat</code> suitable 574: * for formatting and parsing percentage values in the specified locale. 575: * 576: * @param loc The desired locale. 577: * 578: * @return An instance of <code>NumberFormat</code> for handling percentages. 579: */ 580: public static NumberFormat getPercentInstance (Locale loc) 581: { 582: try 583: { 584: return computeInstance (loc, "percentFormat", "#,##0%"); 585: } 586: catch (MissingResourceException e) 587: { 588: for (NumberFormatProvider p : 589: ServiceLoader.load(NumberFormatProvider.class)) 590: { 591: for (Locale l : p.getAvailableLocales()) 592: { 593: if (l.equals(loc)) 594: { 595: NumberFormat nf = p.getPercentInstance(loc); 596: if (nf != null) 597: return nf; 598: break; 599: } 600: } 601: } 602: return getPercentInstance(LocaleHelper.getFallbackLocale(loc)); 603: } 604: } 605: 606: /** 607: * This method returns a hash value for this object. 608: * 609: * @return The hash code. 610: */ 611: public int hashCode () 612: { 613: int hash = super.hashCode(); 614: hash ^= (maximumFractionDigits + maximumIntegerDigits 615: + minimumFractionDigits + minimumIntegerDigits); 616: if (groupingUsed) 617: hash ^= 0xf0f0; 618: if (parseIntegerOnly) 619: hash ^= 0x0f0f; 620: return hash; 621: } 622: 623: /** 624: * This method tests whether or not grouping is in use. Grouping is 625: * a method of marking separations in numbers, such as thousand separators 626: * in the US English locale. The grouping positions and symbols are all 627: * locale specific. As an example, with grouping disabled, the number one 628: * million would appear as "1000000". With grouping enabled, this number 629: * might appear as "1,000,000". (Both of these assume the US English 630: * locale). 631: * 632: * @return <code>true</code> if grouping is enabled, 633: * <code>false</code> otherwise. 634: */ 635: public boolean isGroupingUsed () 636: { 637: return groupingUsed; 638: } 639: 640: /** 641: * This method tests whether or not only integer values should be parsed. 642: * If this class is parsing only integers, parsing stops at the decimal 643: * point. 644: * 645: * @return <code>true</code> if only integers are parsed, 646: * <code>false</code> otherwise. 647: */ 648: public boolean isParseIntegerOnly () 649: { 650: return parseIntegerOnly; 651: } 652: 653: /** 654: * This is a default constructor for use by subclasses. 655: */ 656: protected NumberFormat () 657: { 658: } 659: 660: /** 661: * This method parses the specified string into a <code>Number</code>. This 662: * will be a <code>Long</code> if possible, otherwise it will be a 663: * <code>Double</code>. If no number can be parsed, no exception is 664: * thrown. Instead, the parse position remains at its initial index. 665: * 666: * @param sourceStr The string to parse. 667: * @param pos The desired <code>ParsePosition</code>. 668: * 669: * @return The parsed <code>Number</code> 670: */ 671: public abstract Number parse (String sourceStr, ParsePosition pos); 672: 673: /** 674: * This method parses the specified string into a <code>Number</code>. This 675: * will be a <code>Long</code> if possible, otherwise it will be a 676: * <code>Double</code>. If no number can be parsed, an exception will be 677: * thrown. 678: * 679: * @param sourceStr The string to parse. 680: * 681: * @return The parsed <code>Number</code> 682: * 683: * @exception ParseException If no number can be parsed. 684: */ 685: public Number parse (String sourceStr) throws ParseException 686: { 687: ParsePosition pp = new ParsePosition (0); 688: Number r = parse (sourceStr, pp); 689: if (r == null) 690: { 691: int index = pp.getErrorIndex(); 692: if (index < 0) 693: index = pp.getIndex(); 694: throw new ParseException ("couldn't parse number", index); 695: } 696: return r; 697: } 698: 699: /** 700: * This method parses the specified string into an <code>Object</code>. This 701: * will be a <code>Long</code> if possible, otherwise it will be a 702: * <code>Double</code>. If no number can be parsed, no exception is 703: * thrown. Instead, the parse position remains at its initial index. 704: * 705: * @param sourceStr The string to parse. 706: * @param pos The desired <code>ParsePosition</code>. 707: * 708: * @return The parsed <code>Object</code> 709: */ 710: public final Object parseObject (String sourceStr, ParsePosition pos) 711: { 712: return parse (sourceStr, pos); 713: } 714: 715: /** 716: * This method sets the grouping behavior of this formatter. Grouping is 717: * a method of marking separations in numbers, such as thousand separators 718: * in the US English locale. The grouping positions and symbols are all 719: * locale specific. As an example, with grouping disabled, the number one 720: * million would appear as "1000000". With grouping enabled, this number 721: * might appear as "1,000,000". (Both of these assume the US English 722: * locale). 723: * 724: * @param newValue <code>true</code> to enable grouping, 725: * <code>false</code> to disable it. 726: */ 727: public void setGroupingUsed (boolean newValue) 728: { 729: groupingUsed = newValue; 730: } 731: 732: /** 733: * This method sets the maximum number of digits allowed in the fraction 734: * portion of a number to the specified value. If this is less than the 735: * current minimum allowed digits, the minimum allowed digits value will 736: * be lowered to be equal to the new maximum allowed digits value. 737: * 738: * @param digits The new maximum fraction digits value. 739: */ 740: public void setMaximumFractionDigits (int digits) 741: { 742: maximumFractionDigits = digits; 743: if (getMinimumFractionDigits () > maximumFractionDigits) 744: setMinimumFractionDigits (maximumFractionDigits); 745: } 746: 747: /** 748: * This method sets the maximum number of digits allowed in the integer 749: * portion of a number to the specified value. If this is less than the 750: * current minimum allowed digits, the minimum allowed digits value will 751: * be lowered to be equal to the new maximum allowed digits value. 752: * 753: * @param digits The new maximum integer digits value. 754: */ 755: public void setMaximumIntegerDigits (int digits) 756: { 757: maximumIntegerDigits = digits; 758: if (getMinimumIntegerDigits () > maximumIntegerDigits) 759: setMinimumIntegerDigits (maximumIntegerDigits); 760: } 761: 762: /** 763: * This method sets the minimum number of digits allowed in the fraction 764: * portion of a number to the specified value. If this is greater than the 765: * current maximum allowed digits, the maximum allowed digits value will 766: * be raised to be equal to the new minimum allowed digits value. 767: * 768: * @param digits The new minimum fraction digits value. 769: */ 770: public void setMinimumFractionDigits (int digits) 771: { 772: minimumFractionDigits = digits; 773: if (getMaximumFractionDigits () < minimumFractionDigits) 774: setMaximumFractionDigits (minimumFractionDigits); 775: } 776: 777: /** 778: * This method sets the minimum number of digits allowed in the integer 779: * portion of a number to the specified value. If this is greater than the 780: * current maximum allowed digits, the maximum allowed digits value will 781: * be raised to be equal to the new minimum allowed digits value. 782: * 783: * @param digits The new minimum integer digits value. 784: */ 785: public void setMinimumIntegerDigits (int digits) 786: { 787: minimumIntegerDigits = digits; 788: if (getMaximumIntegerDigits () < minimumIntegerDigits) 789: setMaximumIntegerDigits (minimumIntegerDigits); 790: } 791: 792: /** 793: * This method sets the parsing behavior of this object to parse only 794: * integers or not. 795: * 796: * @param value <code>true</code> to parse only integers, 797: * <code>false</code> otherwise. 798: */ 799: public void setParseIntegerOnly (boolean value) 800: { 801: parseIntegerOnly = value; 802: } 803: 804: /** 805: * This method is a specialization of the format method that performs 806: * a simple formatting of the specified <code>double</code> number. 807: * 808: * @param number The <code>double</code> to format. 809: * 810: * @return The formatted number 811: */ 812: public final String format (double number) 813: { 814: StringBuffer sbuf = new StringBuffer(50); 815: FieldPosition position = new FieldPosition(0); 816: 817: format (number, sbuf, position); 818: return sbuf.toString(); 819: } 820: 821: // These field names are fixed by the serialization spec. 822: boolean groupingUsed; 823: int maximumFractionDigits; 824: private byte maxFractionDigits; 825: int maximumIntegerDigits; 826: private byte maxIntegerDigits; 827: int minimumFractionDigits; 828: private byte minFractionDigits; 829: int minimumIntegerDigits; 830: private byte minIntegerDigits; 831: boolean parseIntegerOnly; 832: private int serialVersionOnStream; 833: private static final long serialVersionUID = -2308460125733713944L; 834: 835: private void readObject(ObjectInputStream stream) 836: throws IOException, ClassNotFoundException 837: { 838: stream.defaultReadObject(); 839: if (serialVersionOnStream < 1) 840: { 841: maximumFractionDigits = maxFractionDigits; 842: maximumIntegerDigits = maxIntegerDigits; 843: minimumFractionDigits = minFractionDigits; 844: minimumIntegerDigits = minIntegerDigits; 845: serialVersionOnStream = 1; 846: } 847: } 848: 849: private void writeObject(ObjectOutputStream stream) throws IOException 850: { 851: maxFractionDigits = maximumFractionDigits < Byte.MAX_VALUE ? 852: (byte) maximumFractionDigits : Byte.MAX_VALUE; 853: maxIntegerDigits = maximumIntegerDigits < Byte.MAX_VALUE ? 854: (byte) maximumIntegerDigits : Byte.MAX_VALUE; 855: minFractionDigits = minimumFractionDigits < Byte.MAX_VALUE ? 856: (byte) minimumFractionDigits : Byte.MAX_VALUE; 857: minIntegerDigits = minimumIntegerDigits < Byte.MAX_VALUE ? 858: (byte) minimumIntegerDigits : Byte.MAX_VALUE; 859: serialVersionOnStream = 1; 860: stream.defaultWriteObject(); 861: } 862: 863: /** 864: * Returns the currency used by this number format when formatting currency 865: * values. 866: * 867: * The default implementation throws UnsupportedOperationException. 868: * 869: * @return The used currency object, or null. 870: * 871: * @throws UnsupportedOperationException If the number format class doesn't 872: * implement currency formatting. 873: * 874: * @since 1.4 875: */ 876: public Currency getCurrency() 877: { 878: throw new UnsupportedOperationException(); 879: } 880: 881: /** 882: * Sets the currency used by this number format when formatting currency 883: * values. 884: * 885: * The default implementation throws UnsupportedOperationException. 886: * 887: * @param currency The new currency to be used by this number format. 888: * 889: * @throws NullPointerException If currenc is null. 890: * @throws UnsupportedOperationException If the number format class doesn't 891: * implement currency formatting. 892: * 893: * @since 1.4 894: */ 895: public void setCurrency(Currency currency) 896: { 897: if (currency == null) 898: throw new NullPointerException("currency may not be null"); 899: 900: throw new UnsupportedOperationException(); 901: } 902: }