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

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

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

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

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

Ответы [ 3 ]

15 голосов
/ 18 марта 2010

sprintf и printf поддерживают нотацию * (это работает как минимум с 5,8):


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

000012345

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

$  456.78
15 голосов
/ 18 марта 2010

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

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

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

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

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

2 голосов
/ 25 августа 2011

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

В моем случае мне нужно ровно 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);
...