decimalformat.java
来自「《移动Agent技术》一书的所有章节源代码。」· Java 代码 · 共 189 行
JAVA
189 行
/*
* @(#)DecimalFormat.java 1.37 98/04/22
*
* (C) Copyright Taligent, Inc. 1996 - All Rights Reserved
* (C) Copyright IBM Corp. 1996 - All Rights Reserved
*
* Portions copyright (c) 1996-1998 Sun Microsystems, Inc. All Rights Reserved.
*
* The original version of this source code and documentation is copyrighted
* and owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These
* materials are provided under terms of a License Agreement between Taligent
* and Sun. This technology is protected by multiple US and International
* patents. This notice and attribution to Taligent may not be removed.
* Taligent is a registered trademark of Taligent, Inc.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* SUN MAKE NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*
*/
package java.text;
import java.util.ResourceBundle;
import java.util.Locale;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Hashtable;
/**
* <code>DecimalFormat</code> is a concrete subclass of <code>NumberFormat</code>
* for formatting decimal numbers. This class allows for a variety
* of parameters, and localization to Western, Arabic, or Indic numbers.
*
* <p>
* Normally, you get the proper <code>NumberFormat</code> for a specific
* locale (including the default locale) using one of <code>NumberFormat</code>'s
* factory methods such as <code>getInstance</code>. You may then modify it
* from there (after testing to make sure it is a <code>DecimalFormat</code>,
* of course!)
*
* <p>
* Either the prefixes or the suffixes must be different for
* the parse to distinguish positive from negative.
* Parsing will be unreliable if the digits, thousands or decimal separators
* are the same, or if any of them occur in the prefixes or suffixes.
*
* <p>
* <strong>Special cases:</strong>
*
* <p>
* <code>NaN</code> is formatted as a single character, typically
* <code>\\uFFFD</code>.
*
* <p>
* +/-Infinity is formatted as a single character, typically <code>\\u221E</code>,
* plus the positive and negative pre/suffixes.
*
* <p><code>Note:</code> this class is designed for common users; for very
* large or small numbers, use a format that can express exponential values.
* <p><strong>Example:</strong>
* <blockquote>
* <pre>
* // normally we would have a GUI with a menu for this
* Locale[] locales = NumberFormat.getAvailableLocales();
*
* double myNumber = -1234.56;
* NumberFormat form;
*
* // just for fun, we print out a number with the locale number, currency
* // and percent format for each locale we can.
* for (int j = 0; j < 3; ++j) {
* System.out.println("FORMAT");
* for (int i = 0; i < locales.length; ++i) {
* if (locales[i].getCountry().length() == 0) {
* // skip language-only
* continue;
* }
* System.out.print(locales[i].getDisplayName());
* switch (j) {
* default:
* form = NumberFormat.getInstance(locales[i]); break;
* case 1:
* form = NumberFormat.getCurrencyInstance(locales[i]); break;
* case 0:
* form = NumberFormat.getPercentInstance(locales[i]); break;
* }
* try {
* System.out.print(": " + ((DecimalFormat)form).toPattern()
* + " -> " + form.format(myNumber));
* } catch (IllegalArgumentException iae) { }
* try {
* System.out.println(" -> " + form.parse(form.format(myNumber)));
* } catch (ParseException pe) { }
* }
* }
* </pre>
* </blockquote>
* <strong>The following shows the structure of the pattern.</strong>
* <pre>
* pattern := subpattern{;subpattern}
* subpattern := {prefix}integer{.fraction}{suffix}
*
* prefix := '\\u0000'..'\\uFFFD' - specialCharacters
* suffix := '\\u0000'..'\\uFFFD' - specialCharacters
* integer := '#'* '0'* '0'
* fraction := '0'* '#'*
*
* Notation:
* X* 0 or more instances of X
* (X | Y) either X or Y.
* X..Y any character from X up to Y, inclusive.
* S - T characters in S, except those in T
* </pre>
* The first subpattern is for positive numbers. The second (optional)
* subpattern is for negative numbers. (In both cases, ',' can occur
* inside the integer portion--it is just too messy to indicate in BNF.)
*
* <p>
* Here are the special characters used in the parts of the
* subpattern, with notes on their usage.
* <pre>
* Symbol Meaning
* 0 a digit
* # a digit, zero shows as absent
* . placeholder for decimal separator
* , placeholder for grouping separator.
* ; separates formats.
* - default negative prefix.
* % multiply by 100 and show as percentage
* \u2030 multiply by 1000 and show as per mille
* \u00A4 currency sign; replaced by currency symbol; if
* doubled, replaced by international currency symbol.
* If present in a pattern, the monetary decimal separator
* is used instead of the decimal separator.
* X any other characters can be used in the prefix or suffix
* ' used to quote special characters in a prefix or suffix.
* </pre>
* <p><strong>Notes</strong>
* <p>
* If there is no explicit negative subpattern, - is prefixed to the
* positive form. That is, "0.00" alone is equivalent to "0.00;-0.00".
* <p>
* Illegal patterns, such as "#.#.#" or mixing '_' and '*' in the
* same pattern, will cause an <code>IllegalArgumentException</code> to be
* thrown. From the message of <code>IllegalArgumentException</code>, you can
* find the place in the string where the error occurred.
*
* <p>
* The grouping separator is commonly used for thousands, but in some
* countries for ten-thousands. The interval is a constant number of
* digits between the grouping characters, such as 100,000,000 or 1,0000,0000.
* If you supply a pattern with multiple grouping characters, the interval
* between the last one and the end of the integer is the one that is
* used. So "#,##,###,####" == "######,####" == "##,####,####".
*
* <p>
* When calling DecimalFormat.parse(String, ParsePosition) and parsing
* fails, a null object will be returned. The unchanged parse position
* also reflects that an error has occurred during parsing. When calling
* the convenient method DecimalFormat.parse(String) and parsing fails,
* a ParseException will be thrown.
* <p>
*
* This class only handles localized digits where the 10 digits
* are contiguous in Unicode, from 0 to 9. Other digits sets
* (such as superscripts) would need a different subclass.
*
* @see java.util.Format
* @see java.util.NumberFormat
* @see java.util.ChoiceFormat
* @version 1.37 04/22/98
* @author Mark Davis
* @author Alan Liu
*/
/*
* Requested Features
* Symbol Meaning
* $ currency symbol as decimal point
*
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?