Javascript 相同字符串值的两个实例不相等
格式化为货币样式字符串的数字返回的值与预期值不相等Javascript 相同字符串值的两个实例不相等,javascript,typescript,jasmine,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 // Log
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 €';
但是
问题:为什么两个相似的字符串不相等?格式化的
中的空格字符是0xC2A0
而预期的0x20
格式化的中的空格字符是0xC2A0
而预期的中的空格字符是0x20
Intl.NumberFormat
返回一个字符字符串具有非中断空格(160字符代码),而预期的字符串具有正常空格(32字符代码)
应为[5]==格式化的[5]
//错误
看看这条线:
我认为您只需使用replace
函数即可解决此问题。例如:
const expected=`12,09€`.replace(/\s/,String.fromCharCode(160));
常量格式=
新的Intl.NumberFormat(`de`{
样式:`currency`,
货币:欧元`
}).格式(12.09);
console.log(预期==格式化)
Intl.NumberFormat
返回一个带有不间断空格(160字符代码)的字符串,而您的预期的字符串具有正常空格(32字符代码)
应为[5]==格式化的[5]
//错误
看看这条线:
我认为您只需使用replace
函数即可解决此问题。例如:
const expected=`12,09€`.replace(/\s/,String.fromCharCode(160));
常量格式=
新的Intl.NumberFormat(`de`{
样式:`currency`,
货币:欧元`
}).格式(12.09);
console.log(预期==格式化)代码>,因为如果您检查转义字符串的预期值为%20
,该值为空格且已格式化,则该值为$A0,该值为空
您可以检查编码:
const expected=`12,09€`;
常量格式=
新的Intl.NumberFormat(`de`{
样式:`currency`,
货币:欧元`
}).格式(12.09);
控制台日志(转义(预期))
log(转义(格式化))
因为如果您检查转义字符串,则预期的是%20
,它是空格,格式化后的是$A0,它是空的
您可以检查编码:
const expected=`12,09€`;
常量格式=
新的Intl.NumberFormat(`de`{
样式:`currency`,
货币:欧元`
}).格式(12.09);
控制台日志(转义(预期))
log(escape(formatted))
在第一种情况下,尝试执行格式化变量和预期变量的typeof。可能它们不同,条件为false。@KaushaShah在问题中添加了记录值,typeof
返回相同的类型(string
)对于这两个值。正如您自己所说的那样,new Intl.NumberFormat
retruns12.09
,那么如何才能与12.09€
@ShadabAhmed-typo相同呢,fixed@NakulGawande他应该替换预期字符串,而不是格式化字符串。有一个不间断的空格是有原因的。在第一种情况下,尝试使用格式化的和预期的变量类型。可能它们不同,条件为false。@KaushaShah在问题中添加了记录值,typeof
返回相同的类型(string
)对于这两个值。正如您自己所说的那样,new Intl.NumberFormat
retruns12.09
,那么如何才能与12.09€
@ShadabAhmed-typo相同呢,fixed@NakulGawande他应该替换预期字符串,而不是格式化字符串。不间断空格的存在是有原因的。另一个想法,而不是替换,只需将字符串更改为->12,09\xa0€
另一个想法,而不是替换,只需将字符串更改为->12,09\xa0€
new Intl.NumberFormat(`de-De`, { style: `currency`, currency: `EUR` }).format(12.09);
// returns "12,09 €"
`12,09 €` === `12,09 €`; // true
typeof formatted; // "string"