Выравнивание по левому краю

Я работаю над заданием, в котором мне нужно выровнять выходной текст по левому краю. Когда я тестирую программу, мне кажется, что вывод не выровняется. Также для GPA, если я пытаюсь выровнять текст, я теряю точность до 2 десятичных знаков. Вот мой код

#Calculating $semester_gpa
if ($credits_taken == 0) {
  exit();
}
my $total = $semester_gpa /= $credits_taken;

#Output formatting
printf ("The student name is: %-6s\n",$user_name);
printf ("Credits taken: %-6s\n", $credits_taken);
printf ("Credits passed: %-6s\n", $credits_passed);
printf ("GPA: %-6s %.2f\n", $total);

Результат моей программы следующий Выравнивание по левому краю

Что именно я делаю не так?

Похоже, ваш код выровнен по левому краю. Можете ли вы предоставить образец того, как вы хотите, чтобы результат выглядел?

mrunion 14.09.2018 05:18

Вы уверены, что хотите /=?

ggorlen 14.09.2018 05:25

Ваш последний printf получает только одну переменную, $total, которая, таким образом, форматируется как %-6s, а %.2f ничего не получает. Вы забыли еще одну переменную до $total, или не должно быть %-6s?

zdim 14.09.2018 05:25
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
2
3
676
1

Ответы 1

Вам не нужно использовать printf, если вы пытаетесь выровнять значения по левому краю, просто добавьте пробелы в строки меток. Под строкой метки я подразумеваю, например, "Credits taken: %s\n" (обратите внимание на пробелы между : и %)

$user_name = 'Jogi';
$credits_taken = 13;
$credits_passed = 9;
$semester_gpa = 4.329;

#Calculating $semester_gpa
if ($credits_taken == 0) {
  exit();
}
my $total = $semester_gpa /= $credits_taken;

#Output formatting
printf ("The student name is: %s\n", $user_name);
printf ("Credits taken:       %s\n", $credits_taken);
printf ("Credits passed:      %s\n", $credits_passed);
printf ("GPA:                 %.2f\n", $total);

Даже если вы хотите выровнять по правому краю, вы все равно должны ставить пробелы в строках меток, чтобы код был ясным и легким для понимания:

printf ("The student name is: %10s\n", $user_name);
printf ("Credits taken:       %10s\n", $credits_taken);
printf ("Credits passed:      %10s\n", $credits_passed);
printf ("GPA:                 %10.2f\n", $total);

Обратите внимание на синтаксис %10.2f, который объединяет выравнивание по правому краю с десятичной точностью.

Чтобы сделать ширину выровненных полей динамической, вы можете использовать специальный * (звездочка) синтаксис для printf:

$width = 20;
printf ("The student name is: %*s\n", $width, $user_name);
printf ("Credits taken:       %*s\n", $width, $credits_taken);
printf ("Credits passed:      %*s\n", $width, $credits_passed);
printf ("GPA:                 %*.2f\n", $width, $total);

Вы даже можете сделать точность динамической, если хотите:

$width = 20;
$precision = 2;
printf ("GPA:                 %*.*f\n", $width, $precision, $total);

Другие вопросы по теме