Подтвердить что ты не робот

Разделение строки/числа каждый N-й символ/номер?

Мне нужно разбить число на четные части, например:
32427237 должно стать 324 272 37
103092501 должно стать 103 092 501

Я уверен, что мог бы просто для следующих чисел, но я уверен, что есть более эффективный способ, поскольку я не хочу пропускать символы в этих числах - сами цифры могут быть любой длины, поэтому, если число было 1234567890 Я бы хотел, чтобы он разделился на эти части 123 456 789 0

Я видел примеры на других языках, таких как Python и т.д., но я не понимаю их достаточно хорошо, чтобы преобразовать их в С# - зацикливание, хотя символы, а затем на третьем получают предыдущий, а затем этот индекс, чтобы получить раздел строка может выполнить эту работу, но я открыт для предложений о том, как это сделать лучше.

4b9b3361

Ответ 1

Если вам нужно сделать это во многих местах вашего кода, вы можете создать фантастический метод расширения:

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 по желанию.

Ответ 2

Вы можете использовать простой цикл для вставки пробелов в каждую 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();

Ответ 3

Правила 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()));

Ответ 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

Метод расщепления:

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

Я бы сделал что-то подобное, хотя я уверен, что есть и другие способы. Должно выполняться очень хорошо.

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

Это уже половина десятилетия, но:

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

Ответ 8

Мне нравится, что это круто, хотя и не суперэффективно:

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

Ответ 9

Это может быть не по теме, поскольку я не знаю, почему вы хотите отформатировать номера таким образом, поэтому, пожалуйста, просто игнорируйте это сообщение, если это не актуально...

Как показано целое число в разных культурах. Вы должны сделать это локально независимым образом, чтобы было легче локализовать ваши изменения на более поздней стадии.

int.ToString принимает различные параметры, которые можно использовать для форматирования для разных культур. Параметр "N" предоставляет стандартный формат для группировки, специфичной для культуры.

стиль форматирования строки x - отличный ресурс.

Ответ 10

Попробуйте следующее:

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

Ответ 11

Если вы знаете, что вся длина строки точно делится на размер детали, используйте:

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 <string> значение.

Ответ 12

Хорошая реализация с использованием ответов других вопросов 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(): fooobar.com/info/20975/...

ToCsv(): fooobar.com/info/54876/...