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

如何在Flutter和Dart中不使用intl包实现数字千分位及自定义模式分隔

Flutter/Dart 无依赖自定义字符串/数字分组格式化

核心实现(String扩展)

通过扩展String类实现两种分组格式化逻辑,完全不依赖第三方包:

extension StringFormatting on String {
  // 处理带符号、小数的数字字符串分组(如千分位)
  String formatNumberGroup({String separator = ',', int groupSize = 3}) {
    String sign = '';
    String integerPart = this;
    String decimalPart = '';

    // 提取正负号
    if (startsWith('-') || startsWith('+')) {
      sign = substring(0, 1);
      integerPart = substring(1);
    }

    // 拆分整数与小数部分
    if (integerPart.contains('.')) {
      final parts = integerPart.split('.');
      integerPart = parts[0];
      decimalPart = '.${parts[1]}';
    }

    // 整数部分从右往左分组
    final reversedInteger = integerPart.split('').reversed.join();
    final groupedSegments = RegExp('.{1,$groupSize}')
        .allMatches(reversedInteger)
        .map((match) => match.group(0))
        .join(separator);
    final formattedInteger = groupedSegments.split('').reversed.join();

    return '$sign$formattedInteger$decimalPart';
  }

  // 纯数字字符串固定位数分组(支持左右方向)
  String formatFixedGroup({String separator = '-', int groupSize = 4, bool fromRight = false}) {
    // 可选:过滤所有非数字字符,如需保留原字符可删除此行
    final cleanStr = replaceAll(RegExp(r'\D'), '');
    if (cleanStr.length <= groupSize) return cleanStr;

    if (fromRight) {
      final reversed = cleanStr.split('').reversed.join();
      final grouped = RegExp('.{1,$groupSize}')
          .allMatches(reversed)
          .map((m) => m.group(0))
          .join(separator);
      return grouped.split('').reversed.join();
    } else {
      return RegExp('.{1,$groupSize}')
          .allMatches(cleanStr)
          .map((m) => m.group(0))
          .join(separator);
    }
  }
}

示例用法

直接调用扩展方法完成格式化:

void main() {
  // 千分位格式化(带符号和小数)
  print("+2500000.7550".formatNumberGroup()); // 输出: +2,500,000.7550

  // 4位一组短横线分隔(纯数字字符串)
  print("5674565544112211".formatFixedGroup()); // 输出: 5674-5655-4411-2211

  // 自定义:2位一组逗号分隔,从右往左分组
  print("12345678".formatFixedGroup(separator: ',', groupSize: 2, fromRight: true)); // 输出: 12,34,56,78
}

功能说明

  • formatNumberGroup:专为数字型字符串设计,自动识别并保留正负号、小数部分,仅对整数部分按指定位数从右往左分组
  • formatFixedGroup:适用于纯数字字符串,支持从左/从右分组,可自定义分隔符和每组位数,可选过滤非数字字符

内容的提问来源于stack exchange,提问作者Esmaeil Ahmadipour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:21:02