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

且听风鸣
  • 27

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

回复
阅读 375
2 个回答

后端懒成这样了么……

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

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

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏