有时候数字过大,为了方便查看,在不需要过度精确的情况下,我们往往会将其转换 ‘k’ 结尾的字符串,如 1k,1.2k等等。原本想找个 Dart 版本的,奈何找了很久都没找到,于是参考了 Javscript 版本的方法进行了更改和优化。其实,Dart 和 Javascript 的正则差不多,只是 Dart 并没有 $1~$9
的子串匹配符(不推荐使用),且各自一些方法存在写法的差异。
nFormatter(dynamic num, [int digits = 1]) {
var si = [
{'value': 1, 'symbol': ''},
{'value': 1e3, 'symbol': 'k'},
{'value': 1e6, 'symbol': 'M'},
{'value': 1e9, 'symbol': 'G'},
{'value': 1e12, 'symbol': 'T'},
{'value': 1e15, 'symbol': 'P'},
{'value': 1e18, 'symbol': 'E'},
];
var rx = RegExp(r'.0+$|(.[0-9]*[1-9])0+$');
var i;
for (i = si.length - 1; i > 0; i--) {
if (num.abs() >= si[i]['value']) {
break;
}
}
return (num / si[i]['value']).toStringAsFixed(digits).replaceAll(rx, '') + si[i]['symbol'];
}
void main() {
print(nFormatter(600)); // 600
print(nFormatter(1000)); // 1k
print(nFormatter(1122, 1)); // 1.1k
print(nFormatter(1122, 2)); // 1.12k
print(nFormatter(-1122, 2)); // -1.12k
}