2013-10-17 37 views
1

我試圖格式化爲一個字符串,價格雙變量(例如:€59,00)使用的NumberFormatJava的歐元符號轉換爲貨幣辛博爾

這裏是我寫的方法:

private String formatValue (double price){ 
    NumberFormat f = NumberFormat.getCurrencyInstance(Locale.ITALIAN); 
    String value = f.format(new BigDecimal(price)); 
    return value; 
} 

然後,我使用iText庫將返回的值寫入pdf字段。

form.setField("value", formatValue(price)); 

現在,當我在瀏覽器中的PDF查看器中打開生成的PDF(如Chrome或Firefox),現場看起來像: €59.00

,但是當我在Adobe Reader中打開它,或者我嘗試物理打印,看起來像 ¤59,00。

如果我在調試中打開變量的值,我看到格式爲59,00的字符串。

我在做什麼錯了?

我解決使用DecimalFormat的代替的NumberFormat,並以UTF-8編碼經過€符號(由MWHS輸入[感謝])

private String formatValue (double price){ 
    DecimalFormat formatter = new DecimalFormat("\u20ac0.00"); 
    String value = formatter.format(price); 
    return value;  
} 
+1

你讀過這篇關於Unicode和字符集的文章嗎?它會幫助你更好地理解你的問題! [http://www.joelonsoftware.com/articles/Unicode.html](http://www.joelonsoftware.com/articles/Unicode.html) – mwhs

+0

感謝您的輸入,我解決了 – dgiaig

回答

2

您可能使用單獨的編碼。瀏覽器可能使用UTF-8,而adobe閱讀器可能使用ANSI或其他UTF的本地化。 (請注意,這些不一定是他們使用的編碼,只是一個示例),請檢查您的偏好,然後重試。

0

您可以使用實際的UTF-8歐元符號,使代碼更具可讀性。

private static final DecimalFormat EURO_FORMAT = new DecimalFormat("€0.00"); 
    private String formatValue (double price){ 
    return EURO_FORMAT.format(price); 
    } 

但是java.util.NumberFormat是一個更好的選擇,因爲您可以使用Locale來獲取正確的數字格式。在法國,德國和荷蘭,使用逗號代替美分之前的小數點。但成千上萬的格式是不同的。看下面的例子:

public class NumberFormatLocaleExample { 

    public static void main(final String[] args) { 
    double price = 1249.69; 
    System.out.println(formatValueGermany(price)); 
    System.out.println(formatValueFrance(price)); 
    } 

    private static final NumberFormat EURO_FORMAT_GER = NumberFormat.getCurrencyInstance(Locale.GERMAN); 
    private static String formatValueGermany(double price){ 
    return String.format("€%s", EURO_FORMAT_GER.format(price)); 
    } 

    private static final NumberFormat EURO_FORMAT_FRANCE = NumberFormat.getCurrencyInstance(Locale.FRENCH); 

    private static String formatValueFrance(double price){ 
    return String.format("€%s", EURO_FORMAT_FRANCE.format(price)); 
    } 
}