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?
3 Réponses :
Le caractère d'espace dans formaté
est 0xC2A0
et dans attendu
c'est 0x20
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)
Une autre idée, plutôt que de remplacer, changez simplement la chaîne en -> 12,09 \ xa0 €
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))
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
renvoie12.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.