JavaScript number.toLocaleString货币,不带货币符号

dMe*_*dia 8 javascript formatting localization currency

假设我们有

var number = 123456.789;
Run Code Online (Sandbox Code Playgroud)

我要在区域设置“ de-DE”中显示此数字为

123.456,79
Run Code Online (Sandbox Code Playgroud)

在语言环境“ ja-JP”中为

123,457
Run Code Online (Sandbox Code Playgroud)

在“ en-US”语言环境中

123,456.79
Run Code Online (Sandbox Code Playgroud)

依使用者的地区而定。问题是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
Run Code Online (Sandbox Code Playgroud)

该功能还具有选项currencyDisplay。我用currencyoption 尝试了与上面相同的值,但结果相同。

小智 8

无法将参数传递给toLocaleString和删除货币符号。所以改用这个函数。

var convertedNumber = num.toLocaleString('de-DE', { minimumFractionDigits: 2 });

  • `new Intl.NumberFormat('en-US', { style: 'currency',currency: 'USD' }).resolvedOptions()` 将返回一个描述如何格式化数字的对象,包括 `minimumIntegerDigits`、`minimumFractionDigits` 和`maximumFractionDigits` 字段 (4认同)
  • 我知道在哪里传递小数位。我不知道如何在 javascript 中获取该数字。 (2认同)

Ale*_*din 6

在这里我如何解决这个问题。当我想格式化没有任何符号的货币时,我用货币代码对其进行格式化,然后从结果中删除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
}
Run Code Online (Sandbox Code Playgroud)

用法:

const format = getCurrencyFormatNumbersOnly('JPY')
formatCurrency(12345, format, 'ja')
formatCurrency(123456, format, 'ja')
formatCurrency(1234567, format, 'ja')
formatCurrency(12345678, format, 'ja')
Run Code Online (Sandbox Code Playgroud)

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


mod*_*diX 5

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

它使用语言环境的货币格式化程序并迭代它的所有部分以正确地排除文字和货币,导致仅以字符串形式获取数字。(顺便说一句,文字是数字和货币符号之间的空格)。

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
Run Code Online (Sandbox Code Playgroud)


小智 0

您需要货币符号吗?如果没有,number.toLocaleString('de-DE')应该解决这个问题。

  • 我如何知道语言环境的货币小数位数?可能是 0、2 或 3:https://www.currency-iso.org/en/home/tables/table-a1.html (4认同)
  • @dMedia。`new Intl.NumberFormat('en', { style: 'currency',currency: 'EUR', }).resolvedOptions().maximumFractionDigits` (2认同)