Javascript number.toLocaleString currency without currency s



假设我们有

var number = 123456.789;

我想要的是将此数字显示在区域设置"de-DE"中

123.456,79

在区域设置"ja-JP"中为

123,457

在区域设置"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选项尝试了与上述相同的值,但结果相同。

>更新(2020-11-25(

几个人指着.resolvedOptions().它基本上解决了这个问题:

const currencyFractionDigits = new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
}).resolvedOptions().maximumFractionDigits;
const value = (12345.678).toLocaleString('de-DE', {
maximumFractionDigits: currencyFractionDigits 
});
console.log(value); // prints 12.345,68

谢谢。

无法将参数传递给toLocaleString并删除货币符号。 因此,请改用此函数。

var convertedNumber = num.toLocaleString('de-DE', { minimumFractionDigits: 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')

编辑:在这种情况下,唯一的缺点是速度。在简单的任务中,它将完美运行。但是,如果您要格式化大量数字(例如,如果您从后端获取包含原始数据的财务报表,然后根据用户设置格式化数字(,则此功能可能会显着减慢您的算法并成为某些浏览器的瓶颈。因此,在生产中使用之前,请仔细测试它。

这是一个不使用正则表达式的解决方案,可以正确处理任何语言环境。

它使用区域设置的货币格式化程序,并迭代它的所有部分以正确排除文字和货币,导致仅将数字作为字符串获取。(顺便说一句,文字是数字和货币符号之间的空格(。

const value = new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
}).formatToParts(12345.678).map(
p => p.type != 'literal' && p.type != 'currency' ? p.value : ''
).join('')
console.log(value) // prints 12.345,68

您可以使用currencyDisplay: 'code'选项,并且由于您知道货币代码,因此可以轻松地将其替换为所需的符号:

return Intl.NumberFormat(language, {
style: 'currency', currency: currency.code, currencyDisplay: 'code'
}).format(amount).replace(currency.code, currency.symbol);

这样,您就可以保留NumberFormat中隐含的所有货币格式标准,并仅替换符号。在您的情况下,自定义符号将是一个空字符串 (''(,您可能也想用.trim()修剪字符串。

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())

OP 答案略有不同,包括最小分数位数

const resolvedOptions = new Intl.NumberFormat('en-GB', { style: 'currency', currency: 'GBP', }).resolvedOptions();
const currencyOptions = {
minimumFractionDigits: resolvedOptions.minimumFractionDigits,
maximumFractionDigits: resolvedOptions.maximumFractionDigits
}
const value = (12345.678).toLocaleString('en-GB', currencyOptions)

我通过搜索这个用例找到了这个线程,以及我使用类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

我不测试这个类是否支持跨浏览器

编辑: 从中获取货币符号的函数 获取区域设置的货币符号

你只需要用符号拆分字符串,然后获取数组的第二个值。

// value 350011
const valueFormated = (value).toLocaleString('en-US', {
style: 'currency',
currency: 'USD',
});
valueFormated.split('$')
// if you console.log the result would be
(2) ['', '3,500.11']
// here is the value formated
valueFormated.split('$')[1]
// 3,500.11

你需要货币符号吗?如果没有,number.toLocaleString('de-DE')应该做这个伎俩。

const locale = 'en-US';
const currency = 'USD';
const getCurrencySymbol = () =>
(0)
.toLocaleString(locale, {
style: 'currency',
currency: currency,
maximumFractionDigits: 0,
minimumFractionDigits: 0,
})
.replace(/d/g, '')
.trim();
const formattedNumberWithoutSymbol = new Intl.NumberFormat(locale, {
style: 'currency',
currency: currency,
}).format(499.99).replace(getCurrencySymbol(), '');
console.log(formattedNumberWithoutSymbol);

只需将选项设置为:

{ 最小分数位数: 2, 最大分数位数: 2 }

const s = 1234.567 
const options = { minimumFractionDigits: 2, maximumFractionDigits: 2 }
const result = new Intl.NumberFormat('pt-BR', options).format(s);

根据MDN,您可以使用以下格式

new Intl.NumberFormat('de-DE', { maximumSignificantDigits: 3 }).format(number))

仅使用最大有效位数选项

由于您知道正在格式化的货币符号,因此您可以使用 根据货币符号及其位置相应地.substring(n)

这是你需要做的

new Intl.NumberFormat("en-US").format(6700); //return 6,700.00 without currency,

最新更新