Как я могу использовать sprintf для заполнения нуля переменной длины в Perl?

Я хочу использовать sprintf в Perl для обнуления переменной.

sprintf("%08d", $var);

Но я хочу динамически определить, сколько цифр нужно заполнить нулями.

Как заменить "8" в sprintf("%08d", $var) с переменной под названием $zerofill?

3 ответа

Решение

Первый аргумент sprintf - это просто строка:

 my $zerofill = 9;
 my $number = 1000;
 my $filled = sprintf "%0${zerofill}d", $number;

Обратите внимание на фигурные скобки, чтобы отделить имя переменной от остальной части строки.

У нас есть эта конкретная проблема в качестве немного умного упражнения в Изучении Perl, чтобы напомнить людям, что строки - это просто строки.:)

Однако, как указывает мобру в своем ответе, sprintf обладает множеством функций, обеспечивающих гибкость такого рода. Документация для такой, казалось бы, простой функции довольно длинная, и в ней много полезного.

sprintf а также printf поддержать * обозначение (это работало, по крайней мере, с 5,8):


printf "%0*d", 9, 12345;

000012345

printf '$%*.*f', 8, 2, 456.78;

$  456.78

Мне нужно было сделать что-то немного другое: обнулить значение с плавающей запятой и получить точную длину.

В моем случае мне нужно ровно 12 байтов, включая десятичную точку. Это немного сложнее, чем у вас выше. Вот на тот случай, если это кому-нибудь понадобится:

Скажем, $inputVal - это строка, переданная откуда-то со значением, например 1001.1. Обратите внимание, что для надежной работы должно быть не более 12 символов.

 # This will give us extra zeros, but the string may be too long
 my $floatVal = sprintf('%*.*f', 12, 12, $inputValue);

 # This will remove any extra zeros
 $result = substr($floatVal, 0, 12);
Другие вопросы по тегам