Два экземпляра одинакового строкового значения не равны - PullRequest
1 голос
/ 25 марта 2019

Число, отформатированное в строку стиля валюты, возвращает значение, не эквивалентное ожидаемому.

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 ]

4 голосов
/ 25 марта 2019

Intl.NumberFormat возвращает строку с неразрывным пробелом (160-значный код), в то время как ваша строка expected имеет нормальный пробел (32-значный код).

expected[5] === formatted[5] // false

Взгляните на эту тему: 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);

(Подсказка: было бы неплохо извлечь это в отдельную функцию, которая принимает строку для нормализации пробелов)

3 голосов
/ 25 марта 2019

Пробел в formatted равен 0xC2A0, а в expected это 0x20

0 голосов
/ 25 марта 2019

Потому что, если вы проверите, ожидаемая экранированная строка имеет %20, что является пробелом, а отформатированный имеет $ A0, который является пустым.

Вы можете проверить кодировку здесь :

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...