January 4, 2023

Write для вывода на экран - анахронизм в PascalАВС.NЕТ

Есть в IDE PascalАВС.NЕТ иконка "Здоровье кода". Считается, что у программы часть здоровья отнимает использование Write с формированием интервалов за счет вставки пробелов. Примерно вот так:

В таких случаях рекомендуется использовать Print с автоматическим формированием пробелов.

Запись стала короче. Но всегда ли можно так просто использовать Print вместо Write? Оказывается, не всегда. В Print нельзя указывать формат вывода данных - общую ширину поля и количество знаков в дробной части для вещественного типа. А что же делать? И тут два выхода: либо все же использовать Write (в этом случае "Здоровье кода" очки не снимает), либо использовать форматирование средствами .NET.

Самый простой вариант вывода средствами .NET - использовать интерполированную строку. Она начинается с символа $, указываемого перед собственно строкой, заключенной в одинарные кавычки: #39; ... '.

Фактически, мы пишем строку так, как она должна выглядеть на экране, а выводимые значения заключаем в фигурные скобки. Самое сложное тут - заучить форматы представления данных. Но на первое время достаточно следующего:

  • если нужно указать ширину поля вывода, ее отделяют от выводимой переменной (или выражения) запятой, за которой следует выражение, значение которого задает ширину. В случае, когда значение отрицательное, выводимое значение прижимается к левому краю, в противном случае - к правому;
  • далее можно указать символ, определяющий тип выводимого значения, например D - целочисленное, F - вещественное, S - строковое, B - логическое. Этому символу предшествует двоеточие.
  • для вещественных чисел после F можно указать количество выводимых цифр в дробной части. По умолчанию используется формат F2.

Этого на первое время более чем достаточно для оформления вывода. Хотите знать больше - ищите материал про интерполяцию строк в .NET или в материалах по языку C#.

##
var (a, b, c, d) := (8, -4.63, 'Приветик', 5 > 3);
Println(#39;{a} {b} {c} {d}');                    // 8 -4.63 Приветик True
Println(#39;a={a}, b={b}, c={c}, d={d}');         // a=8, b=-4.63, c=Приветик, d=True
Println(#39;{a,5} {b,8} {c,-9}{d}');              //     8    -4.63 Приветик True
Println(#39;{a,5:D}{b,8:F3} {c} {d}');            //     8  -4.630 Приветик True
Println(#39;{a,5:D3}{b,8:F3} {c} {d}');           //   008  -4.630 Приветик True 
Println(#39;{a,5:D3}{b,8:F3}{c,10:S} {d}');       //   008  -4.630  Приветик True
Println(#39;{a,5:D3}{b,8:F3}{c,10:S} {d,6:B}');   //   008  -4.630  Приветик   True
Println(#39;{a,5:D3}{b,8:F3} {c,-11:S}{d}');      //   008  -4.630 Приветик   True
Println(#39;{a,5:D2}  {b,-6:F0} {c,-9:S}{d}');    //    08  -5     Приветик True