使用某种语言格式化货币,无论国家/地区

时间:2011-09-27 14:50:17

标签: java internationalization currency

我希望用Java的用户语言格式化一笔金额(欧元),无论用户所在的国家/地区如何:

final NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(loc);
currencyFormat.setCurrency(EUR);
currencyFormat.format(new BigDecimal("1.99"));

但是,不同输入区域设置(loc)的输出如下:

  • nl_NL:€ 1,99
  • nl_BE:1,99 €
  • nl_DE:EUR 1,99
  • nl(new Locale("nl")):EUR 1,99

所以我有两个问题

  • 输出取决于国家,而不仅仅是语言(作为前2个节目),但国家对我来说无关紧要。我的游戏可以在非洲旅行时以荷兰语播放。
  • 使用没有国家/地区或国家/地区与语言不匹配的区域设置时(第二个),不会打印该货币的符号。

请注意,我正在为游戏开发支付界面,因此nl_DE的区域设置意味着界面和货币应以荷兰语显示,但它仅显示德国提供的付款方式。

4 个答案:

答案 0 :(得分:1)

我想我应该将付款界面的输入区域分割为:

  • 显示区域设置,例如nl_NLnl_BEfr_FR。用于,显示东西。这是用户帐户的属性。
  • 居住国,例如NLFRTR。用户确定付款方式。这是通过IP地址确定的,但可以手动覆盖。

答案 1 :(得分:1)

我不清楚你的语言是什么意思,无论国家如何。货币面额本身显然与语言和国家无关,但格式规则因文化而异,而不是语言。通常我们将这些东西与我们的应用程序中的本地机器设置相关联,因为在不同的文化中总是存在相同语言的问题 - 例如西班牙使用9.999,99而墨西哥使用9,999.99但两者(名义上)都说西班牙语。当然,仅仅因为某人生活在某个特定的国家并不意味着他们不在不同的文化环境中工作(例如,远程办公人员或跨越文化界限的区域经理)。

这不是一个简单的问题,只能通过定义期望的范围来解决。

答案 2 :(得分:1)

我不确定你在做什么,但似乎你已经说过网络应用了,你需要有关语言和国家的单独信息。好的,让我澄清一下:

  1. 要正确格式化支付金额,您实际上需要语言和国家/地区,这意味着区域设置,因为这是标识适当格式的内容。
  2. 要提供正确的付款系统,您只需要一个国家/地区用户当前
  3. 要显示适当的翻译,您只需要语言(至少这是您的想法)。
  4. 现在,关于如何做到这一点。最简单的方法是建立某种用户配置文件,让用户决定什么是格式化的最佳区域设置,翻译的内容以及他想要使用的支付系统。如果您正在开发某种基于Web的游戏,您实际上可以从HTTP Accept-Language标题中读取Locales(您实际上需要设置好的默认值,这是查找此类信息的最佳位置)。要将语言与国家“分开”,您只需要从语言环境中读取语言和国家/地区代码,这很简单:

    Locale locale = request.getLocale(); // the most acceptable Locale using Servlet API
    String language = locale.getLanguage(); // gets language code
    String country = locale.getCountry(); // gets country code
    

    现在,语言通常不足以从资源包中读取文本,因为存在Locales(即zh_CN,zh_TW),其实际语言因国家而异(在上面的示例中,简体中文在中国大陆使用和新加坡一样,而所有其他华语世界都使用繁体中文)。因此,您仍然需要实际的区域设置。

    国家/地区代码会为您提供所选的国家/地区,但不会为您提供当前所在的国家/地区代码。根据视图的不同,可能会有好有坏。如果您需要确保付款发生在用户所在的国家/地区,我担心您需要使用Geolocation,并带来所有后果......

    这是回答你的问题,还是我误解了什么......?

答案 3 :(得分:0)

您的付款方式不应与区域设置相关联,它们应与您对付款处理系统的要求相关联。然后,您应该根据所选语言环境的习惯显示该值。