2013-07-21 10 views
6

w mojej aplikacji i zrobić kilka matematyki, a wynik może być pływaka lub intpokazać maksymalnie 2 cyfry po zmiennoprzecinkowych ... tylko jeśli jest to numer pływak z więcej niż 2 cyfr obrocie

chcę pokazać wynik końcowy z dwóch cyfr dziesiętnych po pkt max ... jeśli wynik jest liczbą pływak

istnieją dwie możliwości do zrobienia tego

number_format($final ,2); 

i

sprintf ("%.2f", $final); 

ale problem jest ... jeśli mój wynik końcowy jest int jak 25 I skończyć z

25.00 

lub jeśli wynik końcowy jest coś, jak 12.3 daje mi

12.30 

i dont chcesz, aby był jakiś sposób sformatowania liczby w celu wyświetlenia 2 cyfr po TYLKO punkcie zmiennoprzecinkowym, jeśli jest to liczba zmiennoprzecinkowa z więcej niż 2 cyframi po przecinku dziesiętnym? czy powinienem sprawdzić przed sformatowaniem mojego numeru?

Odpowiedz

19
<?php 
$number = 25; 
print round($number, 2); 

print "\n"; 

$number = 25.3; 
print round($number, 2); 

print "\n"; 

$number = 25.33; 
print round($number, 2); 

drukuje:

25 
25.3 
25.33 
+0

jest prawie idealny, ale pokazuje '12.30' jak' 12.3' – max

+2

Nie ma różnicy między '12.30' a' 12.3', tylko pomiędzy '" 12.30 "' i '" 12.3 "', ale pracujesz z 'float' jako wejście, a nie' string', więc nie ma sposobu na rozróżnienie tych dwóch. –

+0

Zgadzam się, użycie rundy jest bardziej korzystne ... ponieważ używasz spławik, a nie ciągów +1 – SmootQ

0

Myślę, że nie ma takiej krótkiej obwodnicy.
Sprawdź ręcznie, czy ma 2 lub więcej cyfr po przecinku.

Jak sprawdzić, czy ma on mniejszą cyfrę lub zero cyfr po przecinku? Po prostu pomnóż z 10 i sprawdź, czy jest liczbą całkowitą. Jeśli tak, wydrukuj numer w niezmienionym stanie. Jeśli teraz używasz "% .2f", aby go wydrukować.

0

Tak, należy zrobić kilka kontroli. Na przykład sprawdź, czy ceil($number) > floor($number); Jeśli potrzebujesz konkretnie dwóch cyfr, to wymaga więcej wysiłku.

0

Musisz dodać warunek if, jeśli ma więcej niż 0 cyfr po punkcie. Nie widzę innego rozwiązania.

Prosty i szybki sposób na zrobienie tego.

$final=3.40; 
$decimalNbr= strlen(substr(strrchr($final, "."), 1)); 
$final = number_format($final,(is_float($final) ? (($decimalNbr>2) ? 2 : $decimalNbr) : 0)); 


echo $final; 

Należy również pamiętać, że przed użyciem funkcji number_format dodałem kolejną cyfrę dziesiętną.

+1

12.3 wyświetli 12.30 – bitWorking

+0

Och, naprawdę ... Dziękuję, dodałem kilka lew (edytowałem) – SmootQ

+0

Możesz utworzyć funkcję do wielokrotnego użytku. – SmootQ

0

Nie podoba mi się to.

<?php 
function format($number) { 
    return preg_replace(
     '~\.[0-9]0+$~', 
     null, 
     sprintf('%.2f', $number) 
    ); 
} 

echo format(23), PHP_EOL;  //23 
echo format(23.3), PHP_EOL;  //23 
echo format(23.33), PHP_EOL; //23.33 
+1

.. ale '23.3' powinno wypisać' 23.3' – bitWorking

+0

Powinno to być? W takim przypadku wszystkie wartości wejściowe są zgodne z oczekiwanymi wartościami wyjściowymi i nic nie jest wymagane. –

+0

jeśli miejsca dziesiętne są <= 2 – bitWorking

0

Znalazłem inną opcję.Oddanych do float rozebrać spływu zer:

echo (float)sprintf("%.2f", $final); 
// or 
echo (float)number_format($final ,2); 

Ale te funkcje zdaje się zaokrąglić liczbę podobnie jak round:

echo sprintf("%.2f", 12.556); // 12.56 
echo number_format(12.556, 2); // 12.56 

Więc jeśli nie chcesz, to zachowanie to wykorzystać:

$final = 12.556; 
echo (int)(($final*100))/100; // 12.55 

echo (int)((12*100))/100; // 12 
echo (int)((12.3*100))/100; // 12.3 
echo (int)((12.34567*100))/100; // 12.34 
0

Możesz użyć tego przykładu.

function num_format($number,$precision=0) 
{ 
    $precision = ($precision == 0 ? 1 : $precision);  
    $pow = pow(10, $precision); 
    $value = (int)((trim($number)*$pow))/$pow; 

    return number_format($value,$precision); 
} 
echo num_format(71730116.048758); 
//Output 
//71,730,116.04 
Powiązane problemy