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,
typeofrenvoie le même type (string) pour les deux valeurs.comme vous vous dites que
new Intl.NumberFormatrenvoie12.09alors 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.