除了猜测之外(就像我下面所做的那样),有没有一种更直接、更有效的方法来反射性地检索JavaScript环境支持的所有货币的列表?
function getSupportedCurrencies() {
function $(amount, currency) {
let locale = 'en-US';
let options = {
style: 'currency',
currency: currency,
currencyDisplay: "name"
};
return Intl.NumberFormat(locale, options).format(amount);
}
const getAllPossibleThreeLetterWords = () => {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const arr = [];
let text = '';
for (let i = 0; i < chars.length; i++) {
for (let x = 0; x < chars.length; x++) {
for (let j = 0; j < chars.length; j++) {
text += chars[i];
text += chars[x];
text += chars[j];
arr.push(text);
text = '';
}
}
}
return arr;
};
let ary = getAllPossibleThreeLetterWords();
let currencies = [];
const rx = /(?<= ).+/; // This line doesn't work in Firefox versions older than version 78 due to bug 1225665: https://bugzilla.mozilla.org/show_bug.cgi?id=1225665
ary.forEach((cur) => {
let output = $(0, cur).trim();
if (output.replace(/^[^ ]+ /, '') !== cur) {
let obj = {};
obj.code = cur;
obj.name = output.match(rx)[0];
currencies.push(obj);
}
});
return currencies;
}
console.log(getSupportedCurrencies());
字符串
更新:
JavaScript规范已经通过Intl.supportedValuesOf("currency")
得到了增强,提供了一种更有效的方法来直接从您的环境中检索支持的货币列表。这一添加显著简化了列出货币所需的方法,如下面更新的代码片段所示。
function getSupportedCurrencies() {
function $(amount, currency) {
let locale = 'en-US';
let options = {
style: 'currency',
currency: currency,
currencyDisplay: "name"
};
return Intl.NumberFormat(locale, options).format(amount);
}
let currencies = [];
const supportedCurrencies = Intl.supportedValuesOf('currency');
const rx = /(?<= ).+/;
supportedCurrencies.forEach((cur) => {
let output = $(0, cur).trim();
let obj = {};
obj.code = cur;
obj.name = output.match(rx)[0];
currencies.push(obj);
});
return currencies;
}
console.log(getSupportedCurrencies());
型
这种更新的方法消除了对货币代码的“蛮力猜测”的需要,并且它的执行速度明显更快。
2条答案
按热度按时间mwngjboj1#
现在,详尽的测试,正如公认的答案所提供的那样,可能是这里最合理的实际策略。此外,新货币不会出现,旧货币也不会以特定的频率死亡。任何实施所支持的货币都是最新的,几乎总是会反映现实。所以尝试和观察的方法真的不会失败。
但是从规范方面进一步阐述,规范实际上只关心货币是否“格式良好”:三个ASCII字母。如果生成的代码是已知的货币,你会得到合适的行为。否则,你会得到大致优雅的回退到代码本身。所以没有必要公开支持的列表:货币代码至少对许多用户来说是相对可理解的事情,因为在大多数UI中看到诸如“3 USD”或“5 CAD”之类的东西,其中涉及价格或成本,通常会暗示用户的货币。
然而,在未来,一个公开可识别货币集的spec proposal正在走向标准化。最初的实现可能会在2021年底之前开始出现在Web浏览器的JS实现中,让你这样做:
字符串
3duebb1j2#
您可以通过以下XML加载已知列表:
https://www.currency-iso.org/dam/downloads/lists/list_one.xml
列表显示:https://www.currency-iso.org/en/home/tables/table-a1.html
字符串
如果你仍然想生成代码,你可以使用产品迭代。
下面是基于Python的
itertools.product
函数。型
Demo
的字符串