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

Добавить разделитель в строку на каждый N символов?

У меня есть строка, которая содержит двоичные цифры. Как отделить строку после каждой 8 цифр?

Предположим, что строка:

string x = "111111110000000011111111000000001111111100000000";

Я хочу добавить разделитель как, (запятая) после каждого 8 символов.

вывод должен быть:

"11111111,00000000,11111111,00000000,11111111,00000000,"

Затем я хочу отправить его в список < > last 8 char 1st, затем предыдущие 8 символов (кроме,) и т.д.

Как я могу это сделать?

4b9b3361

Ответ 1

Regex.Replace(myString, ".{8}", "$0,");

Если вам нужен массив из восьми символов, то, вероятно, проще:

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

который разделит строку только в тех точках, где перед ней будет кратно восемь символов.

Ответ 2

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

var s = "111111110000000011111111000000001111111100000000";
var list = Enumerable
    .Range(0, s.Length/8)
    .Select(i => s.Substring(i*8, 8))
    .ToList();
var res = string.Join(",", list);

Ответ 3

Если я правильно понимаю ваше последнее требование (мне не ясно, нужна ли промежуточная строка с разделителями-запятыми или нет), вы можете сделать это:

var enumerable = "111111110000000011111111000000001111111100000000".Batch(8).Reverse();

Используя morelinq.

Ответ 4

Существует еще один подход Regex:

var str = "111111110000000011111111000000001111111100000000";
# for .NET 4
var res = String.Join(",",Regex.Matches(str, @"\d{8}").Cast<Match>());

# for .NET 3.5
var res = String.Join(",", Regex.Matches(str, @"\d{8}")
            .OfType<Match>()
            .Select(m => m.Value).ToArray());

Ответ 5

Уродливый, но менее мусор:

private string InsertStrings(string s, int insertEvery, char insert)
{
    char[] ins = s.ToCharArray();
    int length = s.Length + (s.Length / insertEvery);
    if (ins.Length % insertEvery == 0)
    {
        length--;
    }
    var outs = new char[length];
    long di = 0;
    long si = 0;
    while (si < s.Length - insertEvery)
    {
        Array.Copy(ins, si, outs, di, insertEvery);
        si += insertEvery;
        di += insertEvery;
        outs[di] = insert;
        di ++;
    }
    Array.Copy(ins, si, outs, di, ins.Length - si);
    return new string(outs);
}

Перегрузка строк:

private string InsertStrings(string s, int insertEvery, string insert)
{
    char[] ins = s.ToCharArray();
    char[] inserts = insert.ToCharArray();
    int insertLength = inserts.Length;
    int length = s.Length + (s.Length / insertEvery) * insert.Length;
    if (ins.Length % insertEvery == 0)
    {
        length -= insert.Length;
    }
    var outs = new char[length];
    long di = 0;
    long si = 0;
    while (si < s.Length - insertEvery)
    {
        Array.Copy(ins, si, outs, di, insertEvery);
        si += insertEvery;
        di += insertEvery;
        Array.Copy(inserts, 0, outs, di, insertLength);
        di += insertLength;
    }
    Array.Copy(ins, si, outs, di, ins.Length - si);
    return new string(outs);
}

Ответ 6

Один из способов использования LINQ:

string data = "111111110000000011111111000000001111111100000000";
const int separateOnLength = 8;

string separated = new string(
    data.Select((x,i) => i > 0 && i % separateOnLength == 0 ? new [] { ',', x } : new [] { x })
        .SelectMany(x => x)
        .ToArray()
    );

Ответ 7

... или старая школа:

public static List<string> splitter(string in, out string csv)
{
     if (in.length % 8 != 0) throw new ArgumentException("in");
     var lst = new List<string>(in/8);

     for (int i=0; i < in.length / 8; i++) lst.Add(in.Substring(i*8,8));

     csv = string.Join(",", lst); //This we want in input order (I believe)
     lst.Reverse(); //As we want list in reverse order (I believe)

     return lst;
}

Ответ 8

Это намного быстрее без копирования массива (эта версия вставляет пробел каждые 3 цифры, но вы можете настроить его в соответствии с вашими потребностями)

public string GetString(double valueField)
{
    char[] ins = valueField.ToString().ToCharArray();
    int length = ins.Length + (ins.Length / 3);
    if (ins.Length % 3 == 0)
    {
        length--;
    }
    char[] outs = new char[length];

    int i = length - 1;
    int j = ins.Length - 1;
    int k = 0;
    do
    {
        if (k == 3)
        {
            outs[i--] = ' ';
            k = 0;
        }
        else
        {
            outs[i--] = ins[j--];
            k++;
        }           
    }
    while (i >= 0);

    return new string(outs);
}

Ответ 9

Немного поздно для вечеринки, но здесь упрощенное выражение LINQ, чтобы разбить входную строку x на группы из n, разделенные другой строкой sep:

string sep = ",";
int n = 8;
string result = String.Join(sep, x.InSetsOf(n).Select(g => new String(g.ToArray())));

Быстрое изложение того, что происходит здесь:

  • x рассматривается как IEnumberable<char>, где находится метод расширения InSetsOf.
  • InSetsOf(n) группирует символы в IEnumerable of IEnumerable - каждая запись во внешней группировке содержит внутреннюю группу символов n.
  • Внутри метода Select каждая группа символов n возвращается в строку с помощью конструктора String(), который принимает массив chars.
  • Результатом Select является теперь IEnumerable<string>, который передается в String.Join для чередования строки sep, как и любой другой пример.

Ответ 10

Я более чем опоздал с моим ответом, но вы можете использовать этот:

    static string PutLineBreak(string str, int split)
    {
        for (int a = 1; a <= str.Length; a++)
        {
            if (a % split == 0)
                str = str.Insert(a, "\n");
        }

        return str;
    }