如何在Dart中获取字符串中的最后n个字符?

dea*_*zvi 1 dart flutter

如何获取字符串中的最后n个字符?

我试过使用:

var string = 'Dart is fun';
var newString = string.substring(-5);
Run Code Online (Sandbox Code Playgroud)

但这似乎并不正确

ste*_*iel 12

虽然@Alexandre Ardhuin 是正确的,但重要的是要注意,如果字符串少于n字符,则会引发异常:

Uncaught Error: RangeError: Value not in range: -5
Run Code Online (Sandbox Code Playgroud)

在以这种方式运行之前,您应该检查长度

Uncaught Error: RangeError: Value not in range: -5
Run Code Online (Sandbox Code Playgroud)

在此过程中,您还可以考虑确保给定的字符串不为空。

String newString(String oldString, int n) {
  if (oldString.length >= n) {
    return oldString.substring(oldString.length - n)
  } else {
    // return whatever you want
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您喜欢单线,另一种选择是:

oldString ??= '';
Run Code Online (Sandbox Code Playgroud)

如果您希望它总是返回一个长度为 的字符串n,您可以使用您想要的任何默认值 ( .padLeft(n, '0'))来填充它,或者只保留trim().


至少,从 Dart SDK 开始2.8.1,情况就是如此。我知道他们正在努力提高 null 安全性,这在未来可能会改变。


Cop*_*oad 7

创建扩展:

extension E on String {
  String lastChars(int n) => substring(length - n);
}
Run Code Online (Sandbox Code Playgroud)

用法:

var source = 'Hello World';
var output = source.lastChars(5); // 'World'
Run Code Online (Sandbox Code Playgroud)


Ale*_*uin 6

var newString = string.substring(string.length - 5);
Run Code Online (Sandbox Code Playgroud)

  • 对于路径操作,您可以查看 [path package](https://pub.dev/packages/path) 并专门针对您的问题 [dirname](https://pub.dev/documentation/path/latest/path/目录名.html) (2认同)
  • 这个答案假设“string.length >= 5”。 (2认同)

Rad*_*dek 5

var newString = string.substring((string.length - 5).clamp(0, string.length));
Run Code Online (Sandbox Code Playgroud)

注意:我使用钳位是为了避免值范围错误。这样,如果以某种方式计算的话,您也不受负 n 字符的影响。

事实上,我想知道 dart 没有在子字符串方法中实现这样的钳位。

如果你想了解 null,只需使用:

var newString = string?.substring((string.length - 5).clamp(0, string.length));
Run Code Online (Sandbox Code Playgroud)