2

我正在尝试使用 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 欧元。

如果我在调试中打开变量,我会看到格式化为 ¤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;    
}
4

3 回答 3

2

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

于 2013-10-17T15:02:35.330 回答
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));
  }
}
于 2016-03-17T08:29:33.217 回答
0

问题是语言环境:您使用的是意大利语,正确的应该是意大利,因为意大利语可能是指他们说意大利语的其他国家,但意大利是指其单位包括货币的国家。

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

会给你正确的欧元符号。顺便说一句,德国与德国或法国与法国也是如此。

于 2022-02-01T19:19:12.180 回答