如何去掉字符串中的前导0

Fab*_*ice 7 dart

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

00 => 0
01 => 1
02 => 2
10 => 10
11 => 11
Run Code Online (Sandbox Code Playgroud)

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

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

Yan*_*n39 7

你可以使用RegExp它可能比双重转换更难看但更快:

\n\n
"01".replaceAll(new RegExp(r\'^0+(?=.)\'), \'\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc2\xb4^\xc2\xb4 匹配字符串的开头

\n\n

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

\n\n

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

\n\n

例子 :

\n\n
void 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果 :

\n\n
00 => 0\n01 => 1\n02 => 2\n10 => 10\n11 => 11\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
00 => 0\n01 => 1\n02 => 2\n10 => 10\n11 => 11\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果 :

\n\n
RegExp executed in 0:00:02.912000\nDouble conversion executed in 0:00:03.216000\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n


Joe*_*ler 5

如果有人试图阻止 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 将停止工作。