2010-09-30 14 views

Odpowiedz

20

number_format będzie zawsze, że jedynym rozwiązaniem jest go karmić coś innego:

$number = intval(($number*100))/100; 

czyli

$number = floor(($number*100))/100; 
+2

Wypróbuj za pomocą tego numeru: 0.29, a to się nie powiedzie! – Arsham

+0

zrób to: $ finalCommishParts = explode ('.', $ Commission); $ commisshSuffix = (isset ($ finalCommishParts [1])? Substr ($ finalCommishParts [1], 0,2): '00'); $ finalCommish = $ finalCommishParts [0]. '.'. $ CommisshSuffix; –

+0

@AsafMaoz: uważaj na różnice w separatorach dziesiętnych z ustawieniami regionalnymi. – Wrikken

0

użyć tej funkcji:

function number_format_unlimited_precision($number,$decimal = '.') 
{ 
    $broken_number = explode($decimal,$number); 
    return number_format($broken_number[0]).$decimal.$broken_number[1]); 
} 
+0

masz dodatkowe) $ broken_number [1]); – ddjikic

+1

To nic nie robi: po prostu zwraca ten sam numer wejściowy, jaki został przekazany (również występuje błędne przyporządkowanie nawiasów). – T30

+0

Wiem, że to stara odpowiedź i nie jest to naprawdę dobra odpowiedź, ale wyjaśnijmy, że istnieje zmiana, a jeśli spojrzeć na historię, dodatkowy wspornik został dodany przez tego kolegę Linusa, a nie przez oryginalnego korespondenta. –

0
$finalCommishParts = explode('.',$commission); 
$commisshSuffix = (isset($finalCommishParts[1])?substr($finalCommishParts[1],0,2):'00'); 
$finalCommish = $finalCommishParts[0].'.'.$commisshSuffix; 
+1

Proszę dodać tekst wyjaśniający. Nie widzę "number_format (...)" w tej odpowiedzi, więc jest poza mną, jak to odpowiada na pytanie "Jak zrobić number_format(), aby nie zaokrąglać numerów w górę" – Sumurai8

+0

Ten fragment robi to, co robi numer_format, ale bez zaokrąglanie numeru. Jak wspomniano powyżej, sprawdź lokalny separator dziesiętny. –

0
public function numberFormatPrecision($number, $separator = '.', $format = 2){ 

    $response = ''; 
    $brokenNumber = explode($separator, $number); 
    $response = $brokenNumber[0] . $separator; 
    $brokenBackNumber = str_split($brokenNumber[1]); 

    if($format < count($brokenBackNumber)){ 

     for($i = 1; $i <= $format; $i++) 
      $response .= $brokenBackNumber[$i]; 
    } 

    return $response; 
} 
+0

Nie możesz mieć ($ i = 1; ... ponieważ $ brokenBackNumber [$ i] będzie wtedy brakowało pierwszego znaku - ponieważ $ brokenBackNumber ma wartość zero.Musisz także mieć sekcję "else {}" dla swojego zdania if Ale podoba mi się twój pomysł –

0

Jeśli nie dbam o to, co przychodzi za przecinkiem, można rzucić float jako int aby uniknąć zaokrągleń:

$float = 2.8; 
echo (int) $float; // outputs '2' 
2

używam tej funkcji:

function cutNum($num, $precision = 2){ 
    return floor($num).substr($num-floor($num),1,$precision+1); 
} 

floor($num) to część całkowita, a $num-floor($num) to liczba dziesiętna (jak 0,2345).

Więc substr($num-floor($num),1,$precision+1) dostaje ".23" (zauważ, że punkt jest również brany).

przykłady wykorzystania:

cutNum(1.2345) //returns 1.23 
cutNum(1.2345,3) //returns 1.234 
cutNum(1.2345,10) //returns 1.2345 
cutNum(1.2345,0) //returns 1. (!don't use with zero as second argument: use floor instead!) 
+0

Użyłem go dzisiaj i zadziałało jak czar – samouray

+0

Uratowałeś mi czas Dzięki –

2
**Number without round**   

    $double = '21.188624'; 
    echo intval($double).'.'.substr(end(explode('.',$double)),0,2); 

**Output** 21.18 
8

Wiem, że to stare pytanie, ale to wciąż rzeczywisty :).

Co z tą funkcją?

function numberFormatPrecision($number, $precision = 2, $separator = '.') 
{ 
    $numberParts = explode($separator, $number); 
    $response = $numberParts[0]; 
    if(count($numberParts)>1){ 
     $response .= $separator; 
     $response .= substr($numberParts[1], 0, $precision); 
    } 
    return $response; 
} 

Zastosowanie:

// numbers test 
numberFormatPrecision(19, 2, '.'); // expected 19 return 19 
numberFormatPrecision(19.1, 2, '.'); //expected 19.1 return 19.1 
numberFormatPrecision(19.123456, 2, '.'); //expected 19.12 return 19.12 

// negative numbers test 
numberFormatPrecision(-19, 2, '.'); // expected -19 return -19 
numberFormatPrecision(-19.1, 2, '.'); //expected -19.1 return -19.1 
numberFormatPrecision(-19.123456, 2, '.'); //expected -19.12 return -19.12 

// precision test 
numberFormatPrecision(-19.123456, 4, '.'); //expected -19.1234 return -19.1234 

// separator test 
numberFormatPrecision('-19,123456', 3, ','); //expected -19,123 return -19,123 -- comma separator 
0

w przypadku gdy masz małe float wartości można użyć number_format funkcję w ten sposób.

$number = 21.23; 

echo number_format($number, 2, '.', ',')); // 21.23 

W przypadku gdy masz masz długie liczbę dziesiętną wtedy też będzie format numeru tędy

$number = 201541.23; 

echo number_format($number, 2, '.', ',')); // 201,541.23 
0

Użyj natywna funkcja bcdiv.

function numberFormat($number, $decimals = 2, $sep = ".", $k = ","){ 
    $number = bcdiv($number, 1, $decimals); // Truncate decimals without rounding 
    return number_format($number, $decimals, $sep, $k); // Format the number 
} 

Aby uzyskać więcej informacji, zobacz this answer.