我得到包含前导零的字符串格式的 ID。我想保留这个字符串格式,但没有前导零。例子:
00 => 0
01 => 1
02 => 2
10 => 10
11 => 11
Run Code Online (Sandbox Code Playgroud)
我当前的实现是 String id = int.parse(originalId).toString()
有没有更好/高效/Dart 模式的方式来实现这种转换?
你可以使用RegExp它可能比双重转换更难看但更快:
"01".replaceAll(new RegExp(r\'^0+(?=.)\'), \'\')\nRun Code Online (Sandbox Code Playgroud)\n\n\xc2\xb4^\xc2\xb4 匹配字符串的开头
\n\n0+匹配一个或多个0字符
(=?.)匹配一组(()匹配除换行符. ),而不将其包含在结果 ( =?) 中,这确保不会匹配整个字符串,这样如果只有零,我们至少保留一个零。
例子 :
\n\nvoid main() {\n\n final List nums = ["00", "01", "02", "10", "11"];\n final RegExp regexp = new RegExp(r\'^0+(?=.)\');\n for (String s in nums) {\n print("$s => ${s.replaceAll(regexp, \'\')}");\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n结果 :
\n\n00 => 0\n01 => 1\n02 => 2\n10 => 10\n11 => 11\nRun Code Online (Sandbox Code Playgroud)\n\n编辑:性能测试感谢您的评论
\n\n00 => 0\n01 => 1\n02 => 2\n10 => 10\n11 => 11\nRun Code Online (Sandbox Code Playgroud)\n\n结果 :
\n\nRegExp executed in 0:00:02.912000\nDouble conversion executed in 0:00:03.216000\nRun Code Online (Sandbox Code Playgroud)\n\n与双转换相比,您执行的操作越多,效率就越高。然而RegExp单次计算可能会更慢,因为创建它是有成本的,但我们谈论的是几微秒......我想说,除非你有数以万计的操作,否则就使用对你来说更方便的方法。
如果有人试图阻止 TextField 中出现前导零,我制作了一个 TextInputFormatter,一旦添加非零数字,它将删除所有前导零。
class NoLeadingZeros extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue,
TextEditingValue newValue,
) {
if (newValue.text.startsWith('0') && newValue.text.length > 1) {
return TextEditingValue().copyWith(
text: newValue.text.replaceAll(new RegExp(r'^0+(?=.)'), ''),
selection: newValue.selection.copyWith(
baseOffset: newValue.text.length - 1,
extentOffset: newValue.text.length - 1,
),
);
} else {
return newValue;
}
}
}
Run Code Online (Sandbox Code Playgroud)
棘手的部分是在零被删除后调整 TextSelection 偏移量。如果没有此更新,TextField 将停止工作。
| 归档时间: |
|
| 查看次数: |
5603 次 |
| 最近记录: |