Java NumberFormat
上次修改时间:2024 年 7 月 4 日
在本文中,我们将展示如何在 Java 中格式化数字。
不同的文化使用不同的方式来表示数字。例如,世界各国对货币的格式化方式差异很大。
NumberFormat
是一个用于格式化和解析数字的 Java 类。 使用 NumberFormat
,我们可以为任何区域设置格式化和解析数字。
NumberFormat
允许我们对值进行四舍五入、设置小数分隔符、设置小数位数或根据特定区域设置格式化值。
NumberFormat
具有多个静态方法来创建数字格式。
static NumberFormat getInstance(Locale inLocale)
此 getInstance
方法返回指定区域设置的通用数字格式。
格式化数字
对于不同的区域设置,数字的格式不同。 例如,一些国家/地区使用点作为小数分隔符(美国、英国),而另一些国家/地区使用逗号(斯洛伐克、法国)。
import java.text.NumberFormat; import java.util.Locale; void main() { double n = 1240.35; NumberFormat nf = NumberFormat.getInstance(Locale.of("en", "US")); String val = nf.format(n); System.out.println(val); NumberFormat nf2 = NumberFormat.getInstance(Locale.of("sk", "SK")); String val2 = nf2.format(n); System.out.println(val2); NumberFormat nf3 = NumberFormat.getInstance(Locale.of("da", "DK")); String val3 = nf3.format(n); System.out.println(val3); }
该示例以三种不同的区域设置显示一个数字。
double n = 1240.35;
这是要格式化的值。
NumberFormat nf = NumberFormat.getInstance(Locale.of("en", "US"));
我们为美国区域设置创建一个 NumberFormat
。
String val = nf.format(n);
我们使用 format
方法格式化该值。
NumberFormat nf2 = NumberFormat.getInstance(Locale.of("sk", "SK")); String val2 = nf2.format(n);
在这里,我们格式化斯洛伐克区域设置的值。
$ java Main.java 1,240.35 1 240,35 1.240,35
美国、斯洛伐克和丹麦使用不同的字符进行数字分组和小数点标记。
数字分组
为了便于阅读,具有许多数字的数字可以使用分隔符分成组。 setGroupingUsed
设置是否在格式中使用分组。
import java.text.NumberFormat; import java.util.Locale; void main() { long val = 23_500_390_800_380L; NumberFormat nf = NumberFormat.getInstance(Locale.of("sk", "SK")); nf.setGroupingUsed(true); System.out.println(nf.format(val)); nf.setGroupingUsed(false); System.out.println(nf.format(val)); }
我们有一个长数字。 我们演示了斯洛伐克区域设置的数字分组。
long val = 23_500_390_800_380L;
可以在数字文字中使用下划线字符。
nf.setGroupingUsed(true);
我们使用 setGroupingUsed
方法设置分组。
$ java Main.java 23 500 390 800 380 23500390800380
第一个值比第二个值更易于阅读。斯洛伐克使用空格字符进行数字分组。
NumberFormat 小数位数
我们可以使用 setMinimumFractionDigits
和 setMaximumFractionDigits
控制小数位数。 如果位数少于最小小数位数,则将零添加到该值。 如果位数多于最大小数位数,则对数字进行四舍五入。
import java.text.NumberFormat; import java.util.Locale; void main() { double val1 = 4.5678934; double val2 = 2.3; NumberFormat nf = NumberFormat.getInstance(Locale.of("sk", "SK")); nf.setMinimumFractionDigits(2); nf.setMaximumFractionDigits(4); System.out.println(nf.format(val1)); System.out.println(nf.format(val2)); }
在此示例中,我们设置最小和最大小数位数。
$ java Main.java 4,5679 2,30
第一个值四舍五入,第二个值获得一个额外的零位。
数字四舍五入
正如我们上面已经说过的,如果小数位数多于允许的最大位数,则该值将被四舍五入。 有几种可用的舍入技术。
import java.math.RoundingMode; import java.text.NumberFormat; import java.util.Locale; void main() { double nums[] = {2.32, 2.55, 3.19, 4.88, 5.54, 3.22, 8.78}; NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH); nf.setMaximumFractionDigits(1); nf.setRoundingMode(RoundingMode.UP); for (double num : nums) { String number = nf.format(num); System.out.printf("%s ", number); } System.out.println(); nf.setRoundingMode(RoundingMode.DOWN); for (double num : nums) { String number = nf.format(num); System.out.printf("%s ", number); } System.out.println(); }
该示例使用两种舍入模式对双精度数字进行舍入:RoundingMode.UP
和 RoundingMode.DOWN
。
nf.setMaximumFractionDigits(1); nf.setRoundingMode(RoundingMode.UP);
我们使用 setMaximumFractionDigits
设置最大小数位数,并使用 setRoundingMode
设置舍入模式。
格式化百分比
NumberFormat.getPercentInstance
用于格式化百分比。
import java.text.NumberFormat; import java.util.Locale; void main() { double x = 25f / 100f; NumberFormat pf = NumberFormat.getPercentInstance(Locale.of("sk", "SK")); System.out.println(pf.format(x)); }
该示例将双精度值格式化为百分比。
格式化货币
处理数字时最复杂的任务之一是格式化货币。 我们使用 NumberFormat.getCurrencyInstance
来获取货币的数字格式。
import java.math.BigDecimal; import java.text.NumberFormat; import java.util.Locale; void main() { var val = new BigDecimal("23500"); NumberFormat cf1 = NumberFormat.getCurrencyInstance(Locale.of("en", "US")); System.out.println(cf1.format(val)); NumberFormat cf2 = NumberFormat.getCurrencyInstance(Locale.of("sk", "SK")); System.out.println(cf2.format(val)); NumberFormat cf3 = NumberFormat.getCurrencyInstance(Locale.of("zh", "CN")); System.out.println(cf3.format(val)); }
该示例显示了三个不同国家/地区的货币:美国、斯洛伐克和中国。
NumberFormat cf3 = NumberFormat.getCurrencyInstance(new Locale("zh", "CN"));
此行获取人民币的数字格式。
$ java Main.java $23,500.00 23 500,00 € ¥23,500.00
解析数字
parse
方法从给定字符串的开头解析文本以生成数字。
import java.text.NumberFormat; import java.text.ParseException; import java.util.Locale; void main() throws ParseException { NumberFormat nf = NumberFormat.getInstance(Locale.of("sk", "SK")); nf.setMaximumFractionDigits(3); Number num = nf.parse("150000,456"); System.out.println(num.doubleValue()); }
该示例使用斯洛伐克区域设置解析一个值。
来源
在本文中,我们使用了 Java NumberFormat
。 我们格式化了数字、货币、百分比、四舍五入的数字、设置了小数位数和设置了数字的分组。
作者
列出所有Java教程。