Intl.NumberFormat空格字符不匹配

时间:2019-01-17 18:21:59

标签: javascript

我遇到一个问题,其中Intl.NumberFormat正在以某种不同于Jest期望的方式格式化空格字符。测试相同的函数,其值不会产生空格,因为分隔符可以通过。笑话正在考虑4个字符和5个字符之间的空格不同。我在应用程序和测试中都将intl填充用于fr_CA。

这是我的功能,但唯一真正相关的部分是Intl.NumberFormat输出。如何协调空格字符的格式,以便测试通过?

  export function formatCurrency( num, locale = 'en_US', showFractionDigits = false) {
    const options = {
        style: locale === 'fr_CA' ? 'decimal' : 'currency',
        currency: locale.length && locale.indexOf('CA') > -1 ? 'CAD' : 'USD'
    };

    const final = new Intl.NumberFormat(locale.replace('_', '-'), options).format(num);

    if (locale === 'fr_CA') {
        return `${final} $`;
    } else {
        return final;
    }
  }

我的断言:

expect(formatCurrency(24555.55, 'fr_CA', true)).toBe('24 555,55 $');

结果:

Expected value to be:
  "24 555,55 $"
Received:
  "24 555,55 $"

2 个答案:

答案 0 :(得分:1)

'11 111.11'.split('').map(x => console.log((x.charCodeAt(0))))

将“ 32”表示为正常空格。

new Intl.NumberFormat('fr-CA').format(11111.11).split('').map(x => console.log((x.charCodeAt(0))))

空格字符为“ 160”,这是一个不间断空格。

要使这些测试通过,您需要在断言中添加不间断空格UTF-16(\ xa0)字符代码。

expect(formatCurrency(24555.55, 'fr_CA', true)).toBe('24\xa0555,55 $');

答案 1 :(得分:1)

NumberFormat将小的不间断空格(\u202f)用于千位分隔符,并使用普通的不间断空格优先货币(\xa0

  expect(new Intl.NumberFormat("fr-FR", {
    style: "currency",
    currency: "EUR",
  }).format(126126)).toBe("126\u202f126,00\xa0€")