Java 中的貨幣代碼到貨幣符號的映射
1.概述
處理貨幣代碼及其相應的符號在金融應用中至關重要。美元或歐元等貨幣代碼對於交易很有用。但是,使用者通常更喜歡看到 $ 或 € 之類的符號,以便於閱讀。在 Java 中顯示正確的貨幣符號並不總是那麼簡單,尤其是在考慮本地化時。
Java 提供了多種將貨幣代碼對應到其對應符號的方法,包括內建的Currency
類別、硬編碼的Map
和Locale
支援。本文深入探討了所有這些方法,並進行了效能比較和 JUnit 測試以進行驗證。
2. 貨幣代碼到符號的映射方法
根據在地化需求、一致性要求和維護的簡易性,應用程式需要採用不同的方法來檢索貨幣符號。以下部分詳細探討這些方法。
2.1.使用Currency
類
Java 提供了Currency
類別來根據 ISO 4217 貨幣代碼檢索貨幣符號。它在util
套件中定義:
public class CurrencyUtil {
public static String getSymbol(String currencyCode) {
Currency currency = Currency.getInstance(currencyCode);
return currency.getSymbol();
}
}
在這個實作中,我們傳遞一個貨幣代碼作為參數,並使用getInstance()
方法檢索對應的Currency
類別實例。接下來,我們使用getSymbol()
方法來取得貨幣符號
讓我們驗證一下Currency
類別是否傳回給定貨幣代碼的正確符號。如果提供了無效的程式碼,則應該拋出例外:
class CurrencyUtilTest {
@Test
void givenValidCurrencyCode_whenGetSymbol_thenReturnsCorrectSymbol() {
assertEquals("$", CurrencyUtil.getSymbol("USD"));
assertEquals("€", CurrencyUtil.getSymbol("EUR"));
}
@Test
void givenInvalidCurrencyCode_whenGetSymbol_thenThrowsException() {
assertThrows(IllegalArgumentException.class, () -> CurrencyUtil.getSymbol("INVALID"));
}
}
2.2.使用有Currency
類的Locale
應用程式可以結合使用Locale
類別和Currency
類別來檢索本地化的貨幣符號。這種方法對於根據用戶的區域設定動態調整貨幣符號的國際化應用程式非常有用:
public class CurrencyLocaleUtil {
public String getSymbolForLocale(Locale locale) {
Currency currency = Currency.getInstance(locale);
return currency.getSymbol();
}
}
getSymbolForLocale()
方法根據提供的語言環境檢索貨幣符號。
讓我們確保系統根據Locale
正確檢索貨幣符號:
class CurrencyLocaleUtilTest {
private final CurrencyLocaleUtil currencyLocale = new CurrencyLocaleUtil();
@Test
void givenLocale_whenGetSymbolForLocale_thenReturnsLocalizedSymbol() {
assertEquals("$", currencyLocale.getSymbolForLocale(Locale.US));
assertEquals("€", currencyLocale.getSymbolForLocale(Locale.FRANCE));
}
}
2.3.使用硬編碼Map
預定義Map
提供了一種簡單而靈活的方法來明確控制貨幣符號映射。當應用程式需要在 UI 中顯示一致的符號、處理不太常見的貨幣或強制執行獨立於區域設定的特定格式規則時,這種方法特別有用。它在支持的貨幣數量有限且不太可能頻繁變化的情況下效果最佳:
public class CurrencyMapUtil {
private static final Map<String, String> currencymap = Map.of(
"USD", "$",
"EUR", "€",
"INR", "₹"
);
public static String getSymbol(String currencyCode) {
return currencymap.getOrDefault(currencyCode, "Unknown");
}
}
下面的測試驗證了硬編碼的Map
對於已知程式碼傳回正確的符號,對於無法辨識的程式碼預設為「 Unknown
」:
class CurrencyMapUtilTest {
@Test
void givenValidCurrencyCode_whenGetSymbol_thenReturnsCorrectSymbol() {
assertEquals("$", CurrencyMapUtil.getSymbol("USD"));
assertEquals("€", CurrencyMapUtil.getSymbol("EUR"));
assertEquals("₹", CurrencyMapUtil.getSymbol("INR"));
}
@Test
void givenInvalidCurrencyCode_whenGetSymbol_thenReturnsUnknown() {
assertEquals("Unknown", CurrencyMapUtil.getSymbol("XYZ"));
}
}
3. 比較
每種方法都有不同的特性。下表比較了每種方法的用例和維護的簡易性:
方法 | 維護 | 用例 |
---|---|---|
Currency 類別 |
無需手動更新 | 最適合具有本地化支援的標準應用程式 |
硬編碼Map |
需要手動更新 | 適用於需要完全控制貨幣符號或處理自訂符號的情況 |
Locale |
無需手動更新 | 最適合國際化應用程式 |
如果應用程式需要一組固定的貨幣符號,則硬編碼map
方法是理想的。如果我們需要在地化支持,我們可以考慮Currency
類或基於Locale-
的解決方案。
4. 結論
選擇正確的方法取決於用例要求。 Currency
類別是可靠的,硬編碼Map
對於固定的符號集來說是最佳的,而Locale
方法對於需要區域適應的應用程式來說是理想的。
我們應該根據應用程式需求(例如在地化需求、符號一致性和易於維護)來選擇一種方法。
與往常一樣,這些範例的程式碼可在 GitHub 上找到。