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

时间:2010-11-09 11:58:12

标签: c# .net string split

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

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

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

15 个答案:

答案 0 :(得分:106)

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:6)

LINQ规则:

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

var output = input.ToCharArray()
    .BufferWithCount(partSize)
    .Select(c => new String(c.ToArray()));

<强>更新:

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

答案 3 :(得分: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()));

答案 4 :(得分:4)

一种非常这样做的简单方法(不是最有效的,但不是最有效的数量级)。

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

答案 5 :(得分:3)

分裂方法:

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

以字符串形式连接,以空格分隔:

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

编辑:我更喜欢Martin Liversage解决方案:)

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

编辑3:添加了加入字符串的代码。

答案 6 :(得分:2)

我会做这样的事情,虽然我确定还有其他办法。应该表现得很好。

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

答案 7 :(得分:2)

我喜欢这个因为它很酷,虽然效率不高:

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

答案 8 :(得分:1)

试试这个:

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

答案 9 :(得分:1)

如果您知道整个字符串的长度可以被部件大小完全整除,那么请使用:

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

但是如果有可能整个字符串最后都有一个小块,你需要更复杂一点:

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(),以防您想要字符串[]或List&lt; string&gt;值。

答案 10 :(得分:1)

使用其他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"

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

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

答案 11 :(得分:0)

这可能是偏离主题的,因为我不知道你为什么要这样格式化数字,所以如果不相关,请忽略这篇文章......

整数的显示方式因不同文化而异。您应该以本地独立方式执行此操作,以便以后更容易本地化您的更改。

int.ToString采用不同的参数,可用于格式化不同的文化。 "N"参数为您提供了特定于文化的分组的标准格式。

steve x string formatting也是一个很好的资源。

答案 12 :(得分:0)

要分割字符串并返回每个位置具有特定字符数的字符串列表,这是我的功能:

public bool IsChecked { get; set; }
public Visibility ButtonVisibility {
get
{
    if ( IsChecked ) ...
}}

答案 13 :(得分:0)

您可以使用 Linq 尝试类似的操作。

var str = "11223344";
var bucket = 2;    
var count = (int)Math.Ceiling((double)str.Length / bucket);
        
Enumerable.Range(0, count)
    .Select(_ => (_ * bucket))
    .Select(_ => str.Substring(_,  Math.Min(bucket, str.Length - _)))
    .ToList()

答案 14 :(得分:0)

您还可以使用 StringReader 类从输入字符串中读取一个字符块并按计数推进字符位置。

StringReader Class Read(Char[], Int32, Int32)