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

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

我相信我可以只是为了旁边的数字,但我相信有一个更有效的方法,因为我不想错过这些数字的字符 – 数字本身可以是任何长度,所以如果数字是1234567890我想把它分成这些部分123 456 789 0

我已经看到了其他语言的例子,如Python等,但我不明白他们足够好,以将它们转换为C# – 循环字符,然后在第三个获取前一个,然后该索引获取string的部分可能做这项工作,但我愿意提出如何更好地完成这项工作的build议。

如果你必须在你的代码的许多地方这样做,你可以创build一个奇特的扩展方法:

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)); } } 

你可以像这样使用它:

 var parts = "32427237".SplitInParts(3); Console.WriteLine(String.Join(" ", parts)); 

输出是324 272 37根据需要。

你可以使用一个简单的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(); 

LINQ规则:

 var input = "1234567890"; var parts = 3; var output = input.ToCharArray() .BufferWithCount(parts) .Select(c => new String(c.ToArray())); 

更新:

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

一个非常简单的方法来做到这一点(不是最有效的,但没有比最有效的慢几个数量级)。

  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; } 

这是一个备用

  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; } 

我会做这样的事情,虽然我相信还有其他的方法。 应该performance不错。

 public static string Format(string number, int batchSize, string separator) { StringBuilder sb = new StringBuilder(); for (int i = 0; i <= number.Length / batchSize; i++) { if (i > 0) sb.Append(separator); int currentIndex = i * batchSize; sb.Append(number.Substring(currentIndex, Math.Min(batchSize, number.Length - currentIndex))); } return sb.ToString(); } 

分割方法:

 public static IEnumerable<string> SplitInGroups(this string original, int size) { var p = 0; var l = original.Length; while (l - p > size) { yield return original.Substring(p, size); p += size; } yield return original.Substring(p); } 

作为stringjoin,用空格分隔:

 var joined = String.Join(" ", myNumber.SplitInGroups(3).ToArray()); 

编辑:我喜欢马丁Liversage解决scheme更好:)

编辑2:修正了一个错误。

编辑3:添加代码来joinstring。

这是晚了五年,但是:

 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())); 

我喜欢这个很酷的,尽pipe不是非常高效:

 var n = 3; var split = "12345678900" .Select((c, i) => new { letter = c, group = i / n }) .GroupBy(l => l.group, l => l.letter) .Select(g => string.Join("", g)) .ToList(); 

这可能是脱离主题,因为我不知道你为什么要这样格式化数字,所以请忽略这个post,如果它不相关…

如何显示一个整数在不同的文化中是不同的。 您应该以本地独立方式执行此操作,以便稍后本地化您的更改。

int.ToString使用不同的参数,你可以用来格式化不同的文化。 “N”参数为您提供文化特定分组的标准格式。

steve xstring格式也是一个很好的资源。

尝试这个:

 Regex.Split(num.toString(), "(?<=^(.{8})+)"); 

如果你知道整个string的长度可以被零件大小整除,那么使用:

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

但是,如果有可能整个string在结尾处可能会有一个小块,那么您需要更复杂一些:

 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))); 

在这些例子中,部分将是一个IEnumerable,但是您可以在最后添加.ToArray()或.ToList()以防您想要一个string[]或List <string>值。

使用来自其他StackOverflow问题的答案的一个很好的实现:

 "32427237" .AsChunks(3) .Select(vc => new String(vc)) .ToCsv(" "); // "324 272 37" "103092501" .AsChunks(3) .Select(vc => new String(vc)) .ToCsv(" "); // "103 092 501" 

AsChunk(): https ://stackoverflow.com/a/22452051/538763

ToCsv(): https ://stackoverflow.com/a/45891332/538763