formatNum static method

String formatNum(
  1. String? num, {
  2. int digit = 6,
  3. bool needThousands = true,
  4. dynamic remainAvailable = false,
  5. dynamic showBracket = false,
})

取小数点后几位-截断保留 @param num 数值 @param location 保留几位小数 @param needThousands 是否需要千位分割。默认需要 @param remainAvailable 是否计算有效小数。默认不计算,比如0.0003,小数位是2位,true返回0.0003,false返回0 @param showBracket 小数多0是否展示括号

Implementation

static String formatNum(
  String? num, {
  int digit = 6,
  bool needThousands = true,
  remainAvailable = false,
  showBracket = false,
}) {
  if (num == null || num.isEmpty) return '0.00';
  List<String> list = num.split(".");
  String integerStr = list[0];
  // 千分位分割
  integerStr = needThousands ? thousands(integerStr) : integerStr;

  if (digit == 0) return integerStr; // 不保留小数

  // 无小数,补充小数
  if (list.length == 1) {
    // String decimalStr = '0' * digit;
    return integerStr;
  }

  // 有小数的情况
  String decimalStr = list[1];

  // 整数部分不为0,或者不计算有效小数
  if (integerStr.replaceAll('0', '').isNotEmpty || !remainAvailable) {
    integerStr = needThousands ? thousands(integerStr) : integerStr;
    if (decimalStr.length > digit) {
      decimalStr = decimalStr.substring(0, digit); // 保留小数位
      // decimalStr = decimalStr.replaceAll(RegExp(r'0*$'), ''); // 去掉尾部多余的0
      return '$integerStr.$decimalStr';
    }
  }

  // 整数部分为0
  integerStr = needThousands ? thousands(integerStr) : integerStr;

  // 获取小数位数前面的0
  String leadingZero = RegExp(r'^0*').firstMatch(decimalStr)![0] ?? '';

  if (leadingZero.length >= 5 && showBracket) {
    // 前面小数位大于5,处理为 0{3} 的格式
    leadingZero = '0{${leadingZero.length - 1}}';
  }

  decimalStr = decimalStr.replaceAll(RegExp(r'^0*'), ''); // 有效数字
  if (decimalStr.length > digit) {
    decimalStr = decimalStr.substring(0, digit);
    decimalStr = decimalStr.replaceAll(RegExp(r'0*$'), ''); // 去掉尾部多余的0
  }
  return '$integerStr.$leadingZero$decimalStr';
}