每N个字符/数字分割一个字符串/数字?

例如,我需要将数字分成偶数部分:

32427237需要变成324 272 37

103092501需要变成103 092 501

我敢肯定,我只能继续输入数字,但是我确定有一种更有效的方法,因为我不想错过这些数字中的字符-

数字本身可以是任意长度,所以如果数字是1234567890我希望它分成这些部分123 456 789 0

我看过其他语言(例如Python等)中的示例,但我不太理解它们,无法将它们转换为C#-通过字符循环,然后在第三个字符处获取前一个字符,然后使用索引来获取字符串部分做这项工作,但我愿意就如何更好地完成这项工作提出建议。

回答:

如果必须在代码中的许多地方执行此操作,则可以创建一个奇特的扩展方法:

static class StringExtensions {

public static IEnumerable<String> SplitInParts(this String s, Int32 partLength) {

if (s == null)

throw new ArgumentNullException(nameof(s));

if (partLength <= 0)

throw new ArgumentException("Part length has to be positive.", nameof(partLength));

for (var i = 0; i < s.Length; i += partLength)

yield return s.Substring(i, Math.Min(partLength, s.Length - i));

}

}

然后可以像这样使用它:

var parts = "32427237".SplitInParts(3);

Console.WriteLine(String.Join(" ", parts));

输出是324 272 37所需的。

当您将字符串分割成几部分时,即使这些子字符串已存在于原始字符串中,也会分配新的字符串。通常,您不必太担心这些分配,但是使用现代C#可以通过稍微更改扩展方法以使用“跨度”来避免这种情况:

public static IEnumerable<ReadOnlyMemory<char>> SplitInParts(this String s, Int32 partLength)

{

if (s == null)

throw new ArgumentNullException(nameof(s));

if (partLength <= 0)

throw new ArgumentException("Part length has to be positive.", nameof(partLength));

for (var i = 0; i < s.Length; i += partLength)

yield return s.AsMemory().Slice(i, Math.Min(partLength, s.Length - i));

}

返回类型更改为,public static

IEnumerable<ReadOnlyMemory<char>>并通过调用Slice未分配的源来创建子字符串。

请注意,如果你在某些时候必须转换ReadOnlyMemory<char>string使用的API在一个新的字符串已被分配。幸运的是,ReadOnlyMemory<char>除此以外,还有许多.NET

Core API可以使用,string因此可以避免分配。

以上是 每N个字符/数字分割一个字符串/数字? 的全部内容, 来源链接: utcz.com/qa/401205.html

回到顶部