2013-10-17 35 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)); 
    } 
}