每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