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教程。