如何用NumberFormat与Locale实现美元负数金额的括号格式输出
问题与解决方案
原始代码
NumberFormat numberFormat = NumberFormat.getCurrencyInstance(Locale.US); Number value = NumberFormat.getInstance().parse("-1234.876"); String output = numberFormat.format(value);
当前代码输出为 -$1,234.88,需求是将美国美元的负数格式改为 ($1,234.88),要求使用Java原生方法实现,不通过字符串处理。
用户尝试过Locale locale = new Locale("en", "US","account");但未成功,了解Unicode的“account”货币格式可实现括号显示负数,但不确定具体用法。
注:此需求与某Stack Exchange问题相反——Java 8中美元负数默认是括号格式,该问题需求是改为负号,而本需求是将负号格式改为括号。
解决方案
方案一:Java 8及全版本通用(强制转换为DecimalFormat设置格式)
NumberFormat.getCurrencyInstance(Locale.US)返回的是DecimalFormat实例,可强制转换后自定义负数格式模式:
import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.ParseException; import java.util.Locale; public class CurrencyFormatDemo { public static void main(String[] args) throws ParseException { NumberFormat numberFormat = NumberFormat.getCurrencyInstance(Locale.US); if (numberFormat instanceof DecimalFormat) { DecimalFormat decimalFormat = (DecimalFormat) numberFormat; // 应用格式模式:正数用常规格式,负数用括号包裹 decimalFormat.applyPattern("$#,##0.00;($#,##0.00)"); } Number value = NumberFormat.getInstance().parse("-1234.876"); String output = numberFormat.format(value); System.out.println(output); // 输出: ($1,234.88) } }
方案二:Java 9+版本使用Locale的account变体
Java 9及以上正式支持"account" locale变体,可直接通过该方式获取符合需求的货币格式:
import java.text.NumberFormat; import java.text.ParseException; import java.util.Locale; public class CurrencyFormatDemo { public static void main(String[] args) throws ParseException { // 使用account变体的US locale NumberFormat numberFormat = NumberFormat.getCurrencyInstance(new Locale("en", "US", "account")); Number value = NumberFormat.getInstance().parse("-1234.876"); String output = numberFormat.format(value); System.out.println(output); // 输出: ($1,234.88) } }
之前尝试该方式失败,大概率是因为使用的Java版本低于9,此变体在Java 9才被纳入支持。
内容的提问来源于stack exchange,提问作者skcodes
相关产品推荐
相关产品推荐

