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




