Я использую sprintf () для получения форматированной строки некоторых чисел с плавающей точкой с определенной точностью. Кроме того, я хотел добавить ведущие нули, чтобы сделать все числа даже в длину. Выполнение этого для целых чисел довольно прямолинейно :
sprintf('%02d', 1);
Это приведет к 01
. Однако, попытка одинакового для float с точностью не работает:
sprintf('%02.2f', 1);
Выход 1.00
.
Как добавить старшие нули в значение float?
Короткий ответ: sprintf('%05.2f', 1);
даст желаемый результат 01.00
Обратите внимание, что %02
был заменен на %05
.
объяснение
Этот пост форума указал мне в правильном направлении: первое число не означает ни число ведущих нулей, ни число общих символов в левой части десятичного разделителя, а общее количество символов в полученной строке!
пример
sprintf('%02.2f', 1);
дает по крайней мере десятичный разделитель « .
» плюс не менее 2 символов для точности. Так как это уже 3 символа, то %02
в начале не влияет. Чтобы получить желаемые «2 ведущие нули», нужно добавить 3 символа для прецизионного и десятичного разделителя, что делает его sprintf('%05.2f', 1);
Некоторый код
$num = 42.0815; function printFloatWithLeadingZeros($num, $precision = 2, $leadingZeros = 0){ $decimalSeperator = "."; $adjustedLeadingZeros = $leadingZeros + mb_strlen($decimalSeperator) + $precision; $pattern = "%0{$adjustedLeadingZeros}{$decimalSeperator}{$precision}f"; return sprintf($pattern,$num); } for($i = 0; $i <= 6; $i++){ echo "$i max. leading zeros on $num = ".printFloatWithLeadingZeros($num,2,$i)."\n"; }
Вывод
0 max. leading zeros on 42.0815 = 42.08 1 max. leading zeros on 42.0815 = 42.08 2 max. leading zeros on 42.0815 = 42.08 3 max. leading zeros on 42.0815 = 042.08 4 max. leading zeros on 42.0815 = 0042.08 5 max. leading zeros on 42.0815 = 00042.08 6 max. leading zeros on 42.0815 = 000042.08