Java NumberFormat 教程


发布日期 : 2021-05-21 21:24:18 UTC

访问量: 9 次浏览

Java NumberFormat 教程

NumberFormat 是用于格式化和解析数字的 Java 类。 不同的文化使用不同的方式表示数字。例如,货币格式化的方式在世界各国中有很大不同。

NumberFormat 是用于格式化和解析数字的 Java 类。 使用 NumberFormat ,我们可以格式化和解析任何语言环境的数字。

NumberFormat 允许我们根据特定的语言环境舍入值,设置小数点分隔符,设置小数位数或格式化值。

创建 Java NumberFormat

NumberFormat 有几种创建数字格式的静态方法。

static NumberFormat getInstance(Locale inLocale)

getInstance() 方法返回指定语言环境的通用数字格式。

NumberFormat 格式化数字

不同地区的数字格式不同。 例如,某些国家/地区使用点作为小数点分隔符(美国,英国),而其他国家/地区则使用逗号(斯洛伐克,法国)。

FormattingNumbers.java

package com.zetcode;

import java.text.NumberFormat;
import java.util.Locale;

public class FormattingNumbers {

    public static void main(String[] args) {

        double n = 1240.35;

        NumberFormat nf = NumberFormat.getInstance(new Locale("en", "US"));
        String val = nf.format(n);

        System.out.println(val);

        NumberFormat nf2 = NumberFormat.getInstance(new Locale("sk", "SK"));
        String val2 = nf2.format(n);

        System.out.println(val2);        

        NumberFormat nf3 = NumberFormat.getInstance(new Locale("da", "DK"));
        String val3 = nf3.format(n);

        System.out.println(val3);
    }
}

该示例在三个不同的语言环境中显示一个数字。

double n = 1240.35;

这是要格式化的值。

NumberFormat nf = NumberFormat.getInstance(new Locale("en", "US"));

我们为美国语言环境创建一个 NumberFormat

String val = nf.format(n);

我们使用 format() 方法格式化该值。

NumberFormat nf2 = NumberFormat.getInstance(new Locale("sk", "SK"));
String val2 = nf2.format(n);

在这里,我们格式化斯洛伐克语区域设置的值。

1,240.35
1 240,35
1.240,35

美国,斯洛伐克和丹麦对数字分组和小数点使用不同的字符。

NumberFormat 分组数字

为了便于阅读,可以使用定界符将具有许多数字的数字分为几组。 setGroupingUsed() 设置是否以格式使用分组。

Grouping.java

package com.zetcode;

import java.text.NumberFormat;
import java.util.Locale;

public class Grouping {

    public static void main(String[] args) {

        long val = 23_500_390_800_380L;

        NumberFormat nf = NumberFormat.getInstance(new Locale("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;

从 Java 7 开始,可以在数字文字中使用下划线字符。

nf.setGroupingUsed(true);

我们使用 setGroupingUsed() 方法设置分组。

23 500 390 800 380
23500390800380

第一个值比第二个更具可读性。 斯洛伐克使用空格字符进行数字分组。

NumberFormat 小数位数

我们可以用 setMinimumFractionDigits()setMaximumFractionDigits() 控制小数位数。 如果位数少于最小小数位数,则将零添加到该值。 如果位数比小数位数的最大位数多,则四舍五入。

FractionDigits.java

package com.zetcode;

import java.text.NumberFormat;
import java.util.Locale;

public class FractionDigits {

    public static void main(String[] args) {

        double val1 = 4.5678934;
        double val2 = 2.3;

        NumberFormat nf = NumberFormat.getInstance(new Locale("sk", "SK"));
        nf.setMinimumFractionDigits(2);
        nf.setMaximumFractionDigits(4);

        System.out.println(nf.format(val1));
        System.out.println(nf.format(val2));
    }
}

在示例中,我们设置了分数位数的最小和最大数目。

4,5679
2,30

第一个值四舍五入,第二个值再加上一个零数字。

NumberFormat 舍入数字

如前所述,如果小数位数多于允许位数的最大值,则该值将四舍五入。 有几种可用的舍入技术。

RoundingNumbers.java

package com.zetcode;

import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.Locale;

public class RoundingNumbers {

    public static void main(String[] args) {

        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()
设置舍入模式。

2.4 2.6 3.2 4.9 5.6 3.3 8.8 
2.3 2.5 3.1 4.8 5.5 3.2 8.7

这是输出。

NumberFormat 格式化百分比

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

Percentages.java

package com.zetcode;

import java.text.NumberFormat;
import java.util.Locale;

public class Percentages {

    public static void main(String[] args) {

        double x = 25f / 100f;

        NumberFormat pf = NumberFormat.getPercentInstance(new Locale("sk", "SK"));

        System.out.println(pf.format(x));
    }
}

该示例将双精度值格式化为百分比。

25%

This is the output.

NumberFormat 格式货币

处理数字时最复杂的任务之一是格式化货币。 我们使用
NumberFormat.getCurrencyInstance()
来获取货币的数字格式。

Currencies.java

package com.zetcode;

import java.text.NumberFormat;
import java.util.Locale;

public class Currencies {

    public static void main(String[] args) {

        int val = 23_500;

        NumberFormat cf1 = NumberFormat.getCurrencyInstance(new Locale("en", "US"));
        System.out.println(cf1.format(val));

        NumberFormat cf2 = NumberFormat.getCurrencyInstance(new Locale("sk", "SK"));
        System.out.println(cf2.format(val));  

        NumberFormat cf3 = NumberFormat.getCurrencyInstance(new Locale("zh", "CN"));
        System.out.println(cf3.format(val));         
    }
}

该示例显示三个不同国家/地区的货币:美国,斯洛伐克和中国。

NumberFormat cf3 = NumberFormat.getCurrencyInstance(new Locale("zh", "CN"));

此行获取人民币的数字格式。

$23,500.00
23 500,00 €
¥23,500.00

This is the output.

NumberFormat 解析数字

parse() 方法从给定字符串的开头解析文本以产生数字。

ParsingNumbers.java

package com.zetcode;

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class ParsingNumbers {

    public static void main(String[] args) throws ParseException {

        NumberFormat nf = NumberFormat.getInstance(new Locale("sk", "SK"));
        nf.setMaximumFractionDigits(3);

        Number num = nf.parse("150000,456");
        System.out.println(num.doubleValue());
    }
}

该示例使用斯洛伐克语语言环境解析值。

在本教程中,我们使用 Java
NumberFormat
。 我们设置了数字,货币,百分比,四舍五入的格式,设置了小数位数,并设置了数字分组。