ZetCode

Java NumberFormat

上次修改时间:2024 年 7 月 4 日

在本文中,我们将展示如何在 Java 中格式化数字。

不同的文化使用不同的方式来表示数字。例如,世界各国对货币的格式化方式差异很大。

NumberFormat 是一个用于格式化和解析数字的 Java 类。 使用 NumberFormat,我们可以为任何区域设置格式化和解析数字。

NumberFormat 允许我们对值进行四舍五入、设置小数分隔符、设置小数位数或根据特定区域设置格式化值。

NumberFormat 具有多个静态方法来创建数字格式。

static NumberFormat getInstance(Locale inLocale)

getInstance 方法返回指定区域设置的通用数字格式。

格式化数字

对于不同的区域设置,数字的格式不同。 例如,一些国家/地区使用点作为小数分隔符(美国、英国),而另一些国家/地区使用逗号(斯洛伐克、法国)。

Main.java
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 设置是否在格式中使用分组。

Main.java
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 小数位数

我们可以使用 setMinimumFractionDigitssetMaximumFractionDigits 控制小数位数。 如果位数少于最小小数位数,则将零添加到该值。 如果位数多于最大小数位数,则对数字进行四舍五入。

Main.java
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

第一个值四舍五入,第二个值获得一个额外的零位。

数字四舍五入

正如我们上面已经说过的,如果小数位数多于允许的最大位数,则该值将被四舍五入。 有几种可用的舍入技术。

Main.java
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.UPRoundingMode.DOWN

nf.setMaximumFractionDigits(1);
nf.setRoundingMode(RoundingMode.UP);

我们使用 setMaximumFractionDigits 设置最大小数位数,并使用 setRoundingMode 设置舍入模式。

格式化百分比

NumberFormat.getPercentInstance 用于格式化百分比。

Main.java
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 来获取货币的数字格式。

Main.java
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 方法从给定字符串的开头解析文本以生成数字。

Main.java
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 NumberFormat。 我们格式化了数字、货币、百分比、四舍五入的数字、设置了小数位数和设置了数字的分组。

作者

我叫 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直撰写编程文章。迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程