1
votes

Deux instances de la même valeur de chaîne ne sont pas égales

Le nombre mis en forme avec la chaîne de style monétaire renvoie une valeur non équivalente à celle attendue.

new Intl.NumberFormat(`de-De`, { style: `currency`, currency: `EUR` }).format(12.09); 
// returns "12,09 €"

`12,09 €` === `12,09 €`; // true

typeof formatted; // "string"

Mais

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 €';

Question: pourquoi deux similaires les chaînes ne sont pas égales?


7 commentaires

essayez de faire typeof de variables formatées et attendues dans le premier cas. Ils sont probablement différents, ce qui donne du faux à condition.


@KaushaShah, ajout de valeurs consignées à la question, typeof renvoie le même type ( string ) pour les deux valeurs.


comme vous vous dites que new Intl.NumberFormat renvoie 12.09 alors comment peut-il être égal à 12.09 €


@ShadabAhmed - faute de frappe, corrigé


essayez ce 'formaté.replace (/ \ s + / g, "")', cela l'a corrigé pour moi. J'espère que ça marche pour toi.


@NakulGawande il devrait plutôt remplacer dans la chaîne attendue, pas dans une chaîne formatée. Un espace insécable est là pour une raison.


@AdamWolski est vrai. Je lui donnais juste une idée de ce qui ne va pas et de ce qui pourrait résoudre son problème. Toutes mes excuses.


3 Réponses :


3
votes

Le caractère d'espace dans formaté est 0xC2A0 et dans attendu c'est 0x20


0 commentaires

5
votes

Intl.NumberFormat renvoie une chaîne avec un espace insécable (code 160 caractères) tandis que votre chaîne attendue a un espace normal (code 32 caractères).

attendu [5] === formaté [5] // false

Jetez un œil à ce fil de discussion: https://github.com/nodejs/node/issues/24674

Je pense que vous pouvez contourner cela simplement avec Fonction remplacer . Tels que:

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);

(Astuce: ce serait une bonne idée d'extraire ceci dans une fonction séparée qui prend une chaîne pour normaliser les espaces)


1 commentaires

Une autre idée, plutôt que de remplacer, changez simplement la chaîne en -> 12,09 \ xa0 €



0
votes

Parce que si vous cochez la chaîne échappée attendue, il y a % 20 qui est un espace et formaté a $ A0 qui est vide.

Vous pouvez vérifier le codage à partir d'ici :

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


0 commentaires