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

3

我想使用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。
如果我在调试中打开变量value,我会看到字符串格式为¤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] - mwhs
我认为这里所有的答案,包括你自己的解决方案,都未能解决原始难题:为什么PDF在浏览器和阅读器中呈现不同,而PDF应该在任何情况下看起来完全相同?然而,这不是一个Java问题。 - Michael Piefel
3个回答

2

您可能正在使用不同的编码方式。浏览器可能使用UTF-8,而Adobe Reader可能使用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));
  }
}

0
问题出在语言环境:您使用的是意大利语,正确的应该是意大利(ITALY),因为意大利语可能指其他讲意大利语的国家,而意大利则表示包括货币在内的国家单位。
private String formatValue (double price){
  NumberFormat f = NumberFormat.getCurrencyInstance(Locale.ITALY);
  String value = f.format(new BigDecimal(price));
  return value;
}

会给你正确的欧元符号。同样适用于 GERMAN vs. GERMANY 或 FRENCH vs. FRANCE。


使用 Locale.ITALY 是个好主意,但为什么原帖作者在浏览器渲染的 PDF 中看到了欧元符号,而在 Acrobat Reader 中却没有呢? - Michael Piefel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接