NumberFormat-Currency数字压缩问题:如何将27126677097.04转为27,127 MM?
解决NumberFormat.currency数字压缩格式化问题
你已经有了量级判断的逻辑(getSuffixObject),但核心问题是你没有将原始数字除以对应的量级除数,所以NumberFormat只会按原始大数字的格式输出,不会自动帮你压缩数值。
问题分析
你的目标是把27126677097.04转换成27,127 MM,本质是将原始数字除以1,000,000(百万)得到27126.677...,再四舍五入为整数后加上后缀MM。但当前代码直接格式化了原始数字,所以输出了完整的大数字格式。
修正步骤
- 先压缩数字:将原始数值除以
suffixOptions.number(也就是量级对应的除数,比如百万对应1e6) - 确保
getSuffixObject返回正确参数:对于你的目标数值,它应该返回:number: 1000000(1e6)suffix: "MM"format: {'maximumFractionDigits': 0, 'minimumFractionDigits': 0}(确保格式化后是整数)
- 用压缩后的数值进行格式化
修正后的代码示例
class SetValueClass extends HelperClass { SetValueClass() : super(); String transformValue({ required double number, bool? pasa, }) { number = 27126677097.04; SuffixOptions suffixOptions = getSuffixObject(number); if (pasa != null && pasa) { print(number); print(suffixOptions.name); print(suffixOptions.format); print(suffixOptions.number); print(suffixOptions.suffix); } // 关键:先将原始数字除以量级除数,得到压缩后的数值 final compressedNumber = number / suffixOptions.number; final numberFormat = NumberFormat.currency( locale: 'es_CO', symbol: suffixOptions.suffix, // 如果需要自定义千分位/小数分隔符(比如符合你期望的逗号千分位),可以添加customPattern // customPattern: '#,##0 ¤', ); numberFormat.maximumFractionDigits = suffixOptions.format['maximumFractionDigits']!; numberFormat.minimumFractionDigits = suffixOptions.format['minimumFractionDigits']!; return numberFormat.format(compressedNumber); } }
额外调整说明
- 默认
es_COlocale的千分位是点(.)、小数位是逗号(,),所以压缩后的27127会被格式化为27.127 MM。如果想要得到27,127 MM(逗号千分位),可以取消注释代码中的customPattern: '#,##0 ¤',这样会强制使用逗号作为千分位分隔符。 - 确保
getSuffixObject的逻辑正确匹配数值量级:比如当数值大于等于1e6时,返回对应的除数和后缀,避免出现量级错误。
内容的提问来源于stack exchange,提问作者Juan Camilo López Morales
相关产品推荐
相关产品推荐

