首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 數字格式化為貨幣字符串:NumberFormat 多國幣種實戰

     編輯:Java 程式設計入門

前言

貨幣格式化是國際化應用的基礎需求。不同國家/地區的貨幣符號、小數位、分組分隔符、負數表示差異巨大。Java java.text.NumberFormat 配合 Locale 提供了開箱即用的多幣種格式化能力。本文通過完整示例演示如何將數字格式化為各國貨幣格式。

核心 API

// 獲取貨幣格式化器
NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(Locale locale);

// 格式化數字
String formatted = currencyFormat.format(number);

完整代碼示例

import java.text.NumberFormat;
import java.util.Locale;
import java.util.Scanner;

public class CurrencyFormatDemo {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入一個金額數字:");
        
        if (!scanner.hasNextDouble()) {
            System.err.println("輸入無效,請輸入數字");
            return;
        }
        
        double amount = scanner.nextDouble();
        scanner.close();
        
        System.out.println("\n=== 多國貨幣格式化結果 ===");
        System.out.printf("原始數值:%,.2f%n%n", amount);
        
        // 定義要展示的 Locale
        Locale[] locales = {
            Locale.CHINA,           // 中國大陸:¥1,234.56
            Locale.US,              // 美國:$1,234.56
            Locale.UK,              // 英國:£1,234.56
            Locale.JAPAN,           // 日本:¥1,235 (日元無小數)
            Locale.GERMANY,         // 德國:1.234,56 €
            Locale.FRANCE,          // 法國:1 234,56 €
            Locale.TAIWAN,          // 台灣:NT$1,234.56
            Locale.KOREA,           // 韓國:₩1,235
            new Locale("zh", "HK"), // 香港:HK$1,234.56
            new Locale("en", "SG"), // 新加坡:S$1,234.56
            Locale.CANADA,          // 加拿大:$1,234.56
            new Locale("pt", "BR")  // 巴西:R$ 1.234,56
        };
        
        for (Locale loc : locales) {
            NumberFormat fmt = NumberFormat.getCurrencyInstance(loc);
            String currencySymbol = getCurrencySymbol(loc);
            System.out.printf("%-15s %-10s %s%n", 
                loc.getDisplayName(), 
                "[" + currencySymbol + "]",
                fmt.format(amount));
        }
    }
    
    /** 獲取貨幣符號(補充顯示) */
    private static String getCurrencySymbol(Locale locale) {
        try {
            return java.util.Currency.getInstance(locale).getSymbol(locale);
        } catch (Exception e) {
            return "?";
        }
    }
}

運行結果示例(輸入 1234.56)


=== 多國貨幣格式化結果 ===
原始數值:1,234.56

中國大陸        [¥]       ¥1,234.56
美國            [$]       $1,234.56
英國            [£]       £1,234.56
日本            [¥]       ¥1,235
德國            [€]       1.234,56 €
法國            [€]       1 234,56 €
台灣            [NT$]     NT$1,234.56
韓國            [₩]       ₩1,235
香港            [HK$]     HK$1,234.56
新加坡          [S$]      S$1,234.56
加拿大          [$]       $1,234.56
巴西            [R$]      R$ 1.234,56

關鍵差異解析

地區貨幣符號位置小數分隔符千分位分隔符小數位數負數格式
中國/美國/英國前綴點 (.)逗號 (,)2-¥1,234.56
德國/法國後綴逗號 (,)點 (.) / 空格2-1.234,56 €
日本/韓國前綴無逗號 (,)0-¥1,235
巴西前綴逗號 (,)點 (.)2-R$ 1.234,56

進階用法

1. 自定義貨幣格式(非標準 Locale)

// 手動構建格式化器
NumberFormat custom = NumberFormat.getCurrencyInstance();
custom.setCurrency(Currency.getInstance("CNY")); // 強制人民幣
custom.setMaximumFractionDigits(2);
custom.setMinimumFractionDigits(2);
custom.setGroupingUsed(true);

2. 解析貨幣字符串為數字

String price = "¥1,234.56";
NumberFormat fmt = NumberFormat.getCurrencyInstance(Locale.CHINA);
try {
    Number num = fmt.parse(price);
    System.out.println("解析結果:" + num.doubleValue()); // 1234.56
} catch (ParseException e) {
    e.printStackTrace();
}

3. 高精度金融計算:BigDecimal + NumberFormat

import java.math.BigDecimal;
import java.math.RoundingMode;

BigDecimal amount = new BigDecimal("1234.5678");
// 計算邏輯...
amount = amount.setScale(2, RoundingMode.HALF_UP); // 四捨五入保留2位

NumberFormat fmt = NumberFormat.getCurrencyInstance(Locale.CHINA);
System.out.println(fmt.format(amount)); // ¥1,234.57

最佳實踐總結

  1. 存儲用 BigDecimal:避免浮點數精度丟失,數據庫用 DECIMAL 類型
  2. 顯示用 NumberFormat:配合用戶 Locale 動態格式化
  3. 傳輸用標準格式:API 交互建議 ISO 4217 貨幣代碼 + 數值(如 {"currency":"CNY","amount":1234.56})
  4. 測試覆蓋主流 Locale:至少驗證中、美、德、日、巴西等代表性格式
  5. 注意 JDK 版本差異:JDK 更新會同步最新 CLDR 數據,貨幣符號、格式可能變化

總結

NumberFormat.getCurrencyInstance(Locale) 是 Java 實現多幣種格式化的標準方式,零依賴、線程安全、符合國際標準。結合 BigDecimal 進行精確計算,即可構建健壯的國際化金融應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved