字符串值相同的两个实例不相等

时间:2019-03-25 10:18:50

标签: javascript typescript jasmine

格式化为货币样式字符串的数字返回的值不等于预期值。

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"

问题:为什么两个相似的字符串不相等?

3 个答案:

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