没有货币符号的Javascript number.toLocaleString货币

时间:2017-07-07 11:38:19

标签: javascript localization formatting currency

假设我们有

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

8 个答案:

答案 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

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

编辑: 从Get the currency symbol for a locale

获取货币符号的函数

答案 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()来修剪字符串。