如何在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
相关产品推荐
相关产品推荐

