Как я могу использовать 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);