Dart 如何删除字符串中的前导0
我以包含前导零的字符串格式获取ID。我希望保留此字符串格式,但不使用前导零。例如:Dart 如何删除字符串中的前导0,dart,Dart,我以包含前导零的字符串格式获取ID。我希望保留此字符串格式,但不使用前导零。例如: 00 => 0 01 => 1 02 => 2 10 => 10 11 => 11 我当前的实现是 字符串id=int.parse(originalId).toString() 有没有更好的/高效的/省道模式的方法来实现这种转换?您可以使用RegExp,它可能比双重转换更难看,但速度更快: “01”.replaceAll(新的RegExp(r'^0+(?=)),'') '^'匹配
00 => 0
01 => 1
02 => 2
10 => 10
11 => 11
我当前的实现是
字符串id=int.parse(originalId).toString()
有没有更好的/高效的/省道模式的方法来实现这种转换?您可以使用
RegExp
,它可能比双重转换更难看,但速度更快:
“01”.replaceAll(新的RegExp(r'^0+(?=)),'')
'^'匹配字符串的开头
0+
匹配一个或多个0
字符
(=?)
匹配除换行符(
)以外的任何字符组()()
),而不将其包含在结果中(=?
),这确保不会匹配整个字符串,因此如果只有零,我们至少保留一个零
例如:
void main(){
最终清单nums=[“00”、“01”、“02”、“10”、“11”];
final RegExp RegExp=new RegExp(r'^0+(?=));
for(以nums表示的字符串s){
打印($s=>${s.replaceAll(regexp,,)});
}
}
结果:
00 => 0
01 => 1
02 => 2
10 => 10
11 => 11
RegExp executed in 0:00:02.912000
Double conversion executed in 0:00:03.216000
编辑:性能测试感谢您的评论
void main(){
秒表秒表=秒表()…开始();
最终RegExp reg=RegExp(r'^0+(?=));
对于(int i=0;i<20000000;i++){
“05”。替换所有(注册号,”);
}
打印(${stopwatch.appeased}中执行的RegExp);
秒表=秒表()…开始();
对于(int i=0;i<20000000;i++){
int.parse('05').toString();
}
打印(${stopwatch.appeased}中执行的双转换);
}
结果:
00 => 0
01 => 1
02 => 2
10 => 10
11 => 11
RegExp executed in 0:00:02.912000
Double conversion executed in 0:00:03.216000
与双转换相比,您执行的操作越多,效率就越高。然而,RegExp
在单个计算中可能会较慢,因为创建它会有成本,但我们只需要几微秒。。。我想说,除非你有成千上万的操作,否则就用你更方便的吧。我想你已经有了最优雅的形式了!有toStringAsFixed
(,大部分是浮点)和NumberFormat
()的选项,但我觉得这些可能不包括您的情况谢谢@IcarusTyle,我也这么认为。经过一些测试,试图测量代码性能,双重转换似乎更有效:正如@Yann39所指出的,我更正了我的代码(参见上面的dartpad链接),以避免为每个要转换的数字字符串创建RegExp,并且RegExp在性能方面似乎更有效!谢谢你的帖子@Yann39。你确定RegExp有更好的性能吗?我不确定,请看一下我编写的这段快速而肮脏的代码:因为每次都要创建一个新的RegExp()
。尝试从循环中创建它:var reg=RegExp(r'^[0]*');对于(int i=0;i<999999;i++){…//在此处使用reg}
。但是,您创建了这个性能测试,这一点很好,感谢@Yann39的评论。我更新了代码,只创建了一次RegExp,它改变了结果。RegExp似乎更有效!实际上,与双转换相比,您将执行的操作越多,效率就越高。但对于一次手术,我认为没有什么真正的区别。除非你有数以万计的操作,只要使用对你更方便的,我们谈论的是纳秒/微秒。。。我已经更新了我的答案,包括更多细节和性能测试。