首页 > 解决方案 > 如何删除字符串中的前导0

问题描述

我得到包含前导零的字符串格式的 ID。我想保留这种字符串格式,但没有前导零。例子:

00 => 0
01 => 1
02 => 2
10 => 10
11 => 11

我当前的实现是 String id = int.parse(originalId).toString()

是否有更好/高效/ Dart 模式的方式来实现这种转换?

标签: dart

解决方案


您可以使用RegExpwhich 可能比双重转换更丑但更快:

"01".replaceAll(new RegExp(r'^0+(?=.)'), '')

'^' 匹配字符串的开头

0+匹配一个或多个0字符

(=?.)匹配()除换行符 ( .) 之外的任何字符的组 ( ),但不将其包含在结果 ( =?) 中,这确保不会匹配整个字符串,因此如果只有零,我们至少保留一个零。

例子 :

void main() {

  final List nums = ["00", "01", "02", "10", "11"];
  final RegExp regexp = new RegExp(r'^0+(?=.)');
  for (String s in nums) {
    print("$s => ${s.replaceAll(regexp, '')}");
  }

}

结果 :

00 => 0
01 => 1
02 => 2
10 => 10
11 => 11

编辑:性能测试感谢您的评论

void main() {

  Stopwatch stopwatch = Stopwatch()..start();
  final RegExp reg = RegExp(r'^0+(?=.)');
  for (int i = 0; i < 20000000; i++) {
    '05'.replaceAll(reg, '');
  }
  print('RegExp executed in ${stopwatch.elapsed}');

  stopwatch = Stopwatch()..start();
  for (int i = 0; i < 20000000; i++) {
    int.parse('05').toString();
  }
  print('Double conversion executed in ${stopwatch.elapsed}');

}

结果 :

RegExp executed in 0:00:02.912000
Double conversion executed in 0:00:03.216000

与双重转换相比,您将执行的操作越多,效率越高。然而RegExp,在单个计算中可能会更慢,因为创建它是有成本的,但我们谈论的是几微秒......我会说除非你有数以万计的操作,否则使用对你来说更方便。


推荐阅读