You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:54:37