前端处理long整型精度丢失问题-正则

发布于 2022-09-13 01:25:29 字数 111 浏览 36 评论 0

后端同学抛给了我一串前端处理long精度丢失代码,看不懂这个正则表达式,在线求解下:
image.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

_蜘蛛 2022-09-20 01:25:30

后端懒成这样了么……

就是先把响应当成纯文本处理,先不反序列化。然后正则替换每个“冒号+至少17位整数”(看你之前的问题你们不是16位数么,这块得改一下),变成“冒号+双引号+@rr:+数字+双引号”,然后再把 @rr: 替换没(其实我也没懂为啥要这么分步替换)。

下面还有一个正则是替换小数的,把小数也前后加上双引号,步骤跟上面同理。

'{ "value":1234567890987654321 }' 
// 变成
'{ "value":"1234567890987654321" }'

// 前者反序列化得到的是:
{ value: 1234567890987654400 } // 精度已经丢失
// 后者反序列化得到的是:
{ value: '1234567890987654321' } // 字段类型变字符串

后面都当成字符串操作就没有所谓精度问题了。但你注意后面你别再给 +value 或者 parseInt(value) 转回 number 类型了,那就又丢失精度了。

P.S. 这段正则其实有漏洞,就是要求 JSON 的 KeyValue 之间不能有空格才行,它只能替换 {"value":1234567890987654321},却不能识别 {"value": 1234567890987654321}……再一个问题是如果你们某个字段本身的值就是冒号+整数这样的形式,它也会给替换掉导致最后结果出错。

帅哥哥的热头脑 2022-09-20 01:25:30

都是通过正则表达式进行替换操作.
c1例子:
replace(/:\d{17,}/g,':"@rr$&"') :进行全局匹配操作,将 内容形式是 :后面至少17个数字组合 的这种内容形式替换为:"@rr$&" 这种内容
正则中 \s表示匹配空白字符(空格符、制表符、回车符、换行符、垂直换行符、换页符)
replace(/@rr:\s/g,''):进行全局匹配,将内容 @rr:(空格符、制表符、回车符、换行符、垂直换行符、换页符) 全部替换为''.
replace(/@rr:/g,''):进行全局匹配,将内容 @rr: 全部替换为'' .
c2的和c1类似

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文