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