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