用Java格式化外部语言环境中的货币
我正在尽最大努力找到一种方法,使用Java在各种语言环境中格式化外币,这些语言环境不是该货币的默认值。 我找到了java.util.Currency,它可以代表用于各种语言环境的正确符号。 也就是说,对于美元而言,它为我提供了美国的符号$,以及其他国家的美元或美元。 另外,我找到了java.text.NumberFormat,它将格式化特定区域设置的货币。 我的问题 – util.Currency将提供适当的符号和代码,用于在非默认语言环境中表示货币,但不会以任何特定于语言环境的方式格式化货币。 NumberFormat假定我使用区域设置传递的数字是该区域设置的货币,而不是外币。
例如,如果我使用getCurrencyInstance(Locale.GERMANY)然后格式化(1000)它假定我格式化1000欧元。 实际上,对于USD,Yen或任何其他货币,我可能需要正确的德语本地化表示(正确的小数和千位分隔符,无论是在金额之前还是之后放置符号)。 到目前为止,我能够得到的最好的是使用NumberFormat格式化数字,然后在输出中搜索非数字字符,并用从util.Currency派生的符号替换它们。 但是,这非常脆弱,可能对我的目的来说不够可靠。 想法? 任何帮助深表感谢。
尝试在getCurrencyInstance(Locale.GERMANY)返回的实例上使用setCurrency
破碎 :
java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY); System.out.println(format.format(23));
产量:23,00€
修正 :
java.util.Currency usd = java.util.Currency.getInstance("USD"); java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY); format.setCurrency(usd); System.out.println(format.format(23));
产量:23,00美元
因此可以改进添加format.setMaximumFractionDigits(usd.getDefaultFractionDigits());
,在该示例的特定情况下不相关,但使用带小数的数字和Locale.JAPAN作为NumberFormat的区域设置变得相关。
java.util.Currency usd = java.util.Currency.getInstance("USD"); java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance( java.util.Locale.JAPAN); format.setCurrency(usd); System.out.println(format.format(23.23)); format.setMaximumFractionDigits(usd.getDefaultFractionDigits()); System.out.println(format.format(23.23));
将输出:
USD23 USD23.23
在NumberFormat代码中 ,对格式的初始/默认货币进行了类似的操作,调用方法DecimalFormat#adjustForCurrencyDefaultFractionDigits 。 以后使用NumberFormat.setCurrency更改货币时,不会执行此操作
import java.util.*; import java.text.*; public class Solution { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double payment = scanner.nextDouble(); scanner.close(); NumberFormat lp; //Local Payment lp = NumberFormat.getCurrencyInstance(Locale.US); System.out.println("US: " + lp.format(payment)); lp = NumberFormat.getCurrencyInstance(new Locale("en", "in")); System.out.println("India: " + lp.format(payment)); lp = NumberFormat.getCurrencyInstance(Locale.CHINA); System.out.println("China: " + lp.format(payment)); lp = NumberFormat.getCurrencyInstance(Locale.FRANCE); System.out.println("France: " + lp.format(payment)); } }
Scanner scanner = new Scanner(System.in); double payment = scanner.nextDouble(); scanner.close(); java.text.NumberFormat formatUS = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.US); String us=formatUS.format(payment); java.text.NumberFormat formatIn = java.text.NumberFormat.getCurrencyInstance(new java.util.Locale("en","in")); String india=formatIn.format(payment); java.text.NumberFormat formatChina = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.CHINA); String china=formatChina.format(payment); java.text.NumberFormat formatFrance = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.FRANCE); String france=formatFrance.format(payment); System.out.println("US: " + us); System.out.println("India: " + india); System.out.println("China: " + china); System.out.println("France: " + france);
更好的方法是导入java.util.Locale
然后使用这样的方法:
NumberFormat.getCurrencyInstance(Locale.theCountryYouWant);
例如NumberFormat.getCurrencyInstance(Locale.US);