Дана строка числа, форматируйте как 3 цифры на блок

Мне нужно создать метод, который принимает строку чисел - например, 174709580098747434. Затем его нужно отформатировать как блоки по три и вернуть в виде массива, например {174, 709, 580, 098,747,434}.

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

Я новичок в C # и только новичок!

using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            string ques = "17470958834";
            Console.WriteLine(Chunk(ques));
        }
        public static string Chunk(string num)
        {
            // long inInt = Convert.ToInt64(num);
            string ans = "";
            for (int i = 0; i < num.Length; i += 3)
            {
                if (i == 2)
                {
                    ans.Insert(2, "-");
                }

                else if (i == 5)
                {
                    ans.Insert(5, "-");
                }
                else if (i == 8)
                {
                    ans.Insert(8, "-");
                }
                else if (i == 11)
                {
                    ans.Insert(11, "-");
                }
            }

            return ans;
        }
    }
}

person Ambilli Radhakrishnan    schedule 27.07.2020    source источник
comment
Вы хотите получить байты, а не строки: ulong input = 174709580098747434; byte [] output = BitConverter.GetBytes (ввод);   -  person jdweng    schedule 27.07.2020
comment
OP: Ваши предложения if никогда не сбудутся, потому что ваш for будет повторять i, чтобы он был 0, 3, 6, 9, ...   -  person Fildor    schedule 27.07.2020
comment
Что будет на выходе, если длина входной строки не делится на 3?   -  person Fildor    schedule 27.07.2020
comment
Каким должен быть результат при вводе 12? 1234? 12,345? -1234? 0012?   -  person mjwills    schedule 27.07.2020
comment
и возвращается в виде массива, почему ваш метод Chunk возвращает string? потому что Console.WriteLine требуется string в качестве параметра?   -  person Mong Zhu    schedule 27.07.2020
comment
Воспользуйтесь ответом, опубликованным по ссылке Орла Эраки.   -  person Krystian Borysewicz    schedule 27.07.2020
comment
здесь вам нужно знать оператор по модулю или оператор остатка с его помощью вы можете проверить, делится ли индекс на 3. Это может сэкономить вам много предложений if   -  person Mong Zhu    schedule 27.07.2020
comment
Я новичок в C # и только новичок! Если это правда, то я настоятельно не рекомендую решение, опубликованное Орлом. Ваше упражнение предназначено для простой цели: заставить вас пройти болезненный процесс осмысления проблемы и возможного алгоритма. Я бы посоветовал вам сначала попробовать решить эту проблему ручкой и бумагой. запишите алгоритм на человеческом языке, а затем попытайтесь перевести его в код. Вы решили почти всю проблему.   -  person Mong Zhu    schedule 27.07.2020
comment
вот несколько советов: 1) используйте расширяемую коллекцию, такую ​​как List<string>, для сбора ваших чанков. 2) вы уже перебираете строку с шагом 3, помещаете это число в переменную и используете его. 3) исследуйте извлечение части строки C #, и вы найдете метод, который делает именно это.   -  person Mong Zhu    schedule 27.07.2020


Ответы (3)


Если вы используете NuGet расширения System.Interactive для получения оператора Buffer, вы можете сделать это:

var number = "174709580098747434";
var output =
    String.Join(
        " ",
        number //174709580098747434 - string
            .Reverse() //434747890085907471 - char array
            .Buffer(3) //434 747 890 085 907 471 - array of char array
            .Select(x => String.Concat(x.Reverse())) //434 747 098 580 709 174 - string array
            .Reverse()); //174 709 580 098 747 434 - string

Это дает мне 174 709 580 098 747 434.

Без Buffer вы можете использовать немного более уродливую версию:

var output =
    String.Join(
        " ",
        number
            .Reverse()
            .Select((x, n) => (x, n))
            .GroupBy(z => z.n / 3)
            .Select(z => z.Select(y => y.x))
            .Select(x => String.Concat(x.Reverse()))
            .Reverse());
person Enigmativity    schedule 27.07.2020

Он должен быть более простым для новичка и должен вызывать пищу для размышлений. Следуйте приведенной ниже технике:

string value = "174709580098747434";
int chunk = 3;
int length = value.Length;
for (int i = 0; i < length; i += chunk)
{
    if (i + chunk > length) chunk = length - i;
    Console.WriteLine(value.Substring(i, chunk));
}
Console.ReadLine();
person Sh.Imran    schedule 27.07.2020
comment
Не могли бы вы подробнее рассказать о простоте и наводящем на размышления характере этого решения? - person Enigmativity; 27.07.2020
comment
Простое решение для новичка и цикл построения логики. В противном случае в первом комментарии @Orel Eraki есть много изящного и короткого решения. - person Sh.Imran; 27.07.2020

Надеюсь, приведенный ниже код решит вашу проблему.

public static  string[] Chunk(string number)
{
    int count = (number.Length / 3)+(number.Length % 3 > 0 ? 1 : 0);
    string[] result = new string[count];
    for (int i = 0; i < count; i++)
    {
        result[i] = number.Substring(i*3, ((i+1) * 3) < number.Length ? 3 : number.Length - (i * 3));
    }
    return result;
}

Если хотите, вы можете даже обобщить это, как показано ниже:

///number is string value
///splitStringCount is count which you want your string to get splitted.
private string[] Chunk(string number, int splitStringCount = 3)
    {
        int count = (number.Length / splitStringCount) +(number.Length % splitStringCount > 0 ? 1 : 0);
        string[] result = new string[count];
        for (int i = 0; i < count; i++)
        {
            result[i] = number.Substring(i* splitStringCount, ((i+1) * splitStringCount) < number.Length ? splitStringCount : number.Length - (i * splitStringCount));
        }
        return result;
    }

И если вам нужно только трехзначное число в возвращаемом массиве, проверьте код ниже:

Вызовите этот метод, как показано ниже:

Chunk("174709580098747434");

И логика метода приведена ниже:

public static string[] Chunk(string number, int splitStringCount = 3)
    {
        int count = (number.Length / splitStringCount);
        string[] result = new string[count];
        for (int i = 0; i < count; i++)
        {
            result[i] = number.Substring(i* splitStringCount, splitStringCount);
        }
        return result;
    }
person Rajeev Kumar    schedule 27.07.2020
comment
Может ли кто-нибудь прокомментировать здесь низкое содержание? - person Rajeev Kumar; 27.07.2020
comment
Может ли кто-нибудь прокомментировать здесь низкое содержание? Нет, я не голосовал, но могу прокомментировать ваш ответ. В нем много (частично загадочного) кода и нет никаких объяснений. Ваш ответ не объясняет, почему проблема возникла в первую очередь или что не так с кодом, опубликованным OP. Он также не объясняет, что делает ваш код и как он на самом деле предназначен для решения проблемы OP. Я предполагаю, что отчасти это причины отрицательного голосования. По крайней мере, для меня это было бы так, но я лучше напишу комментарии, чем проголосую против - person Mong Zhu; 27.07.2020