javascript - 相同字符串值的两个实例不相等
问题描述
格式化为货币样式字符串的数字返回值与预期值不相等。
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"
问题:为什么两个相似的字符串不相等?
解决方案
Intl.NumberFormat
返回具有不间断空格(160 个字符代码)的字符串,而您的expected
字符串具有正常空格(32 个字符代码)。
expected[5] === formatted[5]
// 错误的
看看这个线程: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);
(提示:最好将其提取到一个单独的函数中,该函数将字符串归一化空格)
推荐阅读
- php - mysqli_real_escape_string runs the script
- sql - 如何用case语句优化左外连接?
- identityserver4 - 访问 API 时,收到 500 Internal Server Error。从 Identity Server4 登录表单成功登录并重定向到 Angular 前端后
- matlab - 以像素为中心的小邻域
- c++ - 使用 OCCI c++ 在 Oracle 数据库中批量写入
- google-bigquery - firebase crashlytics 项目的访问权限
- xslt - xsl string-join() 强制包含空值
- android - 如何以 MVVM 模式在 android 中实现实时地图定位?
- jestjs - 无法期望具有不同参数的`toHaveBeenNthCalledWith`
- qubole - 在 testdrive 帐户中休息 api?