每隔第N个字符/数字拆分一个字符串/数字?

Rog*_*oid 61 .net c# string split

我需要将一个数字分成偶数部分,例如:
32427237需要成为324 272 37
103092501需要成为103 092 501

我相信我可以接下来的数字,但我确信有一种更有效的方式,因为我不想错过这些数字中的字符 - 数字本身可以是任意长度所以如果数字是1234567890我希望它分成这些部分123 456 789 0

我已经看过其他语言的例子,比如Python等,但我不太了解它们将它们转换为C# - 循环通过字符然后在第三个获取前一个然后该索引来获取字符串的部分可能做好这份工作,但我愿意接受如何更好地完成这项工作的建议.

Mar*_*age 115

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

static class StringExtensions {

  public static IEnumerable<String> SplitInParts(this String s, Int32 partLength) {
    if (s == null)
      throw new ArgumentNullException("s");
    if (partLength <= 0)
      throw new ArgumentException("Part length has to be positive.", "partLength");

    for (var i = 0; i < s.Length; i += partLength)
      yield return s.Substring(i, Math.Min(partLength, s.Length - i));
  }

}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

var parts = "32427237".SplitInParts(3);
Console.WriteLine(String.Join(" ", parts));
Run Code Online (Sandbox Code Playgroud)

输出是324 272 37所希望的.

  • 这里的恕我直言扩展方法是矫枉过正.要拆分的"数字"是一种特定类型的东西,例如订单号.如果您可以将扩展方法限制为仅适用于订单号,那么很好.因为它可以将它应用于碰巧存储在字符串中的任何实体,这会破坏封装. (2认同)
  • 从编程指南中提醒一下扩展方法:"一般来说,我们建议您谨慎实施扩展方法,并且只在必要时才实施." 对不起,我只是认为扩展方法被滥用了. (2认同)
  • 如果您不想使用扩展方法,请删除`this`关键字并适当地重命名类和方法.我认为这种特殊方法非常通用(并不是特定于订单号),也是扩展方法的理想选择.将类放在一个单独的命名空间中,开发人员可以决定是否要启用扩展方法,就像添加`using System.Linq`将一堆扩展方法添加到`IEnumerable <T>`一样. (2认同)

Dir*_*mar 9

你可以使用一个简单的for循环在每个第n个位置插入空格:

string input = "12345678";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < input.Length; i++)
{
    if (i % 3 == 0)
        sb.Append(' ');
    sb.Append(input[i]);
}
string formatted = sb.ToString();
Run Code Online (Sandbox Code Playgroud)


Qry*_*taL 6

LINQ规则:

var input = "1234567890";
var partSize = 3;

var output = input.ToCharArray()
    .BufferWithCount(partSize)
    .Select(c => new String(c.ToArray()));
Run Code Online (Sandbox Code Playgroud)

更新:

string input = "1234567890";
double partSize = 3;
int k = 0;
var output = input
    .ToLookup(c => Math.Floor(k++ / partSize))
    .Select(e => new String(e.ToArray()));
Run Code Online (Sandbox Code Playgroud)

  • System.Linq.EnumerableEx.BufferWithCount是.NET(Rx)的Reactive Extensions的一部分:http://msdn.microsoft.com/zh-cn/devlabs/ee794896.aspx。您必须下载并安装此代码才能运行代码。 (2认同)

Bin*_*ier 5

一种执行此操作的非常简单的方法(不是最有效的方法,但是不会比最有效的方法慢几个数量级)。

    public static List<string> GetChunks(string value, int chunkSize)
    {
        List<string> triplets = new List<string>();
        while (value.Length > chunkSize)
        {
            triplets.Add(value.Substring(0, chunkSize));
            value = value.Substring(chunkSize);
        }
        if (value != "")
            triplets.Add(value);
        return triplets;
    }
Run Code Online (Sandbox Code Playgroud)

继承人

    public static List<string> GetChunkss(string value, int chunkSize)
    {
        List<string> triplets = new List<string>();
        for(int i = 0; i < value.Length; i += chunkSize)
            if(i + chunkSize > value.Length)
                triplets.Add(value.Substring(i));
            else
                triplets.Add(value.Substring(i, chunkSize));

        return triplets;
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您知道整个字符串的长度可以被部分大小整除,则使用:

var whole = "32427237!";
var partSize = 3;
var parts = Enumerable.Range(0, whole.Length / partSize)
    .Select(i => whole.Substring(i * partSize, partSize));
Run Code Online (Sandbox Code Playgroud)

但是,如果整个字符串末尾可能有一个小数块,那么您需要更复杂一点:

var whole = "32427237";
var partSize = 3;
var parts = Enumerable.Range(0, (whole.Length + partSize - 1) / partSize)
    .Select(i => whole.Substring(i * partSize, Math.Min(whole.Length - i * partSize, partSize)));
Run Code Online (Sandbox Code Playgroud)

在这些示例中,部件将是 IEnumerable,但如果您需要 string[] 或 List<string> 值,则可以在末尾添加 .ToArray() 或 .ToList() 。


Tyr*_*ess 5

这已经晚了五年,但是:

int n = 3;
string originalString = "32427237";
string splitString = string.Join(string.Empty,originalString.Select((x, i) => i > 0 && i % n == 0 ? string.Format(" {0}", x) : x.ToString()));
Run Code Online (Sandbox Code Playgroud)

  • 我一直想知道,既然有LINQ解决方案,那就来了! (2认同)