在Java应用程序中处理多种货币

时间:2016-10-12 22:08:30

标签: java

我希望能够在我的应用中处理多种货币。我有一个方法将创建一个事务实例:

class MyApp() {
    //...
    public Transaction createTransaction(String desc, BigDecimal amount) {...

所谓的这样的事情:

createTransaction("Phone bill", new BigDecimal("28.555"));

但是,我希望根据货币/区域设置的设置格式化金额。我想要有类似的东西:

interface MyCurrency() {
    public static BigDecimal format(BigDecimal amount);
}

public class GBP implements MyCurrency {
    public static BigDecimal format(BigDecimal amount) {
        return amount.setScale(2, BigDecimal.ROUND_FLOOR); // 28.555 -> 28.55
    }
}

public class JPY implements MyCurrency {
    public static BigDecimal format(BigDecimal amount) {
        return amount.setScale(0, BigDecimal.ROUND_FLOOR); // 28.555 -> 28
    }
}

// then modify my app class as follows

class MyApp() {
    //...
    public void setCurrency(MyCurrency currency) {
        this.currency = currency;
    }
    public Transaction createTransaction(String desc, BigDecimal amount) {
        amount = this.currency.format(amount);
        //...
    }

我希望这是有道理的。但是,有没有Java构建方式呢?我搜索了处理多种货币,但没有找到任何讨论过这种情况的东西(我确定它是一种非常常见的情况)

1 个答案:

答案 0 :(得分:2)

您是否尝试过以下操作?它根据您显示的国家/地区的数量规格格式化货币。

java.util.Currency usd = java.util.Currency.getInstance("USD");
java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY);
format.setCurrency(usd);
format.setMaximumFractionDigits(usd.getDefaultFractionDigits());
System.out.println(format.format(23));

除非你的意思是,在德国它应该是欧元,在英国应该是英镑。在这种情况下,你应该澄清你的问题。

但如果是这样的话:

DecimalFormat.getCurrencyInstance().format( 123.45);//    $123.45
DecimalFormat.getCurrencyInstance(Locale.GERMANY).format( 123.45); // 123,45 €