如何为Java 7中的现有国家/地区代码添加新的Currency到java.util.Currency?

例如,中国货币的ISO 4217代码为CNY 。 由于该货币的自由全球交易受到限制,因此存在第二个“离岸”货币等价物,称为CNH 。 维基百科对这一切有一点总结 。

Java 7 ,有一种方法可以更新 JVM附带的三个字母ISO 4217代码集。 但是,它不能用于向现有国家/地区代码添加单独的货币代码:它会用CNH取代CNY ,这对我的目的不利。

如何在不覆盖CNY情况下将CNH (不在ISO 4217列表中)添加到Java 7的可用货币集中?

换句话说,如何为一个国家/地区获取多种货币代码?

请注意,这个问题: 如何将新货币代码添加到Java? 被问到并回答Java 6 。 但是替换java.util.CurrencyData的策略不起作用,因为该文件不再存在。

这里的关键是改变Java 7的一部分,允许更新货币列表而无需通过替换名为currency.data的文件来重建rt.jar。 使用此方法而不是currency.properties覆盖方法,允许您添加新的货币代码,而不会影响来自同一国家/地区的其他货币代码。

什么是未说明的,如何实际建立一个新的currency.data 。 此文件是从名为CurrencyData.properties的文件生成的,该文件可以在java / util的OpenJDK源代码中找到。

我所做的是复制OpenJDK源中的CurrencyData.propertiesopenjdk\jdk\src\share\classes\java\util ),并更改了该行:

 BZD084-CAD124-CDF976-CHF756-CLF990-CLP152-CNY156-COP170-CRC188-CSD891-CUP192-\ 

 BZD084-CAD124-CDF976-CHF756-CLF990-CLP152-CNH156-CNY156-COP170-CRC188-CSD891-CUP192-\ 

然后我在openjdk\jdk\make\tools\src\build\tools\generatecurrencydata中获取了源代码发行版中的GenerateCurrencyData.java文件。 此实用程序以与CurrencyData.properties相同的格式从System.In获取输入,并将其转换为currency.data文件。 我稍作改动,以便它使用FileInputStream而不是System.In:

 currencyData.load(System.in); 

 currencyData.load(new FileInputStream(fileName)); 

在您编辑的CurrencyData.properties文件中运行该文件,并将原始.data文件放在安全的地方后,将生成的currency.data文件放入JRE \ lib目录,然后您就可以运行使用Currency.getInstance("CNH")代码Currency.getInstance("CNH")

致@sharakan答案:您可能还需要添加新更改的货币,在我的情况下是BYN

BY = BYR; 2016-07-01-00-00-00; BYN

格式为:OLD_CUR; DATE_OF_CHANGE; NEW_CUR

希望它会帮助某人。