Java/Data Type/Number Format
Версия от 18:01, 31 мая 2010; (обсуждение)
Содержание
- 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.
/*
* 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
* <code>null</code>.
*
* @param source ignored.
* @param parsePosition ignored.
*
* @return Always <code>null</code>.
*/
public Number parse (String source, ParsePosition parsePosition) {
return null; // don"t bother with parsing
}
}
Add leading zeroes to a number
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);
}
}
A number formatter for logarithmic values. This formatter does not support parsing.
/*
* 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 (<code>null</code> 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 (<code>null</code> not permitted).
* @param powerLabel the power label (<code>null</code> 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 (never <code>null</code>).
*
* @since 1.0.13.
*/
public NumberFormat getExponentFormat() {
return (NumberFormat) this.formatter.clone();
}
/**
* Sets the number format used for the exponent.
*
* @param format the formatter (<code>null</code> 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
* <code>null</code>.
*
* @param source ignored.
* @param parsePosition ignored.
*
* @return Always <code>null</code>.
*/
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 (<code>null</code> 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;
}
}
Create a table of squares and cubes.
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);
}
}
}
Decimal Format Demo
/*
* 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);
}
}
Default rounding mode
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();
}
}
demonstrates the minimum field-width specifier by applying it to the %f conversion:
// 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);
}
}
demonstrates the %n and %% format specifiers:
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);
}
}
Demonstrate the space format specifiers.
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*/
Displaying numbers with commas
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));
}
}
Display numbers in scientific notation
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));
}
}
Format a number for a locale
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);
}
}
Format a number our way and the default way
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]));
}
}
Format a number to currency
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));
}
}
Format a number with DecimalFormat
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));
}
}
Format a number with leading zeroes
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);
}
}
Format for GERMAN locale
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
Format for the default locale
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
Formatting and Parsing a Locale-Specific Percentage
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%
Formatting and Parsing a Number for a Locale
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
Formatting and Parsing Locale-Specific Currency
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
Formatting a Number in Exponential Notation
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.
left justification: left justify
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 |
left justification: Right justify by default
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|
NumberFormat and locale
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));
}
}
}
Number Format by locale
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);
}
}
Number format viewer
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];
}
}
}
NumberFormat with Constant Locale Usage
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));
}
}
Number Format with Locale
/*
* 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]);
}
}
}
Parse a GERMAN number
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");
}
}
}
Parse a number for a locale
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());
}
}
}
Parse a number with NumberFormat and Locale.CANADA
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");
}
}
}
Parse number with NumberFormat and Locale
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");
}
}
}
precision modifier: Display at most 15 characters in a string
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
precision modifier: Format 4 decimal places
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
precision modifier: Format to 2 decimal places in a 16 character field
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
RoundingMode.CEILING
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();
}
}
RoundingMode.FLOOR
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();
}
}
RoundingMode.HALF_DOWN
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();
}
}
The Format Specifiers
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
the NumberFormat object is created once when the program starts.
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));
}
}
The Uppercase Option
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.
Use grouping to display a number
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
*/
Using an Argument Index
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
Using only 0"s to the left of E forces no decimal point
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
Using the Format Flags
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