格式化为货币样式字符串的数字返回的值不等于预期值。
const expected = `12,09 €`;
const formatted =
new Intl.NumberFormat(`de-De`, { style: `currency`, currency: `EUR` }).format(12.09);
expect(formatted).toEqual(expected); // Fail
expected === formatted; // false
// Logged values
console.log(`FORMATTED: type = ${typeof formatted}, value = '${actual}';`);
console.log(`EXPECTED: type = ${typeof expected}, value = '${expected}';`);
// FORMATTED: type = string, value = '12,09 €';
// EXPECTED: type = string, value = '12,09 €';
但是
new Intl.NumberFormat(`de-De`, { style: `currency`, currency: `EUR` }).format(12.09);
// returns "12,09 €"
`12,09 €` === `12,09 €`; // true
typeof formatted; // "string"
问题:为什么两个相似的字符串不相等?
答案 0 :(得分:4)
Intl.NumberFormat
返回一个具有不间断空格(160个字符代码)的字符串,而您的expected
字符串具有一个普通空格(32个字符代码)。
expected[5] === formatted[5]
//假
看看这个线程:https://github.com/nodejs/node/issues/24674
我认为您可以使用replace
函数来解决此问题。如:
const expected = `12,09 €`.replace(/\s/, String.fromCharCode(160));
const formatted =
new Intl.NumberFormat(`de-De`, {
style: `currency`,
currency: `EUR`
}).format(12.09);
console.log(expected === formatted);
(提示:将其提取到一个单独的函数中是一个好主意,该函数需要一个字符串来规范化空格)
答案 1 :(得分:3)
formatted
中的空格字符为0xC2A0
,在expected
中的空格字符为0x20
答案 2 :(得分:0)
因为如果检查转义的字符串,期望的%20
是空格,而格式化的$ A0是空白。
您可以检查编码from here:
const expected = `12,09 €`;
const formatted =
new Intl.NumberFormat(`de-De`, {
style: `currency`,
currency: `EUR`
}).format(12.09);
console.log(escape(expected))
console.log(escape(formatted))