当我看到其他人编写不必要的Java代码并且由于缺乏对已经提供所需功能的JDK类的了解而编写了不必要的Java代码时,我会想到很多次。 这样的一个例子是时间相关的常量的使用硬编码值的写入,如60 , 24 , 1440 ,和86400时TIMEUNIT提供了更好的,标准化的方法。 在这篇文章中,我看一看一个类的示例,该示例提供了开发人员经常在其上实现的功能: NumberFormat 。
NumberFormat类是java.text包的一部分,该包还包括常用的DateFormat和SimpleDateFormat类。 NumberFormat是一个抽象类(没有公共构造函数),其后代的实例是通过具有诸如getInstance() , getCurrencyInstanceInstance()和getPercentInstance()之类的重载静态方法获得的。
货币
下一个代码清单演示了如何调用NumberFormat.getCurrencyInstance(Locale)以获取NumberFormat
的实例,该实例以货币友好格式显示数字。
演示NumberFormat的货币支持
/**
* Demonstrate use of a Currency Instance of NumberFormat.
*/
public void demonstrateCurrency()
{
writeHeaderToStandardOutput("Currency NumberFormat Examples");
final NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(Locale.US);
out.println("15.5 -> " + currencyFormat.format(15.5));
out.println("15.54 -> " + currencyFormat.format(15.54));
out.println("15.345 -> " + currencyFormat.format(15.345)); // rounds to two decimal places
printCurrencyDetails(currencyFormat.getCurrency());
}
/**
* Print out details of provided instance of Currency.
*
* @param currency Instance of Currency from which details
* will be written to standard output.
*/
public void printCurrencyDetails(final Currency currency)
{
out.println("Concurrency: " + currency);
out.println("\tISO 4217 Currency Code: " + currency.getCurrencyCode());
out.println("\tISO 4217 Numeric Code: " + currency.getNumericCode());
out.println("\tCurrency Display Name: " + currency.getDisplayName(Locale.US));
out.println("\tCurrency Symbol: " + currency.getSymbol(Locale.US));
out.println("\tCurrency Default Fraction Digits: " + currency.getDefaultFractionDigits());
}
执行以上代码后,结果如下所示:
==================================================================================
= Currency NumberFormat Examples
==================================================================================
15.5 -> $15.50
15.54 -> $15.54
15.345 -> $15.35
Concurrency: USD
ISO 4217 Currency Code: USD
ISO 4217 Numeric Code: 840
Currency Display Name: US Dollar
Currency Symbol: $
Currency Default Fraction Digits: 2
上面的代码和相关的输出表明,用于货币的NumberFormat
实例(实际上是DecimalFormat
)会根据语言环境自动应用适当的位数和适当的货币符号。
百分比
下一个代码清单和相关的输出演示了NumberFormat
使用,以百分比友好格式显示数字。
演示NumberFormat的百分比格式
/**
* Demonstrate use of a Percent Instance of NumberFormat.
*/
public void demonstratePercentage()
{
writeHeaderToStandardOutput("Percentage NumberFormat Examples");
final NumberFormat percentageFormat = NumberFormat.getPercentInstance(Locale.US);
out.println("Instance of: " + percentageFormat.getClass().getCanonicalName());
out.println("1 -> " + percentageFormat.format(1));
// will be 0 because truncated to Integer by Integer division
out.println("75/100 -> " + percentageFormat.format(75/100));
out.println(".75 -> " + percentageFormat.format(.75));
out.println("75.0/100 -> " + percentageFormat.format(75.0/100));
// will be 0 because truncated to Integer by Integer division
out.println("83/93 -> " + percentageFormat.format((83/93)));
out.println("93/83 -> " + percentageFormat.format(93/83));
out.println(".5 -> " + percentageFormat.format(.5));
out.println(".912 -> " + percentageFormat.format(.912));
out.println("---- Setting Minimum Fraction Digits to 1:");
percentageFormat.setMinimumFractionDigits(1);
out.println("1 -> " + percentageFormat.format(1));
out.println(".75 -> " + percentageFormat.format(.75));
out.println("75.0/100 -> " + percentageFormat.format(75.0/100));
out.println(".912 -> " + percentageFormat.format(.912));
}
==================================================================================
= Percentage NumberFormat Examples
==================================================================================
1 -> 100%
75/100 -> 0%
.75 -> 75%
75.0/100 -> 75%
83/93 -> 0%
93/83 -> 100%
.5 -> 50%
.912 -> 91%
---- Setting Minimum Fraction Digits to 1:
1 -> 100.0%
.75 -> 75.0%
75.0/100 -> 75.0%
.912 -> 91.2%
代码和百分比的输出NumberFormat
使用表明,通过默认的实例NumberFormat
(实际上是一个DecimalFormat
通过返回在这种情况下) NumberFormat.getPercentInstance(区域)的方法没有小数位,乘所提供的数目由100(假定它是(如果提供的话,则为百分比的十进制等效值 ),并添加一个百分号(%)。
整数
接下来显示的少量代码及其相关输出演示了NumberFormat
使用,以整数格式显示数字。
演示NumberFormat的整数格式
/**
* Demonstrate use of an Integer Instance of NumberFormat.
*/
public void demonstrateInteger()
{
writeHeaderToStandardOutput("Integer NumberFormat Examples");
final NumberFormat integerFormat = NumberFormat.getIntegerInstance(Locale.US);
out.println("7.65 -> " + integerFormat.format(7.65));
out.println("7.5 -> " + integerFormat.format(7.5));
out.println("7.49 -> " + integerFormat.format(7.49));
out.println("-23.23 -> " + integerFormat.format(-23.23));
}
==================================================================================
= Integer NumberFormat Examples
==================================================================================
7.65 -> 8
7.5 -> 8
7.49 -> 7
-23.23 -> -23
如上面的代码和相关输出所示, NumberFormat
方法getIntegerInstance(Locale)返回一个实例,该实例将提供的数字表示为整数。
固定位数
下一个代码清单和相关输出演示了如何使用NumberFormat
打印浮点数的定点表示形式。 换句话说,使用NumberFormat
可以使一个数字在小数点左侧(“整数”数字)和小数点右侧(“小数”数字)的正好具有规定位数的数字表示。
演示定点数字的NumberFormat
/**
* Demonstrate generic NumberFormat instance with rounding mode,
* maximum fraction digits, and minimum integer digits specified.
*/
public void demonstrateNumberFormat()
{
writeHeaderToStandardOutput("NumberFormat Fixed-Point Examples");
final NumberFormat numberFormat = NumberFormat.getNumberInstance();
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
numberFormat.setMaximumFractionDigits(2);
numberFormat.setMinimumIntegerDigits(1);
out.println(numberFormat.format(234.234567));
out.println(numberFormat.format(1));
out.println(numberFormat.format(.234567));
out.println(numberFormat.format(.349));
out.println(numberFormat.format(.3499));
out.println(numberFormat.format(0.9999));
}
==================================================================================
= NumberFormat Fixed-Point Examples
==================================================================================
234.23
1
0.23
0.34
0.35
1
上面的代码和相关的输出演示了对最小“整数”位数的精确控制,该位数代表小数点左边(至少一个,因此在适用时显示为零)和最大“分数”小数点右边的数字。 尽管未显示,但也可以指定最大整数位数和最小分数位数。
结论
我曾经用过这篇文章来研究如何使用NumberFormat以不同的方式显示数字(货币,百分比,整数,固定的小数点等),并且通常意味着无需编写或减少代码即可将数字写成数字格式。 当我第一次开始写这篇文章时,我设想包括有关NumberFormat
的直接后代( DecimalFormat和ChoiceFormat )的示例和讨论,但是已经确定这篇文章已经足够冗长了。 我可能会在以后的博客文章中介绍NumberFormat
这些后代。
翻译自: https://www.javacodegeeks.com/2014/08/java-numeric-formatting.html