Flutter实现字符串字符切片:4位及以上数字末尾替换为k并转字符串
Flutter 数字千位转k后缀实现方案
实现思路
完全基于字符串切片操作完成,不依赖数值除法运算,逻辑如下:
- 先将输入数字转为整数字符串,负数单独标记符号位,避免符号占用字符位影响长度判断
- 字符串长度小于4(即数字值小于1000)时,直接返回原数字的字符串结果
- 字符串长度≥4时,将末尾3个对应千位的字符切掉,替换为字符
k;如果需要保留1位小数提升可读性,可多取1位原字符作为小数位拼接,小数位为0时自动省略 - 最后补全负数符号位,返回最终字符串结果
代码实现
版本1:直接替换末尾3位为k(无小数)
完全匹配“末尾数位替换为k”的要求,实现最简洁:
String formatNumWithKSuffix(num inputNum) { // 数字转整数字符串,自动处理浮点数四舍五入 String numStr = inputNum.round().toString(); // 不足4位直接返回 if (numStr.length < 4) return numStr; // 切片切掉最后3位,拼接k return '${numStr.substring(0, numStr.length - 3)}k'; }
该版本效果示例:
- 输入
999→ 返回"999" - 输入
1000→ 返回"1k" - 输入
1899→ 返回"1k" - 输入
24500→ 返回"24k" - 输入
-362100→ 返回"-362k"
版本2:保留1位小数(常用展示场景)
如果需要更精确的展示效果,可在切片时多取一位作为小数部分:
String formatNumWithKSuffix(num inputNum) { // 标记负数 bool isNegative = inputNum < 0; String numStr = inputNum.round().abs().toString(); if (numStr.length < 4) { return isNegative ? '-$numStr' : numStr; } int splitPos = numStr.length - 3; String integerPart = numStr.substring(0, splitPos); String decimalPart = numStr.substring(splitPos, splitPos + 1); String res; // 小数位为0时省略 if (decimalPart == '0') { res = '${integerPart}k'; } else { res = '${integerPart}.${decimalPart}k'; } return isNegative ? '-$res' : res; }
该版本效果示例:
- 输入
999→ 返回"999" - 输入
1000→ 返回"1k" - 输入
1899→ 返回"1.8k" - 输入
24500→ 返回"24.5k" - 输入
-362100→ 返回"-362k"
注意:如果输入是double类型且需要保留原有小数位,先调用
toStringAsFixed(0)转成无小数的字符串再走切片逻辑即可,避免小数点占用字符长度导致切片位置错误。
内容的提问来源于stack exchange,提问作者sebdoy
相关产品推荐
相关产品推荐

