I'm trying to figure out how to use sprintf to print at least two decimal places and no leading zeros. For instance
input:
23 23.0 23.5 23.55 23.555 23.0000 output:
23.00 23.00 23.50 23.55 23.555 23.00 any formatting help would be appreciated
05 Answers
There is no such built-in format specifier. You could check if the number to be printed has two or fewer decimals (round to two decimals and compare), and if so use %.02f. If the number has more decimals, use a %g specifier. Here's an example in Ruby:
def print_two_dec(number) rounded = (number*100).to_i / 100.0 if number == rounded printf "%.02f\n", number else printf "%g\n", number end end [ 23, 23.0, 23.5, 23.55, 23.555 ].each do |number| print_two_dec(number) end Outputs:
23.00 23.00 23.50 23.55 23.555 1in PHP you could use
<?php $number = 0.56; echo sprintf("%0.2f",$number); 1In PHP, you may use the number_format function for this purpose, too, which also allows you to change delimiters.
In php this is what I did (inspired by this post). Maybe not the most elegant but... I made a function for printing numbers as strings. I wanted to be able to have flexibility so I have a couple of parameters.
PHP:
function print_num($num,$numdec,$atleast = false,$max_dec = -1) { $ret_norm = false; if (!$atleast) $ret_norm = true; else //atleast = true { //Want at least $numdec decimals //Do we have two or fewer and want to return two or fewer? if ($num == ((int)($num*100)/100) & $numdec <= 2 ) $ret_norm = true; else { //See if we have enough dec. already $just_dec = substr((string)$num,strpos((string)$num,".") + 1); if ($numdec >= strlen($just_dec)) $ret_norm = true; else { //More decimals than at least value - make sure we don't go over max if set if ( $max_dec >= 0 && strlen($just_dec) > $max_dec ) { //Confine to max_dec length $ret_norm = true; $numdec = $max_dec; //Set for sprintf below $num = number_format($num,$max_dec); //Round the value so doesn't just chop off } else if ($max_dec >= 0) $ret_norm = false; } //else } //else } //else atlest if ($ret_norm) return sprintf("%0.".$numdec."f",$num); else return sprintf("%s",$num); //print as is } //print_num And to call the function (to have at least two decimals but max 4:
print_num($mynum,2,true,4); If the number is 34.1, you get 34.10
If the number is 34.12345 you get 34.1235
etc.
Does "23.555".toFixed(2) not do what I think it does? (Javascript)
2