ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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/)。