Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在ICU4J中自定义MessageFormat中的货币格式_Java_Internationalization_Icu_Messageformat - Fatal编程技术网

Java 如何在ICU4J中自定义MessageFormat中的货币格式

Java 如何在ICU4J中自定义MessageFormat中的货币格式,java,internationalization,icu,messageformat,Java,Internationalization,Icu,Messageformat,我有一个生成大量文档的系统。其内容在ResourceBundles中定义 我想自定义MessageFormat打印货币值的方式。有时我希望它显示没有小数位数的货币(但并非总是如此) 这应该按预期工作,但不是: System.err.println( com.ibm.icu.text.MessageFormat.format( "{0,number,\u00A4#}", new com.ibm.icu.util.CurrencyAmount(1, c

我有一个生成大量文档的系统。其内容在ResourceBundles中定义

我想自定义MessageFormat打印货币值的方式。有时我希望它显示没有小数位数的货币(但并非总是如此)

这应该按预期工作,但不是:

System.err.println(
  com.ibm.icu.text.MessageFormat.format(
      "{0,number,\u00A4#}", 
      new com.ibm.icu.util.CurrencyAmount(1, 
        com.ibm.icu.util.Currency.getInstance("USD"))));
不幸的是,它打印出:

US$1,00
是否有人在资源包“属性”文件中使用自定义货币格式

我不想在全系统范围内改变它


顺便说一句,这对java.text.MessageFormat很有效。

好的,我再次阅读了你的问题。 我真的不知道你为什么要砍掉美分部分(在美国,这在韩国或日本是有意义的,因为他们根本不使用美分)。
不管怎么说,我不认为这是一个好主意,只是切断美分的一部分,但如果你想这样做,它是一样简单的使用NumberFormat与

顺便说一句,我仍然不知道我知道为什么通过使用资源包你不能使用。 您仍然可以在
MessageFormat.format()
中调用格式化程序:

可以预见,它会打印出:

US$1,00
一些金额:1美元

如果您需要保留货币,我建议您通过保留本地格式来使用
setCurrency(currency)
方法-无论如何,您都是在Internalization标签中问这个问题


编辑:包括有关MessageFormat功能的信息

如果需要为区域设置使用自定义货币格式,实际上需要实例化MessageFormat类(常规静态
MessageFormat.format(字符串、对象…
在web应用程序中不起作用,因为它使用默认区域设置-
Locale.getDefault(Locale.Category.format)
在Java 7中-如果愿意,服务器区域设置)

因此,您真正想要的是编写一个助手方法(抱歉,没有奖金),该方法看起来与此类似(内存不足,抱歉):

出于性能方面的考虑,您可能会考虑创建一次StringBuffer,然后一直清理它,但我将优化留给您自己。
您还需要稍微修改模式,我稍后将解释原因:

String pattern = "{1}{0,number,\u00A4#}";

您需要将金额和货币符号传递给翻译人员,让翻译人员在何处放置符号以及如何设置区域设置的值格式(别忘了在属性文件中添加注释!)。

好的,我再次阅读了您的问题。 我真的不知道你为什么要砍掉美分部分(在美国,这在韩国或日本是有意义的,因为他们根本不使用美分)。
不管怎么说,我不认为这是一个好主意,只是切断美分的一部分,但如果你想这样做,它是一样简单的使用NumberFormat与

顺便说一句,我仍然不知道我知道为什么通过使用资源包你不能使用。 您仍然可以在
MessageFormat.format()
中调用格式化程序:

可以预见,它会打印出:

US$1,00
一些金额:1美元

如果您需要保留货币,我建议您通过保留本地格式来使用
setCurrency(currency)
方法-无论如何,您都是在Internalization标签中问这个问题


编辑:包括有关MessageFormat功能的信息

如果需要为区域设置使用自定义货币格式,实际上需要实例化MessageFormat类(常规静态
MessageFormat.format(字符串、对象…
在web应用程序中不起作用,因为它使用默认区域设置-
Locale.getDefault(Locale.Category.format)
在Java 7中-如果愿意,服务器区域设置)

因此,您真正想要的是编写一个助手方法(抱歉,没有奖金),该方法看起来与此类似(内存不足,抱歉):

出于性能方面的考虑,您可能会考虑创建一次StringBuffer,然后一直清理它,但我将优化留给您自己。
您还需要稍微修改模式,我稍后将解释原因:

String pattern = "{1}{0,number,\u00A4#}";

您需要将金额和货币符号传递给翻译人员,让翻译人员将符号放置在何处,以及如何设置区域设置的值格式(别忘了在属性文件中添加注释!)。

有什么原因不能使用JDK版本吗?顺便问一下:有没有什么具体的原因让你不能使用
NumberFormat.getCurrencyInstance(locale)
?我想使用ICU有两个原因。首先,我们的应用程序需要在不同的语言环境中打印某些货币,这在JDK版本中是不可能的(货币必须独立于当前的语言环境),其次,ICU有详细的格式,也必须在不同的语言环境中打印。我不想使用“NumberFormat.getCurrencyInstance(locale)”,因为我所有的消息都在ResourceBundle中。有什么原因不能使用JDK版本吗?顺便问一下:有没有什么具体的原因让你不能使用
NumberFormat.getCurrencyInstance(locale)
?我想使用ICU有两个原因。首先,我们的应用程序需要在不同的语言环境中打印某些货币,这在JDK版本中是不可能的(货币必须独立于当前的语言环境),其次,ICU有详细的格式,也必须在不同的语言环境中打印。我不想使用'NumberFormat.getCurrencyInstance(locale'),因为我所有的消息都在ResourceBundle中。感谢您的快速帮助。我没有充分描述我的问题。在我们的系统中,我们生成了许多文档,这些文档需要符合正式的指导原则。一些金额需要在美分部分不包含任何内容(例如,对于波兰来说,正式的方式是在美分部分添加2个数字,但我们需要将其减少),但在其他情况下,我们坚持标准的货币表示方式。因此,在系统范围的格式化程序上设置小数位数不是一个选项。在java中为从ResourceBundle获取的单个消息创建不同的格式化程序将是一件痛苦的事情。让我先解释一下为什么您的解决方案不起作用:[CurrencyAmount不是从Number派生的,因此在格式化过程中将调用plain toString()