假设我们有
var number = 123456.789;
我想要的是在区域设置'de-DE'中显示这个数字为
123.456,79
<\ n>在locale'ja-JP'中
123,457
<\ n>在语言环境'en-US'中作为
123,456.79
等根据用户的语言环境。问题是Javascript的number.toLocaleString
需要指定货币符号,而我根本无法告诉他们根本不显示货币符号。
我尝试了什么:
number.toLocaleString('de-DE', { style: 'currency' }));
// TypeError: undefined currency in NumberFormat() with currency style
number.toLocaleString('de-DE', { style: 'currency', currency: '' }));
// RangeError: invalid currency code in NumberFormat():
number.toLocaleString('de-DE', { style: 'currency', currency: false }));
// RangeError: invalid currency code in NumberFormat(): false
number.toLocaleString('de-DE', { style: 'currency', currency: null }));
// RangeError: invalid currency code in NumberFormat(): null
该功能还有选项currencyDisplay
。我使用currency
选项尝试了与上述相同的值,但结果相同。
答案 0 :(得分:2)
这是我解决此问题的方法。当我要格式化货币而没有任何标志时,可以使用货币代码对其进行格式化,然后从结果中删除3个字符的代码。
export function getCurrencyFormatWithSymbol(currencyCode) {
return {
style: 'currency',
currency: currencyCode,
currencyDisplay: 'symbol',
}
}
export function getCurrencyFormatWithIsoCode(currencyCode) {
return {
style: 'currency',
currency: currencyCode,
currencyDisplay: 'code',
}
}
export function getCurrencyFormatWithLocalName(currencyCode) {
return {
style: 'currency',
currency: currencyCode,
currencyDisplay: 'name',
}
}
export function getCurrencyFormatNumbersOnly(currencyCode) {
return {
style: 'currency',
currency: currencyCode,
currencyDisplay: 'none',
}
}
export function formatCurrency (value, format, lang) {
const stripSymbols = (format.currencyDisplay === 'none')
const localFormat = stripSymbols ? {...format, currencyDisplay: 'code'} : format
let result = Intl.NumberFormat(lang, localFormat).format(value)
if (stripSymbols) {
result = result.replace(/[a-z]{3}/i, "").trim()
}
return result
}
用法:
const format = getCurrencyFormatNumbersOnly('JPY')
formatCurrency(12345, format, 'ja')
formatCurrency(123456, format, 'ja')
formatCurrency(1234567, format, 'ja')
formatCurrency(12345678, format, 'ja')
答案 1 :(得分:1)
这是一种不使用正则表达式的解决方案,可以正确处理任何语言环境。
它使用格式化程序从本地化的货币数字格式中提取数字选项,并将其与调整后的 style 一起传递给 toLocaleString 函数,以避免返回货币符号。
const currencyOptions = new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
}).resolvedOptions();
const value = (12345.678).toLocaleString('de-DE', {
...currencyOptions,
style: 'decimal',
});
console.log(value); // prints 12.345,68
答案 2 :(得分:0)
你需要货币符号吗?如果不是number.toLocaleString('de-DE')
应该做的话。
答案 3 :(得分:0)
我通过搜索此用例找到了这个线程,我使用了 Intl.NumberFormat 类使用的技巧,并在Mozilla Firefox和Google Chrome浏览器上支持了符号正则表达式。并将其用作本地化后正则表达式替换的针头。
此示例代码应该可以解决问题:
var number = 123456.789;
function getCurrencySymbol(locale, currency) {
return (0).toLocaleString(locale, {
style: 'currency',
currency: currency,
minimumFractionDigits: 0,
maximumFractionDigits: 0
}).replace(/\d/g, '').trim();
}
var numeric_format = new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', currencyDisplay: 'symbol' });
var localCurrencySymbol = getCurrencySymbol('id-ID', 'IDR');
var CurrencySymbolNeedle = new RegExp(localCurrencySymbol, "g");
var amount = numeric_format.format(number);
console.log(localCurrencySymbol); // Rp
console.log(amount); // Rp 123.456,79
amount = amount.replace(CurrencySymbolNeedle, '').replace(/\s+/g, '');
console.log(amount); // 123.456,79
我不测试此类是否支持跨浏览器
获取货币符号的函数答案 4 :(得分:0)
只需将选项设置为:
{minimumFractionDigits:2,maximumFractionDigits:2}
const s = 1234.567
const options = { minimumFractionDigits: 2, maximumFractionDigits: 2 }
const result = new Intl.NumberFormat('pt-BR', options).format(s);
答案 5 :(得分:0)
OP 中提出的解决方案不适用于 fr-CH
语言环境,因为“货币金额”和“非货币金额”之间存在区别。前者使用点作为小数点分隔符,而后者使用逗号:
const n = 1234.56
console.log(n.toLocaleString('fr-CH'))
console.log(n.toLocaleString('fr-CH', {
style: 'currency',
currency: 'CHF'
}))
将 .replace()
与正则表达式或直接与货币代码一起使用似乎是最快的解决方案,但这里是使用 NumberFormat 的 .formatToParts()
函数以及如何使用它来解决问题的解决方案OP 的问题:
console.log(new Intl
.NumberFormat('fr-CH', { style: 'currency', currency: 'CHF' })
.formatToParts(1234.56) // returns an array of the different parts of the amount
.filter(p => p.type != 'currency') // removes the currency part
.reduce((s, p) => s + p.value, '') // joins the remaining values
.trim())
答案 6 :(得分:-1)
无法将参数传递给toLocaleString
并删除货币符号。所以请改用此功能。
var convertedNumber = num.toLocaleString('de-DE', { minimumFractionDigits: 2 });
答案 7 :(得分:-1)
您可以使用currencyDisplay: 'code'
选项,由于您知道货币代码,因此可以轻松地将其替换为所需的符号:
return Intl.NumberFormat(language, {
style: 'currency', currency: currency.code, currencyDisplay: 'code'
}).format(amount).replace(currency.code, currency.symbol);
这样,您将保留NumberFormat
中暗含的所有货币格式标准,并仅替换符号。在您的情况下,自定义符号将是一个空字符串(''
),并且您可能还希望使用.trim()
来修剪字符串。