Node.js如何在JSON文件中保留固定小数的科学计数法格式?
解决Node.js中JSON保留固定小数位科学计数法数字格式的问题
核心问题分析
JSON规范允许科学计数法格式的数字,但原生JSON.stringify不会按照固定小数位的科学计数法序列化数字——要么自动切换为普通十进制写法,要么省略末尾的零,无法满足下游应用的格式要求。同时,JSON字符串必须带双引号,因此“无引号的字符串形式”不符合JSON语法,只能实现数字类型的固定小数位科学计数法格式输出。
实现方案:自定义序列化+正则后处理
通过自定义JSON.stringify的replacer函数格式化数字,再用正则去掉多余的引号,得到符合要求的JSON内容:
代码示例
const fs = require('fs'); // 1. 读取并解析原始JSON const rawData = fs.readFileSync('input.json', 'utf8'); const data = JSON.parse(rawData); // 2. 修改目标值(示例:将value改为25678) data.value = 25678; // 3. 自定义replacer:将数字格式化为15位小数的科学计数法字符串 function formatSciNotation(key, value) { // 可根据需求调整:仅处理特定字段(如key为'value')或所有数字 if (typeof value === 'number') { // toExponential(15)生成15位小数的科学计数法,replace确保指数部分带+号 return value.toExponential(15).replace(/e(?=\d)/, 'e+'); } return value; } // 4. 先序列化为带引号的科学计数法字符串 let jsonStr = JSON.stringify(data, formatSciNotation, 2); // 5. 正则替换:去掉科学计数法字符串的双引号,转为合法的JSON数字格式 jsonStr = jsonStr.replace(/"(\d+\.\d{15}e\+\d{2})"/g, '$1'); // 6. 写入文件 fs.writeFileSync('output.json', jsonStr, 'utf8');
关键说明
toExponential(15):确保数字格式化为带15位小数的科学计数法,自动补全末尾的零,匹配示例中的格式。- 正则
/"(\d+\.\d{15}e\+\d{2})"/g:精准匹配目标格式的字符串,替换后转为无引号的数字类型,符合JSON语法规范。 - 若只需处理特定字段,可在replacer中添加key判断(如
if (key === 'value' && typeof value === 'number')),避免影响其他数字。
验证
生成的JSON内容如下,可被下游应用正常解析:
{ "value": 2.567800000000000e+04 }
内容的提问来源于stack exchange,提问作者fa__
相关产品推荐
相关产品推荐

