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()
может сделать аналогичную операцию, но отличается тем, что вывод функции можно сохранить в строковую переменную и использовать далее, а не просто вывести на консоль.Пример:
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-do