Java/Data Type/Number Format
Содержание
- 1 A custom number formatter that formats numbers as hexadecimal strings.
- 2 Add leading zeroes to a number
- 3 A number formatter for logarithmic values. This formatter does not support parsing.
- 4 Create a table of squares and cubes.
- 5 Decimal Format Demo
- 6 Default rounding mode
- 7 demonstrates the minimum field-width specifier by applying it to the %f conversion:
- 8 demonstrates the %n and %% format specifiers:
- 9 Demonstrate the space format specifiers.
- 10 Displaying numbers with commas
- 11 Display numbers in scientific notation
- 12 Format a number for a locale
- 13 Format a number our way and the default way
- 14 Format a number to currency
- 15 Format a number with DecimalFormat
- 16 Format a number with leading zeroes
- 17 Format for GERMAN locale
- 18 Format for the default locale
- 19 Formatting and Parsing a Locale-Specific Percentage
- 20 Formatting and Parsing a Number for a Locale
- 21 Formatting and Parsing Locale-Specific Currency
- 22 Formatting a Number in Exponential Notation
- 23 left justification: left justify
- 24 left justification: Right justify by default
- 25 NumberFormat and locale
- 26 Number Format by locale
- 27 Number format viewer
- 28 NumberFormat with Constant Locale Usage
- 29 Number Format with Locale
- 30 Parse a GERMAN number
- 31 Parse a number for a locale
- 32 Parse a number with NumberFormat and Locale.CANADA
- 33 Parse number with NumberFormat and Locale
- 34 precision modifier: Display at most 15 characters in a string
- 35 precision modifier: Format 4 decimal places
- 36 precision modifier: Format to 2 decimal places in a 16 character field
- 37 RoundingMode.CEILING
- 38 RoundingMode.FLOOR
- 39 RoundingMode.HALF_DOWN
- 40 The Format Specifiers
- 41 the NumberFormat object is created once when the program starts.
- 42 The Uppercase Option
- 43 Use grouping to display a number
- 44 Using an Argument Index
- 45 Using only 0"s to the left of E forces no decimal point
- 46 Using the Format Flags
A custom number formatter that formats numbers as hexadecimal strings.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * -------------------- * HexNumberFormat.java * -------------------- * (C) Copyright 2007, 2008, by Richard West and Contributors. * * Original Author: Richard West, Advanced Micro Devices, Inc.; * Contributor(s): David Gilbert (for Object Refinery Limited); * * Changes: * -------- * 14-Jun-2007 : Version 1 (RW); * */
import java.text.FieldPosition; import java.text.NumberFormat; import java.text.ParsePosition; /**
* A custom number formatter that formats numbers as hexadecimal strings. * There are some limitations, so be careful using this class. * * @since 1.0.6 */
public class HexNumberFormat extends NumberFormat {
/** Number of hexadecimal digits for a byte. */ public static final int BYTE = 2; /** Number of hexadecimal digits for a word. */ public static final int WORD = 4; /** Number of hexadecimal digits for a double word. */ public static final int DWORD = 8; /** Number of hexadecimal digits for a quad word. */ public static final int QWORD = 16; /** The number of digits (shorter strings will be left padded). */ private int m_numDigits = DWORD; /** * Creates a new instance with 8 digits. */ public HexNumberFormat() { this(DWORD); } /** * Creates a new instance with the specified number of digits. * @param digits the digits. */ public HexNumberFormat(int digits) { super(); this.m_numDigits = digits; } /** * Returns the number of digits. * * @return The number of digits. */ public final int getNumberOfDigits() { return this.m_numDigits; } /** * Sets the number of digits. * * @param digits the number of digits. */ public void setNumberOfDigits(int digits) { this.m_numDigits = digits; } /** * Formats the specified number as a hexadecimal string. The decimal * fraction is ignored. * * @param number the number to format. * @param toAppendTo the buffer to append to (ignored here). * @param pos the field position (ignored here). * * @return The string buffer. */ public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { return format((long) number, toAppendTo, pos); } /** * Formats the specified number as a hexadecimal string. The decimal * fraction is ignored. * * @param number the number to format. * @param toAppendTo the buffer to append to (ignored here). * @param pos the field position (ignored here). * * @return The string buffer. */ public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) { String l_hex = Long.toHexString(number).toUpperCase(); int l_pad = this.m_numDigits - l_hex.length(); l_pad = (0 < l_pad) ? l_pad : 0; StringBuffer l_extended = new StringBuffer("0x"); for (int i = 0; i < l_pad; i++) { l_extended.append(0); } l_extended.append(l_hex); return l_extended; } /** * Parsing is not implemented, so this method always returns *null
. * * @param source ignored. * @param parsePosition ignored. * * @return Alwaysnull
. */ public Number parse (String source, ParsePosition parsePosition) { return null; // don"t bother with parsing }
}
</source>
Add leading zeroes to a number
<source lang="java">
public class Main {
public static void main(String[] args) { int number = 1500; String formatted = String.format("%07d", number); System.out.println("Number with leading zeros: " + formatted); }
}
</source>
A number formatter for logarithmic values. This formatter does not support parsing.
<source lang="java">
/*
* JFreeChart : a free chart library for the Java(tm) platform * * * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * -------------- * LogFormat.java * -------------- * (C) Copyright 2007-2009, by Object Refinery Limited and Contributors. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; * * Changes * ------- * 02-Aug-2007 : Version 1 (DG); * 19-Feb-2008 : Implemented equals() and clone(), and added new powerLabel * attribute as per Feature Request 1886036 (DG); * 14-Jan-2009 : Added default constructor, and accessor methods for * exponent formatter (DG); * */
import java.text.DecimalFormat; import java.text.FieldPosition; import java.text.NumberFormat; import java.text.ParsePosition; /**
* A number formatter for logarithmic values. This formatter does not support * parsing. * * @since 1.0.7 */
public class LogFormat extends NumberFormat {
/** The log base value. */ private double base; /** The natural logarithm of the base value. */ private double baseLog; /** The label for the log base (for example, "e"). */ private String baseLabel; /** * The label for the power symbol. * * @since 1.0.10 */ private String powerLabel; /** A flag that controls whether or not the base is shown. */ private boolean showBase; /** The number formatter for the exponent. */ private NumberFormat formatter = new DecimalFormat("0.0#"); /** * Creates a new instance using base 10. * * @since 1.0.13 */ public LogFormat() { this(10.0, "10", true); } /** * Creates a new instance. * * @param base the base. * @param baseLabel the base label (null
not permitted). * @param showBase a flag that controls whether or not the base value is * shown. */ public LogFormat(double base, String baseLabel, boolean showBase) { this(base, baseLabel, "^", showBase); } /** * Creates a new instance. * * @param base the base. * @param baseLabel the base label (null
not permitted). * @param powerLabel the power label (null
not permitted). * @param showBase a flag that controls whether or not the base value is * shown. * * @since 1.0.10 */ public LogFormat(double base, String baseLabel, String powerLabel, boolean showBase) { if (baseLabel == null) { throw new IllegalArgumentException("Null "baseLabel" argument."); } if (powerLabel == null) { throw new IllegalArgumentException("Null "powerLabel" argument."); } this.base = base; this.baseLog = Math.log(this.base); this.baseLabel = baseLabel; this.showBase = showBase; this.powerLabel = powerLabel; } /** * Returns the number format used for the exponent. * * @return The number format (nevernull
). * * @since 1.0.13. */ public NumberFormat getExponentFormat() { return (NumberFormat) this.formatter.clone(); } /** * Sets the number format used for the exponent. * * @param format the formatter (null
not permitted). * * @since 1.0.13 */ public void setExponentFormat(NumberFormat format) { if (format == null) { throw new IllegalArgumentException("Null "format" argument."); } this.formatter = format; } /** * Calculates the log of a given value. * * @param value the value. * * @return The log of the value. */ private double calculateLog(double value) { return Math.log(value) / this.baseLog; } /** * Returns a formatted representation of the specified number. * * @param number the number. * @param toAppendTo the string buffer to append to. * @param pos the position. * * @return A string buffer containing the formatted value. */ public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { StringBuffer result = new StringBuffer(); if (this.showBase) { result.append(this.baseLabel); result.append(this.powerLabel); } result.append(this.formatter.format(calculateLog(number))); return result; } /** * Formats the specified number as a hexadecimal string. The decimal * fraction is ignored. * * @param number the number to format. * @param toAppendTo the buffer to append to (ignored here). * @param pos the field position (ignored here). * * @return The string buffer. */ public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) { StringBuffer result = new StringBuffer(); if (this.showBase) { result.append(this.baseLabel); result.append("^"); } result.append(this.formatter.format(calculateLog(number))); return result; } /** * Parsing is not implemented, so this method always returns *null
. * * @param source ignored. * @param parsePosition ignored. * * @return Alwaysnull
. */ public Number parse (String source, ParsePosition parsePosition) { return null; // don"t bother with parsing } /** * Tests this formatter for equality with an arbitrary object. * * @param obj the object (null
permitted). * * @return A boolean. */ public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof LogFormat)) { return false; } LogFormat that = (LogFormat) obj; if (this.base != that.base) { return false; } if (!this.baseLabel.equals(that.baseLabel)) { return false; } if (this.baseLog != that.baseLog) { return false; } if (this.showBase != that.showBase) { return false; } if (!this.formatter.equals(that.formatter)) { return false; } return super.equals(obj); } /** * Returns a clone of this instance. * * @return A clone. */ public Object clone() { LogFormat clone = (LogFormat) super.clone(); clone.formatter = (NumberFormat) this.formatter.clone(); return clone; }
}
</source>
Create a table of squares and cubes.
<source lang="java">
import java.util.Formatter; class FieldWidthDemo {
public static void main(String args[]) { Formatter fmt; for (int i = 1; i <= 10; i++) { fmt = new Formatter(); fmt.format("%4d %4d %4d", i, i * i, i * i * i); System.out.println(fmt); } }
}
</source>
Decimal Format Demo
<source lang="java">
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
import java.awt.Color; import java.awt.ruponent; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.ParseException; import java.util.Locale; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class DecimalFormatDemo extends JPanel {
static JFrame frame; JLabel result; NumberFormat inputFormatter; String currentPattern; double currentNumber = 123.45; LocaleGroup availableLocales; public DecimalFormatDemo() { availableLocales = new LocaleGroup(); inputFormatter = NumberFormat.getNumberInstance(); String[] patternExamples = { "##.##", "###,###.##", "##,##,##.##", "#", "000,000.0000", "##.0000", ""hello"###.##" }; currentPattern = patternExamples[0]; // Set up the UI for entering a number. JLabel numberLabel = new JLabel("Enter the number to format:"); numberLabel.setAlignmentX(Component.LEFT_ALIGNMENT); JTextField numberField = new JTextField(); numberField.setEditable(true); numberField.setAlignmentX(Component.LEFT_ALIGNMENT); NumberListener numberListener = new NumberListener(); numberField.addActionListener(numberListener); // Set up the UI for selecting a pattern. JLabel patternLabel1 = new JLabel("Enter the pattern string or"); JLabel patternLabel2 = new JLabel("select one from the list:"); patternLabel1.setAlignmentX(Component.LEFT_ALIGNMENT); patternLabel2.setAlignmentX(Component.LEFT_ALIGNMENT); JComboBox patternList = new JComboBox(patternExamples); patternList.setSelectedIndex(0); patternList.setEditable(true); patternList.setAlignmentX(Component.LEFT_ALIGNMENT); PatternListener patternListener = new PatternListener(); patternList.addActionListener(patternListener); // Set up the UI for selecting a locale. JLabel localeLabel = new JLabel("Select a Locale from the list:"); localeLabel.setAlignmentX(Component.LEFT_ALIGNMENT); JComboBox localeList = new JComboBox(availableLocales.getStrings()); localeList.setSelectedIndex(0); localeList.setAlignmentX(Component.LEFT_ALIGNMENT); LocaleListener localeListener = new LocaleListener(); localeList.addActionListener(localeListener); // Create the UI for displaying result. JLabel resultLabel = new JLabel("Result", JLabel.LEFT); resultLabel.setAlignmentX(Component.LEFT_ALIGNMENT); result = new JLabel(" "); result.setForeground(Color.black); result.setAlignmentX(Component.LEFT_ALIGNMENT); result.setBorder(BorderFactory.createCompoundBorder(BorderFactory .createLineBorder(Color.black), BorderFactory.createEmptyBorder(5, 5, 5, 5))); // Lay out everything JPanel numberPanel = new JPanel(); numberPanel.setLayout(new GridLayout(0, 1)); numberPanel.add(numberLabel); numberPanel.add(numberField); JPanel patternPanel = new JPanel(); patternPanel.setLayout(new BoxLayout(patternPanel, BoxLayout.Y_AXIS)); patternPanel.add(patternLabel1); patternPanel.add(patternLabel2); patternPanel.add(patternList); JPanel localePanel = new JPanel(); localePanel.setLayout(new BoxLayout(localePanel, BoxLayout.Y_AXIS)); localePanel.add(localeLabel); localePanel.add(localeList); JPanel resultPanel = new JPanel(); resultPanel.setLayout(new GridLayout(0, 1)); resultPanel.add(resultLabel); resultPanel.add(result); setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); patternPanel.setAlignmentX(Component.CENTER_ALIGNMENT); numberPanel.setAlignmentX(Component.CENTER_ALIGNMENT); localePanel.setAlignmentX(Component.CENTER_ALIGNMENT); resultPanel.setAlignmentX(Component.CENTER_ALIGNMENT); add(numberPanel); add(Box.createVerticalStrut(10)); add(patternPanel); add(Box.createVerticalStrut(10)); add(localePanel); add(Box.createVerticalStrut(10)); add(resultPanel); setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); reformat(); numberField.setText(result.getText()); } // constructor /** Listens to the pattern combo box. */ class PatternListener implements ActionListener { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox) e.getSource(); String newSelection = (String) cb.getSelectedItem(); currentPattern = newSelection; reformat(); } } /** Listens to the number field. */ class NumberListener implements ActionListener { public void actionPerformed(ActionEvent evt) { JTextField inputField = (JTextField) evt.getSource(); try { Number value = inputFormatter.parse(inputField.getText()); currentNumber = value.doubleValue(); reformat(); } catch (ParseException pe) { result.setForeground(Color.red); result.setText("Illegal Number: " + pe.getMessage()); } } } /** Listens to the locale combo box. */ class LocaleListener implements ActionListener { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox) e.getSource(); int index = cb.getSelectedIndex(); availableLocales.setCurrent(index); reformat(); } } /** Manages information about locales for this application. */ class LocaleGroup { Locale currentLocale; Locale[] supportedLocales = { Locale.US, Locale.GERMANY, Locale.FRANCE // Add other locales here, if desired. }; public LocaleGroup() { currentLocale = supportedLocales[0]; } public void setCurrent(int index) { currentLocale = supportedLocales[index]; } public Locale getCurrent() { return currentLocale; } public String[] getStrings() { String[] localeNames = new String[supportedLocales.length]; for (int k = 0; k < supportedLocales.length; k++) { localeNames[k] = supportedLocales[k].getDisplayName(); } return localeNames; } } /** Reformats the input number and displays result. */ public void reformat() { try { NumberFormat nf = NumberFormat.getNumberInstance(availableLocales .getCurrent()); DecimalFormat df = (DecimalFormat) nf; df.applyPattern(currentPattern); result.setForeground(Color.black); result.setText(df.format(currentNumber)); } catch (IllegalArgumentException iae) { result.setForeground(Color.red); result.setText("Illegal Pattern: " + iae.getMessage()); } } public static void main(String s[]) { WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; frame = new JFrame("DecimalFormat Demo"); frame.addWindowListener(l); frame.getContentPane().add("Center", new DecimalFormatDemo()); frame.pack(); frame.setVisible(true); }
}
</source>
Default rounding mode
<source lang="java">
import java.math.RoundingMode; import java.text.NumberFormat; public class NumberFormatRounding {
public static void main(String[] args) { NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(2); System.out.println("Default rounding mode: " + nf.getRoundingMode()); System.out.println("123.454 rounds to " + nf.format(123.454)); System.out.println("123.455 rounds to " + nf.format(123.455)); System.out.println("123.456 rounds to " + nf.format(123.456)); System.out.println(); }
}
</source>
demonstrates the minimum field-width specifier by applying it to the %f conversion:
<source lang="java">
// Demonstrate a field-width specifier. import java.util.Formatter; class FormatDemo4 {
public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("|%f|%n|%12f|%n|%012f|", 10.12345, 10.12345, 10.12345); System.out.println(fmt); }
}
</source>
demonstrates the %n and %% format specifiers:
<source lang="java">
import java.util.Formatter; class FormatDemo3 {
public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("Copying file%nTransfer is %d%% complete", 88); System.out.println(fmt); }
}
</source>
Demonstrate the space format specifiers.
<source lang="java">
import java.util.Formatter; public class MainClass {
public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("% d", -100); System.out.println(fmt); fmt = new Formatter(); fmt.format("% d", 100); System.out.println(fmt); fmt = new Formatter(); fmt.format("% d", -200); System.out.println(fmt); fmt = new Formatter(); fmt.format("% d", 200); System.out.println(fmt); }
} /* -100
100
-200
200*/ </source>
Displaying numbers with commas
<source lang="java">
import java.text.DecimalFormat; public class Main {
public static void main(String args[]) { double d = 123456.78; DecimalFormat df = new DecimalFormat("#####0.00"); System.out.println(df.format(d)); }
}
</source>
Display numbers in scientific notation
<source lang="java">
import java.text.DecimalFormat; import java.text.NumberFormat; public class Main {
public static void main(String args[]) { NumberFormat formatter = new DecimalFormat(); int maxinteger = Integer.MAX_VALUE; System.out.println(maxinteger); formatter = new DecimalFormat("0.######E0"); System.out.println(formatter.format(maxinteger)); formatter = new DecimalFormat("0.#####E0"); System.out.println(formatter.format(maxinteger)); int mininteger = Integer.MIN_VALUE; System.out.println(mininteger); formatter = new DecimalFormat("0.######E0"); System.out.println(formatter.format(mininteger)); formatter = new DecimalFormat("0.#####E0"); System.out.println(formatter.format(mininteger)); double d = 0.12345; formatter = new DecimalFormat("0.#####E0"); System.out.println(formatter.format(d)); formatter = new DecimalFormat("000000E0"); System.out.println(formatter.format(d)); }
}
</source>
Format a number for a locale
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; public class Main {
public static void main(String[] args) throws Exception { NumberFormat formatter = NumberFormat.getNumberInstance(Locale.ITALY); String number = formatter.format(123456789.12); System.out.println("Number in Italy: " + number); formatter = NumberFormat.getNumberInstance(Locale.JAPAN); number = formatter.format(123456789.12); System.out.println("Number in Japan: " + number); }
}
</source>
Format a number our way and the default way
<source lang="java">
import java.text.NumberFormat; /*
* Format a number our way and the default way. */
public class NumFormat2 {
/** A number to format */ public static final double data[] = { 0, 1, 22d/7, 100.2345678 }; /** The main (and only) method in this class. */ public static void main(String[] av) { // Get a format instance NumberFormat form = NumberFormat.getInstance(); // Set it to look like 999.99[99] form.setMinimumIntegerDigits(3); form.setMinimumFractionDigits(2); form.setMaximumFractionDigits(4); // Now print using it. for (int i=0; i<data.length; i++) System.out.println(data[i] + "\tformats as " + form.format(data[i])); }
}
</source>
Format a number to currency
<source lang="java">
import java.text.NumberFormat; public class Mortgage {
public static void main(String[] args) { double payment = Math.random() * 1000; System.out.println("Your payment is "); NumberFormat nf = NumberFormat.getCurrencyInstance(); System.out.println(nf.format(payment)); }
}
</source>
Format a number with DecimalFormat
<source lang="java">
import java.text.DecimalFormat; import java.text.NumberFormat; public class Main {
public static void main(String[] args) { double money = 123456789.12; NumberFormat formatter = new DecimalFormat("#0.00"); System.out.println(money); System.out.println(formatter.format(money)); }
}
</source>
Format a number with leading zeroes
<source lang="java">
import java.text.DecimalFormat; import java.text.NumberFormat; public class Main {
public static void main(String[] args) { NumberFormat formatter = new DecimalFormat("0000000"); String number = formatter.format(2500); System.out.println("Number with lading zeros: " + number); }
}
</source>
Format for GERMAN locale
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; public class Main {
public static void main(String[] argv) throws Exception { Locale locale = Locale.GERMAN; String string = NumberFormat.getNumberInstance(locale).format(-1234.56); System.out.println(string); }
} //-1.234,56
</source>
Format for the default locale
<source lang="java">
import java.text.NumberFormat; public class Main {
public static void main(String[] argv) throws Exception { String string = NumberFormat.getNumberInstance().format(-1234.56); System.out.println(string); }
} //-1,234.56
</source>
Formatting and Parsing a Locale-Specific Percentage
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; public class Main {
public static void main(String[] argv) throws Exception { // Format Locale locale = Locale.CANADA; String string = NumberFormat.getPercentInstance(locale).format(123.45); }
} // 12,345%
</source>
Formatting and Parsing a Number for a Locale
<source lang="java">
Format for CANADA locale import java.text.NumberFormat; import java.util.Locale; public class Main {
public static void main(String[] argv) throws Exception { Locale locale = Locale.CANADA; String string = NumberFormat.getNumberInstance(locale).format(-1234.56); System.out.println(string); }
} //-1,234.56
</source>
Formatting and Parsing Locale-Specific Currency
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; public class Main {
public static void main(String[] argv) throws Exception { // Format Locale locale = Locale.GERMANY; String string = NumberFormat.getCurrencyInstance(locale).format(123.45); }
} // 123,45 DM
</source>
Formatting a Number in Exponential Notation
<source lang="java">
The "E" symbol specifies that a number should be formatted in exponential notation. E symbol separates the mantissa from the exponent. E symbol must be followed by one or more "0" symbols. The number of "0" symbols specifies the minimum number of digits used to display the exponent.
</source>
left justification: left justify
<source lang="java">
import java.util.Formatter; public class MainClass {
public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("|%-10.2f|", 123.123); System.out.println(fmt); }
} //|123.12 |
</source>
left justification: Right justify by default
<source lang="java">
import java.util.Formatter; public class MainClass {
public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("|%10.2f|", 123.123); System.out.println(fmt); }
} //| 123.12|
</source>
NumberFormat and locale
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; public class Main {
public static void main(String[] args) { double value = 1234567.89; System.out.println("Unformatted: " + value + "\n"); Locale locales[] = { Locale.US, Locale.FRANCE, Locale.GERMANY, Locale.JAPAN, new Locale("fr", "FR", "EURO"), new Locale("de", "DE", "EURO") }; for (int i = 0; i < locales.length; i++) { NumberFormat nf = NumberFormat.getCurrencyInstance(locales[i]); System.out.println("Formatted for " + locales[i] + ": " + nf.format(value)); } }
}
</source>
Number Format by locale
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; class NumberFormatApp {
public static void main(String args[]) { NumberFormat format = NumberFormat.getCurrencyInstance(Locale.getDefault()); String formattedCurrency = format.format(1000000); System.out.println(formattedCurrency); }
}
</source>
Number format viewer
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; public class NumberViewer extends JPanel {
protected AbstractTableModel tableModel; protected double currentValue = 1234567.89d; protected final static Locale[] availableLocales; static { availableLocales = Locale.getAvailableLocales(); } public final static int LOCALE_COLUMN = 0; public final static int NUMBER_COLUMN = 1; public final static int CURRENCY_COLUMN = 2; public final static int PERCENT_COLUMN = 3; public final static String[] columnHeaders = { "Locale", "Numeric", "Currency", "Percent" }; public static void main(String[] args) { JFrame f = new JFrame("Number Viewer"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(new NumberViewer()); f.pack(); f.setVisible(true); } public NumberViewer() { tableModel = new LocaleTableModel(); JTable table = new JTable(tableModel); add(new JScrollPane(table)); } class LocaleTableModel extends AbstractTableModel { public int getRowCount() { return availableLocales.length; } public int getColumnCount() { return columnHeaders.length; } public Object getValueAt(int row, int column) { Locale locale = availableLocales[row]; NumberFormat formatter = NumberFormat.getNumberInstance(); switch (column) { case LOCALE_COLUMN: return locale.getDisplayName(); case NUMBER_COLUMN: formatter = NumberFormat.getNumberInstance(locale); break; case CURRENCY_COLUMN: formatter = NumberFormat.getCurrencyInstance(locale); break; case PERCENT_COLUMN: formatter = NumberFormat.getPercentInstance(locale); break; } return formatter.format(currentValue); } public String getColumnName(int column) { return columnHeaders[column]; } }
}
</source>
NumberFormat with Constant Locale Usage
<source lang="java">
import java.text.NumberFormat; import java.text.ParseException; import java.util.Locale; public class ConstantLocaleUsage {
public static void main(String[] argv) { NumberFormat numberFormat = NumberFormat.getInstance(); numberFormat.setParseIntegerOnly(false); double usersNumber; if (argv.length == 1) try { usersNumber = numberFormat.parse(argv[0]).doubleValue(); } catch (ParseException e) { usersNumber = 197912.29; } else usersNumber = 1976.0826; numberFormat = NumberFormat.getNumberInstance(Locale.US); System.out.println("User"s number (US): " + numberFormat.format(usersNumber)); numberFormat = NumberFormat.getNumberInstance(Locale.GERMANY); System.out.println("User"s number (GERMANY): " + numberFormat.format(usersNumber)); numberFormat = NumberFormat.getNumberInstance(); System.out.println("User"s number (DEFAULT LOCALE): " + numberFormat.format(usersNumber)); }
}
</source>
Number Format with Locale
<source lang="java">
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
import java.text.NumberFormat; import java.util.Locale; public class NumberFormatDemo {
static public void displayNumber(Locale currentLocale) { Integer quantity = new Integer(123456); Double amount = new Double(345987.246); NumberFormat numberFormatter; String quantityOut; String amountOut; numberFormatter = NumberFormat.getNumberInstance(currentLocale); quantityOut = numberFormatter.format(quantity); amountOut = numberFormatter.format(amount); System.out.println(quantityOut + " " + currentLocale.toString()); System.out.println(amountOut + " " + currentLocale.toString()); } static public void displayCurrency(Locale currentLocale) { Double currency = new Double(9876543.21); NumberFormat currencyFormatter; String currencyOut; currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale); currencyOut = currencyFormatter.format(currency); System.out.println(currencyOut + " " + currentLocale.toString()); } static public void displayPercent(Locale currentLocale) { Double percent = new Double(0.75); NumberFormat percentFormatter; String percentOut; percentFormatter = NumberFormat.getPercentInstance(currentLocale); percentOut = percentFormatter.format(percent); System.out.println(percentOut + " " + currentLocale.toString()); } static public void main(String[] args) { Locale[] locales = { new Locale("fr", "FR"), new Locale("de", "DE"), new Locale("en", "US") }; for (int i = 0; i < locales.length; i++) { System.out.println(); displayNumber(locales[i]); displayCurrency(locales[i]); displayPercent(locales[i]); } }
}
</source>
Parse a GERMAN number
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; public class Main {
public static void main(String[] argv) throws Exception { Number number = NumberFormat.getNumberInstance(Locale.GERMAN).parse("-1.234,56"); if (number instanceof Long) { System.out.println("Long value"); } else { System.out.println("Double value"); } }
}
</source>
Parse a number for a locale
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; public class Main {
public static void main(String[] args) throws Exception { Number number = NumberFormat.getNumberInstance(Locale.JAPAN).parse("25,000.75"); if (number instanceof Long) { System.out.println("Long value: " + number.longValue()); } else if (number instanceof Double) { System.out.println("Double value: " + number.doubleValue()); } }
}
</source>
Parse a number with NumberFormat and Locale.CANADA
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; public class Main {
public static void main(String[] argv) throws Exception { Number number = NumberFormat.getPercentInstance(Locale.CANADA).parse("123.45%"); // 1.2345 if (number instanceof Long) { System.out.println("Long value"); } else { System.out.println("Double value"); } }
}
</source>
Parse number with NumberFormat and Locale
<source lang="java">
import java.text.NumberFormat; import java.util.Locale; public class Main {
public static void main(String[] argv) throws Exception { Number number = NumberFormat.getCurrencyInstance(Locale.GERMANY).parse("$123.45"); if (number instanceof Long) { System.out.println("Long value"); } else { System.out.println("Double value"); } }
}
</source>
precision modifier: Display at most 15 characters in a string
<source lang="java">
import java.util.Formatter; public class MainClass {
public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("%.15s", "Formatting with Java is now easy."); System.out.println(fmt); }
} //Formatting with
</source>
precision modifier: Format 4 decimal places
<source lang="java">
import java.util.Formatter; public class MainClass {
public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("%.4f", 123.1234567); System.out.println(fmt); }
} //123.1235
</source>
precision modifier: Format to 2 decimal places in a 16 character field
<source lang="java">
import java.util.Formatter; public class MainClass {
public static void main(String args[]) { Formatter fmt = new Formatter(); // Format 4 decimal places. fmt = new Formatter(); fmt.format("%16.2e", 123.1234567); System.out.println(fmt); }
} // 1.23e+02
</source>
RoundingMode.CEILING
<source lang="java">
import java.math.RoundingMode; import java.text.NumberFormat; public class NumberFormatRounding {
public static void main(String[] args) { NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(2); nf.setRoundingMode (RoundingMode.CEILING); System.out.println("Default rounding mode: " + nf.getRoundingMode()); System.out.println("123.454 rounds to " + nf.format(123.454)); System.out.println("123.455 rounds to " + nf.format(123.455)); System.out.println("123.456 rounds to " + nf.format(123.456)); System.out.println(); }
}
</source>
RoundingMode.FLOOR
<source lang="java">
import java.math.RoundingMode; import java.text.NumberFormat; public class NumberFormatRounding {
public static void main(String[] args) { NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(2); nf.setRoundingMode (RoundingMode.FLOOR); System.out.println("Default rounding mode: " + nf.getRoundingMode()); System.out.println("123.454 rounds to " + nf.format(123.454)); System.out.println("123.455 rounds to " + nf.format(123.455)); System.out.println("123.456 rounds to " + nf.format(123.456)); System.out.println(); }
}
</source>
RoundingMode.HALF_DOWN
<source lang="java">
import java.math.RoundingMode; import java.text.NumberFormat; public class NumberFormatRounding {
public static void main(String[] args) { NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(2); nf.setRoundingMode (RoundingMode.HALF_DOWN); System.out.println("Default rounding mode: " + nf.getRoundingMode()); System.out.println("123.454 rounds to " + nf.format(123.454)); System.out.println("123.455 rounds to " + nf.format(123.455)); System.out.println("123.456 rounds to " + nf.format(123.456)); System.out.println(); }
}
</source>
The Format Specifiers
<source lang="java">
Format Specifier Conversion Applied %a Floating-point hexadecimal %A %b Boolean %B %c Character %C %d Decimal integer %h Hash code of the argument %H %e Scientific notation %E %f Decimal floating-point %g Uses %e or %f, whichever is shorter %G %o Octal integer %n Inserts a newline character %s String %S %t Time and date %T %x Integer hexadecimal %X %% Inserts a % sign
</source>
the NumberFormat object is created once when the program starts.
<source lang="java">
import java.text.NumberFormat; public class MainClass {
static NumberFormat cf = NumberFormat.getCurrencyInstance(); public static void main(String[] args) { printMyAllowance(); printCostOfPaintBallGun(); } public static void printMyAllowance() { double myAllowance = 5.00; cf = NumberFormat.getCurrencyInstance(); System.out.println("My allowance: " + cf.format(myAllowance)); } public static void printCostOfPaintBallGun() { double costOfPaintBallGun = 69.95; cf = NumberFormat.getCurrencyInstance(); System.out.println("Cost of Paint Ball Gun: " + cf.format(costOfPaintBallGun)); }
}
</source>
The Uppercase Option
<source lang="java">
Specifier Effect %A Causes the hexadecimal digits a through f to be displayed in uppercase as A through F. Also, the prefix 0x is displayed as 0X, and the p will be displayed as P. %B Uppercases the values true and false. %C Uppercases the corresponding character argument. %E Causes the e symbol that indicates the exponent to be displayed in uppercase. %G Causes the e symbol that indicates the exponent to be displayed in uppercase. %H Causes the hexadecimal digits a through f to be displayed in uppercase as A through F. %S Uppercases the corresponding string. %T Causes all alphabetical output to be displayed in uppercase. %X Causes the hexadecimal digits a through f to be displayed in uppercase as A through F. Also, the optional prefix 0x is displayed as 0X, if present.
</source>
Use grouping to display a number
<source lang="java">
import java.text.NumberFormat; public class Main {
public static void main(String args[]) { NumberFormat nf = NumberFormat.getInstance(); System.out.println("Default format: " + nf.format(1234567.678)); nf.setGroupingUsed(false); System.out.println("Format without groupings: " + nf.format(1234567.678)); }
} /* Default format: 1,234,567.678 Format without groupings: 1234567.678
- /
</source>
Using an Argument Index
<source lang="java">
import java.util.Formatter; public class MainClass {
public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("%3$d %1$d %2$d", 10, 20, 30); System.out.println(fmt); }
} //30 10 20
</source>
Using only 0"s to the left of E forces no decimal point
<source lang="java">
import java.text.DecimalFormat; import java.text.NumberFormat; public class Main {
public static void main(String[] argv) throws Exception { NumberFormat formatter = new DecimalFormat("0E0"); String s = formatter.format(-1234.567); System.out.println(s); }
} // -1E3
</source>
Using the Format Flags
<source lang="java">
Flag Effect - Left justification
- Alternate conversion format
0 Output is padded with zeros rather than spaces space Positive numeric output is preceded by a space + Positive numeric output is preceded by a + sign , Numeric values include grouping separators ( Negative numeric values are enclosed within parentheses
</source>