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

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

NumberFormat

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

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

创建 Java NumberFormat

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

  1. static NumberFormat getInstance(Locale inLocale)

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

NumberFormat格式化数字

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

FormattingNumbers.java

  1. package com.zetcode;
  2. import java.text.NumberFormat;
  3. import java.util.Locale;
  4. public class FormattingNumbers {
  5. public static void main(String[] args) {
  6. double n = 1240.35;
  7. NumberFormat nf = NumberFormat.getInstance(new Locale("en", "US"));
  8. String val = nf.format(n);
  9. System.out.println(val);
  10. NumberFormat nf2 = NumberFormat.getInstance(new Locale("sk", "SK"));
  11. String val2 = nf2.format(n);
  12. System.out.println(val2);
  13. NumberFormat nf3 = NumberFormat.getInstance(new Locale("da", "DK"));
  14. String val3 = nf3.format(n);
  15. System.out.println(val3);
  16. }
  17. }

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

  1. double n = 1240.35;

这是要格式化的值。

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

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

  1. String val = nf.format(n);

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

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

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

  1. 1,240.35
  2. 1 240,35
  3. 1.240,35

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

NumberFormat分组数字

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

Grouping.java

  1. package com.zetcode;
  2. import java.text.NumberFormat;
  3. import java.util.Locale;
  4. public class Grouping {
  5. public static void main(String[] args) {
  6. long val = 23_500_390_800_380L;
  7. NumberFormat nf = NumberFormat.getInstance(new Locale("sk", "SK"));
  8. nf.setGroupingUsed(true);
  9. System.out.println(nf.format(val));
  10. nf.setGroupingUsed(false);
  11. System.out.println(nf.format(val));
  12. }
  13. }

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

  1. long val = 23_500_390_800_380L;

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

  1. nf.setGroupingUsed(true);

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

  1. 23 500 390 800 380
  2. 23500390800380

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

NumberFormat小数位数

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

FractionDigits.java

  1. package com.zetcode;
  2. import java.text.NumberFormat;
  3. import java.util.Locale;
  4. public class FractionDigits {
  5. public static void main(String[] args) {
  6. double val1 = 4.5678934;
  7. double val2 = 2.3;
  8. NumberFormat nf = NumberFormat.getInstance(new Locale("sk", "SK"));
  9. nf.setMinimumFractionDigits(2);
  10. nf.setMaximumFractionDigits(4);
  11. System.out.println(nf.format(val1));
  12. System.out.println(nf.format(val2));
  13. }
  14. }

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

  1. 4,5679
  2. 2,30

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

NumberFormat舍入数字

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

RoundingNumbers.java

  1. package com.zetcode;
  2. import java.math.RoundingMode;
  3. import java.text.NumberFormat;
  4. import java.util.Locale;
  5. public class RoundingNumbers {
  6. public static void main(String[] args) {
  7. double nums[] = {2.32, 2.55, 3.19, 4.88, 5.54, 3.22, 8.78};
  8. NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH);
  9. nf.setMaximumFractionDigits(1);
  10. nf.setRoundingMode(RoundingMode.UP);
  11. for (double num : nums) {
  12. String number = nf.format(num);
  13. System.out.printf("%s ", number);
  14. }
  15. System.out.println();
  16. nf.setRoundingMode(RoundingMode.DOWN);
  17. for (double num : nums) {
  18. String number = nf.format(num);
  19. System.out.printf("%s ", number);
  20. }
  21. System.out.println();
  22. }
  23. }

该示例使用以下两种舍入模式对双数进行舍入:RoundingMode.UPRoundingMode.DOWN

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

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

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

这是输出。

NumberFormat格式化百分比

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

Percentages.java

  1. package com.zetcode;
  2. import java.text.NumberFormat;
  3. import java.util.Locale;
  4. public class Percentages {
  5. public static void main(String[] args) {
  6. double x = 25f / 100f;
  7. NumberFormat pf = NumberFormat.getPercentInstance(new Locale("sk", "SK"));
  8. System.out.println(pf.format(x));
  9. }
  10. }

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

  1. 25%

这是输出。

NumberFormat格式货币

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

Currencies.java

  1. package com.zetcode;
  2. import java.text.NumberFormat;
  3. import java.util.Locale;
  4. public class Currencies {
  5. public static void main(String[] args) {
  6. int val = 23_500;
  7. NumberFormat cf1 = NumberFormat.getCurrencyInstance(new Locale("en", "US"));
  8. System.out.println(cf1.format(val));
  9. NumberFormat cf2 = NumberFormat.getCurrencyInstance(new Locale("sk", "SK"));
  10. System.out.println(cf2.format(val));
  11. NumberFormat cf3 = NumberFormat.getCurrencyInstance(new Locale("zh", "CN"));
  12. System.out.println(cf3.format(val));
  13. }
  14. }

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

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

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

  1. $23,500.00
  2. 23 500,00
  3. 23,500.00

这是输出。

NumberFormat解析数字

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

ParsingNumbers.java

  1. package com.zetcode;
  2. import java.text.NumberFormat;
  3. import java.text.ParseException;
  4. import java.util.Locale;
  5. public class ParsingNumbers {
  6. public static void main(String[] args) throws ParseException {
  7. NumberFormat nf = NumberFormat.getInstance(new Locale("sk", "SK"));
  8. nf.setMaximumFractionDigits(3);
  9. Number num = nf.parse("150000,456");
  10. System.out.println(num.doubleValue());
  11. }
  12. }

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

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

您可能也对相关教程感兴趣: Java 教程Java StringBuilder教程Java ArrayList教程Java static关键字Java8 forEach教程读取 Java 中的文本文件用 Java 读取和写入 ICO 图像