Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 如何删除字符串中的前导0_Dart - Fatal编程技术网

Dart 如何删除字符串中的前导0

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+(?=)),'') '^'匹配

我以包含前导零的字符串格式获取ID。我希望保留此字符串格式,但不使用前导零。例如:

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似乎更有效!实际上,与双转换相比,您将执行的操作越多,效率就越高。但对于一次手术,我认为没有什么真正的区别。除非你有数以万计的操作,只要使用对你更方便的,我们谈论的是纳秒/微秒。。。我已经更新了我的答案,包括更多细节和性能测试。