Flutter中如何对存储为字符串、含K后缀的数字值进行升序排序
问题原因
直接调用compareTo走的是字符串字典序比较逻辑,逐字符对比ASCII码值,例如"1.69K"的首字符'1'的ASCII码小于'2',会直接判定"1.69K" < "2",和实际数值大小逻辑冲突,所以得不到预期结果。
实现方案
先做单位换算,把每个字符串转换为对应实际数值后再比较大小,排序过程不会修改原字符串的格式:
- 封装数值转换工具方法
// 把带K单位的字符串转换为对应的实际数值 double convertToValue(String str) { if (str.endsWith('K')) { // 截取K之前的数字部分,乘以1000得到实际值 final numPart = double.parse(str.substring(0, str.length - 1)); return numPart * 1000; } else { // 无单位的数字直接转double return double.parse(str); } }
- 调用sort方法时用转换后的数值比较
List<String> listData = ["1.69K","1.32K","1.25K","1.23K","2","45","34"]; listData.sort((a, b) { final aValue = convertToValue(a); final bValue = convertToValue(b); return aValue.compareTo(bValue); }); // 最终listData输出:["2","34","45","1.23K","1.25K","1.32K","1.69K"]
如果后续需要支持M/G等更多单位,只需要在convertToValue方法中扩展对应换算逻辑即可。
内容的提问来源于stack exchange,提问作者Nandakishor Dhanaji Valakunde
相关产品推荐
相关产品推荐

