如何在JSONata及JSON中实现数字缩写显示(如1000→1k、100万→1M)
数字缩写显示的实现方案(JSONata + JSON场景)
一、JSONata中实现数字缩写显示
可以通过自定义JSONata函数实现数字到缩写字符串的转换,核心逻辑是根据数值范围匹配对应的后缀(k/M),并完成数值缩放。
基础实现(整数缩写)
创建一个abbreviateNumber函数,对不同区间的数值做处理:
abbreviateNumber := function($num) { $num < 1000 ? $string($num) : $num < 1000000 ? $string($round($num / 1000)) & "k" : $string($round($num / 1000000)) & "M" }
- 小于1000的数值直接转为字符串保留原数
- 1000~999999的数值除以1000取整,拼接"k"
- 1000000及以上的数值除以1000000取整,拼接"M"
带小数的实现(更精细的显示)
如果需要保留一位小数(如1250显示为1.3k),可以用$formatNumber控制格式:
abbreviateNumber := function($num) { $num < 1000 ? $string($num) : $num < 1000000 ? $formatNumber($num / 1000, "0.0") & "k" : $formatNumber($num / 1000000, "0.0") & "M" }
使用示例
将函数应用到JSON数据的字段上:
{ "videoViews": abbreviateNumber(123456), "totalEarnings": abbreviateNumber(789000000) }
输出结果:
{"videoViews": "123k", "totalEarnings": "789.0M"}
二、JSON中以缩写形式替代完整数值
根据场景不同,分为生成JSON时直接生成缩写和处理已有JSON替换数值两种方案:
1. 生成JSON时直接生成缩写字符串
以JavaScript为例,先定义缩写函数,再将数值转换后写入JSON:
function abbreviateNumber(num) { if (num < 1000) return num.toString(); if (num < 1000000) return (num / 1000).toFixed(0) + 'k'; return (num / 1000000).toFixed(0) + 'M'; } // 生成带缩写的JSON const userData = { "followers": abbreviateNumber(10000), "postImpressions": abbreviateNumber(123000000) }; console.log(JSON.stringify(userData)); // 输出: {"followers":"10k","postImpressions":"123M"}
2. 处理已有JSON替换数值
如果已有包含原始数值的JSON,可通过递归遍历将数值字段替换为缩写字符串:
function abbreviateNumber(num) { if (typeof num !== 'number') return num; if (num < 1000) return num.toString(); if (num < 1000000) return (num / 1000).toFixed(1) + 'k'; return (num / 1000000).toFixed(1) + 'M'; } function transformJson(obj) { for (const key in obj) { if (typeof obj[key] === 'object' && obj[key] !== null) { transformJson(obj[key]); // 递归处理嵌套对象 } else if (typeof obj[key] === 'number') { obj[key] = abbreviateNumber(obj[key]); } } return obj; } // 示例:转换已有JSON const originalStats = { "socialMetrics": { "likes": 2500, "shares": 156000, "comments": 890 }, "totalRevenue": 456700000 }; const transformedStats = transformJson(originalStats); console.log(JSON.stringify(transformedStats)); // 输出: {"socialMetrics":{"likes":"2.5k","shares":"156.0k","comments":"890"},"totalRevenue":"456.7M"}
内容的提问来源于stack exchange,提问作者Shree
相关产品推荐
相关产品推荐

