Java欧元符号转换为货币符号

时间:2013-10-17 14:59:28

标签: java spring pdf itext number-formatting

我正在尝试使用NumberFormat将双变量格式化为价格字符串(例如:€59,00)

这是我写的方法:

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查看器(如chrome或firefox)中打开生成的pdf时,该字段如下所示: €59,00

但是当我在adobe reader中打开它,或者我尝试进行物理打印时,它看起来像 ¤59,00。

如果我在debug中打开变量 value ,我会看到格式为¤59,00的字符串。

我做错了什么?

我解决了使用DecimalFormat而不是NumberFormat,并在utf-8编码中传递€符号(由mwhs输入[thanks])

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

2 个答案:

答案 0 :(得分:2)

您可能正在使用单独的编码。浏览器可能使用UTF-8,而adobe reader可能使用ANSI或其他UTF本地化。 (注意这些不一定是他们使用的编码,只是一个例子)所以检查你的偏好,然后再试一次。

答案 1 :(得分: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));
  }
}