# Java `NumberFormat`

原文：http://zetcode.com/java/numberformat/

Java NumberFormat 教程显示了如何使用 Java 格式化数字。 不同的文化使用不同的方式表示数字。 例如，货币格式化的方式在世界各国中有很大不同。

## `NumberFormat`

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

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

## 创建 Java `NumberFormat`

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

```java
static NumberFormat getInstance(Locale inLocale)

```

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

## `NumberFormat`格式化数字

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

`FormattingNumbers.java`

```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);
    }
}

```

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

```java
double n = 1240.35;

```

这是要格式化的值。

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

```

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

```java
String val = nf.format(n);

```

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

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

```

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

```java
1,240.35
1 240,35
1.240,35

```

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

## `NumberFormat`分组数字

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

`Grouping.java`

```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));        
    }
}

```

我们有很多电话。 我们演示了斯洛伐克语言环境的数字分组。

```java
long val = 23_500_390_800_380L;

```

从 Java 7 开始，可以在数字字面值中使用下划线字符。

```java
nf.setGroupingUsed(true);

```

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

```java
23 500 390 800 380
23500390800380

```

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

## `NumberFormat`小数位数

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

`FractionDigits.java`

```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));
    }
}

```

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

```java
4,5679
2,30

```

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

## `NumberFormat`舍入数字

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

`RoundingNumbers.java`

```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`。

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

```

我们通过`setMaximumFractionDigits()`设置最大小数位数，并通过`setRoundingMode()`设置舍入模式。

```java
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`

```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));
    }
}

```

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

```java
25%

```

这是输出。

## `NumberFormat`格式货币

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

`Currencies.java`

```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));         
    }
}

```

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

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

```

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

```java
$23,500.00
23 500,00 €
￥23,500.00

```

这是输出。

## `NumberFormat`解析数字

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

`ParsingNumbers.java`

```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`。 我们设置了数字，货币，百分比，四舍五入的格式，设置了小数位数，并设置了数字分组。

您可能也对相关教程感兴趣： [Java 教程](/lang/java/)， [Java `StringBuilder`教程](/java/stringbuilder/)， [Java `ArrayList`教程](/articles/javaarraylist/)， [Java `static`关键字](/java/statickeyword/)， [Java8 `forEach`教程](/articles/java8foreach/)，[读取 Java 中的文本文件](/articles/javareadtext/)和[用 Java 读取和写入 ICO 图像](/articles/javaico/)。