Толик Панков
hex_laden
............ .................. ................
October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

C#, добавление лидирующих нолей к строковому представлению числа, более оптимальный способ.

Преамбула


Здесь (копия) я показал довольно неоптимальный способ решения данной задачи, но его можно оптимизировать с помощью стандартных функций. Напомню суть задачи: даны числа, скажем, от 1 до 1000, необходимо вывести их на экран или в файл последовательно, добавив лидирующие ноли, исходя из максимального числа. Если максимум 1000, то числа должны быть выведены так:
0001
0002
0003
...
0100
0101
0102
...
1000


Если максимум 100, то:

001
002
...
099
100


Подготовка


Как и в предыдущей версии решения, понадобится задать максимальное число (в тестовых примерах опять же, зададим его статически), например:

int maxnum = 150;

И опять же, понадобится функция, вычисляющая количество цифр (разрядов) числа (копия). Например, такая:

static int CountDigitsRec(int n)
{
    n = (int)Math.Abs(n);
    if (n <= 9)
    {
        return 1;
    }
    else
    {
        return CountDigitsRec(n / 10) + 1;
    }
}


Форматирование строки


C# автоматически умеет форматировать строки, используя специальные паттерны описания формата, задаваемые в виде строки. Основные паттерны перечислены в таблице ниже:

C / cЗадает формат денежной единицы, указывает количество десятичных разрядов после запятой
D / dЦелочисленный формат, указывает минимальное количество цифр
E / eЭкспоненциальное представление числа, указывает количество десятичных разрядов после запятой
F / fФормат дробных чисел с фиксированной точкой, указывает количество десятичных разрядов после запятой
G / gЗадает более короткий из двух форматов: F или E
N / nТакже задает формат дробных чисел с фиксированной точкой, определяет количество разрядов после запятой
P / pЗадает отображения знака процентов рядом с число, указывает количество десятичных разрядов после запятой
X / xШестнадцатеричный формат числа


Для форматирования строки, содержащей целое число, необходимо использовать паттерн d.

Форматирование во время вывода строки на консоль.


Отформатировать строку можно сразу во время вывода на консоль, функцией Console.Write()/Console.WriteLine():

int num = 125
Console.Write ("0:d4", num) //вывод: 0125


или

int num = 25
Console.Write ("0:d4", num) //вывод: 0025


Пример:

static void Main(string[] args)
{
    int maxnum = 150;
    string FormatPattern = "{0:d" + 
        CountDigitsRec(maxnum).ToString() + "}";

    for (int i = 0; i <= maxnum; i++)
    {
        Console.WriteLine(FormatPattern, i);
    }

    Console.WriteLine("Press Enter...");
    Console.ReadLine();
}


Пример на GitHub

Использование String.Format()


Функция String.Format() может сделать аналогичную операцию, но отличается тем, что вывод функции можно сохранить в строковую переменную и использовать далее, а не просто вывести на консоль.

Пример:

static void Main(string[] args)
{
    int maxnum = 1150;
    string FormatPattern = "{0:d" +
        CountDigitsRec(maxnum).ToString() + "}";
    string TempFile = Path.GetTempFileName();
    string Result = "";
    List<string> WriteList = new List<string>();

    for (int i = 0; i <= maxnum; i++)
    {
        Result = String.Format(FormatPattern,i);
        Console.WriteLine(Result);
        WriteList.Add(Result);
    }

    File.WriteAllLines(TempFile, WriteList.ToArray());

    Console.WriteLine("Test file: " + TempFile);
    Console.WriteLine("Press Enter...");
    Console.ReadLine();
}


В цикле результат работы функции String.Format() возвращается в переменную Result, значение которой выводится на консоль и сохраняется в List<string> WriteList для дальнейшей записи в файл.

Пример на GitHub

Примечание: в источнике есть еще варианты форматирования строк, ознакомьтесь.

Источник


Форматирование и интерполяция строк (копия на mega.nz, PDF)

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/01/27/c-dobavlenie-lidiruyushhih-nolej-k-strokovomu-predstavleniyu-chisla-bolee-optimalnyj-sposob/

From:
(will be screened)
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message:



Notice! This user has turned on the option that logs IP addresses of anonymous posters.