java - 是否可以在同一个 MessageFormat 中使用多个 Locales?

标签 java json escaping java-17 messageformat

我在下面有以下 JSON 示例:

{
    "value": 946.2,
    "description": "O valor é R$ 946,20."
}

我需要使用 MessageFormat 来 JUnit 测试这个 JSON 示例,但我得到了一个无效值,因为我的语言环境不是英语。如果我将语言环境更改为英语而不是巴西葡萄牙语,我会收到无效描述,因为货币值以英语显示。

这是我的代码:

import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.Locale;

Locale.setDefault(Locale.ENGLISH);

System.out.println(MessageFormat.format("""
'{'
    "value": {0},
    "description": "O valor é {0,number,currency}."
'}'
""", new BigDecimal(946.2)));

如何格式化值或描述以获得上面显示的 JSON?

最佳答案

这是一个 String.format 解决方案,具有两个内部(本地化、自定义)NumberFormatters:

import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Locale;

public class OtherMain {

  private static final Locale LOCALE_PT_BR = new Locale.Builder().
      setLanguage("pt").
      setRegion("BR").
      build();
  
  private static final NumberFormat DEFAULT_NUMBER_FMT
      = NumberFormat.getNumberInstance(Locale.US);
  private static final NumberFormat MY_SPECIAL_NUMBER_FMT
      = NumberFormat.getCurrencyInstance(LOCALE_PT_BR);

  static {
    // this disables "thousands sperarator", we can adjust DEFAULT_NUMBER_FMT as well...
    MY_SPECIAL_NUMBER_FMT.setGroupingUsed(false);
  }

  public static void main(String[] args) {
    final BigDecimal num = new BigDecimal(99946.2);
    System.out.format("""
                      {
                        "value": %s,
                        "description": "O valor é %s."
                      }
                      """,
        DEFAULT_NUMBER_FMT.format(num),
        MY_SPECIAL_NUMBER_FMT.format(num)
    );
  }
}

打印:

{
  "value": 99,946.2,
  "description": "O valor é R$ 99946,20."
}

关于java - 是否可以在同一个 MessageFormat 中使用多个 Locales?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70629200/

相关文章:

java - JLabel 中的 HTML 在浏览器中不显示相同的结果

java - 在 Hibernate 中将实体内的实体与持久化上下文分离

java - 为什么 JVM 的 native 内存跟踪报告会报告线程内竞技场区域的内存使用率如此之高

javascript - 使用 json.js 字符串化多维数组的问题

java - 在 Java 中的 Jackson JSON 反序列化期间忽略丢失的属性

java - 如何在 Java 中运行 GDAL (ogr2ogr) 以将 Shapefile 转换为 GeoJSON

php - 在查询中转义双引号

java - Hudson 部署项目 .war 以外的 Artifact 时出现问题

javascript - 从输入字段读取属性时 HTML 编码丢失

python - Django的模板系统什么时候用escape和safe?