Autor Zpráva
wordik
Profil *
Dobrý den,

chtěl bych se zeptat, zda jde nějak přetížit funkce number_format a nastavit, tak aby nezaokrouhlovala. Jelikož potřebuji následující:
vypsat 290.90909090909090909090909090909

jako 290,90 (2 desetinná místa za čárkou jsou důležitá, takže nechci, aby to vracelo pouze 290,9)

na to používám funkci
number_format($number, 2, ',', '');

ovšem ta mi vrátí 290,91 místo 290,90
Alphard
Profil
Nevyhovovalo by třeba zaokrouhlit (round) na 1 desetinné místo a pak formátovat na dvě?
Jestli jde prostě o první dva znaky za desetinnou čárkou, zpracujte to jako řetězec.
juriad
Profil
Můžeš to číslo vynásobit stem, zaokrouhlit dolu a pak zase stem vydělit:

$number = 290.90909090909090909090909090909;
$decimals = 2;

$number = floor($number * pow(10, $decimals)) / pow(10, $decimals);
echo number_format($number, $decimals, ',', '');
wordik
Profil *
Alphard:
Nejsem si jistý, jestli jsem vás dobře pochopil, ale zaokrouhlovat právě nechci vůbec, chci jen číslo zformátovat na 2 desetinná místa s desetinnou čárkou.

juriad:
Bohožel na číslo 290.90909090909090909090909090909 to projde v pořádku, ale třeba číslo 145.45 to zformátuje na 145,44 a mělo by to zformátovat na 145,45.

Já vím, možná toho chci moc, ale sám už z toho mám zamotanou hlavu.
Alphard
Profil
wordik:
ale třeba číslo 145.45 to zformátuje na 145,44
Hmm, on asi float ze 145.45 v binárce bude 145.44999999999999 nebo nějaký podobný problém.

Řešte to přes ty řetězce, jak jsem navrhoval.
echo preg_replace('/(\.\d\d).*/', '$1', 128.20512820513)
Zdroj Pokud to číslo ale je výsledkem výpočtu, tak to nemusí stačit. Je to ale dobré řešení, jestli ho přebíráte jako string.
Navíc je třeba ošetřit, když je vstup nedesetinné číslo.

Alternativně stackoverflow.com/a/19124167/2375157.

Ještě mě napadlo verzi [#3] juriad upravit přičtením nějaké malé konstanty na 3. desetinném místě a dále. Zas to ale změní hodnotu, když byste pracoval s číslem typu .9999999999.
wordik
Profil *
Děkuji moc, nakonec jsem to vyřešil pomocí funkce z vlákna, na který jste mě odkázal.
function truncate_decimal($number, $truncate_decimal_length = 2, $decimal_character = '.', $thousands_character = '') {

$number = explode($decimal_character, $number);
$number[1] = substr($number[1], 0, $truncate_decimal_length);
$number_truncated = implode($decimal_character, $number);
return number_format($number_truncated, $truncate_decimal_length, $decimal_character, $thousands_character);

}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0