Formatowanie liczb w php

0

Witajcie,
Mam mały problem.
Taki kod:


$res = round($quantity + (str_replace(",", ".", $quantity) * str_replace(",", ".", $garbage) / 100),2);


Który zwraca mi np. 2.4

Chciałbym żeby liczby miały formę 1.32 , 5.50, 8.11, 10.10 (2 liczby po przecinku).

Kombinowałem z


$res =number_format($res, 2, '.', '')

Ale nie pomaga :(
Wie ktoś może jak to naprawić?

1

Masz błąd w innym miejscu bo number_format właśnie zwraca stringa takiego jak chcesz.

0
mr_jaro napisał(a):

Masz błąd w innym miejscu bo number_format właśnie zwraca stringa takiego jak chcesz.

Mój cały kod wygląda tak:

function calculate(float $val1,  float $val2): float {
        $value = ((str_replace(",", ".", $val1) * str_replace(",", ".", $val2)) / 100);
$value = round($value, 2);
        return number_format($value, 2, '.', '');
    }
3
  1. number_format() zwraca string u Ciebie w deklaracji całej funkcji określasz, że ma zwracać float, czyli dokonujesz kolejnej konwersji.
  2. Po co określając parametry funkcji jako float wykonujesz jakieś czynności na stringach z zamianą przecinków?
1
function fix_float($s) {
	if(is_string($s))
		$s = str_replace(',', '.', $s);
	
	return $s;
}

function calculate($a, $b) {
	return ($a * $b) / 100;
}

$a = fix_float('24,5413');
$b = fix_float(31.5621);

echo $result = calculate($a, $b); // 7.7457496473	
echo number_format($result, 2, '.', ''); // 7.75

Jeśli nie chcesz zaokrąglenia, to z wyniku wytnij sobie wszystko dwa miejsca po kropce np. za pomocą substr

Poza tym round działa trochę inaczej, niż się tego spodziewasz

echo round(2.14, 2); // 2.14
echo round(2.10, 2); // 2.1
echo round(2.503, 2); // 2.5
echo round(2.509, 2); // 2.51
0

@.__. błąd masz bo number_format nie zaokrągla tylko obcina miejsca po przecinku lub dodaje 0 jesli jest za mało a u ciebie jakimś cudem zaokrągliło patrząc na komentarze :p

1

@baracadus to ci zadziała

function calculate(string $val1,  string $val2): string {
        $value = ((str_replace(",", ".", $val1) * str_replace(",", ".", $val2)) / 100);
        $value = round($value, 2);
        return number_format($value, 2, '.', '');
}
1

@mr_jaro: Mistrzu, typujesz argumenty funkcji na float, a następnie działasz na nich jak na stringach ;D

asd.png

1

@baracadus: Polecam dodać na początku pliku declare(strict_types=1) - wtedy unikniesz wielu takich zdziwień - np. Twój kod od razu by się wysypał (deklarujesz zwrócenie float, a zwracasz stringa - bez strict_types jest on konwertowany na float, a tak nie powinno być - podobnie z danymi wejściowymi). Brak ścisłej kontroli typów powoduje, że kod zachowuje się nieprzewidywalnie i jest trudniejszy do utrzymania.

Dodaj do tego debugger z breakpointem w funkcji i w 30s rozwiążesz taką zagadkę samodzielnie.

0

@.__. To jest fragment twojego kodu

echo $result = calculate($a, $b); // 7.7457496473   
echo number_format($result, 2, '.', ''); // 7.75

Jeśli w $result będziesz miał 7.7457496473 to z number_format a wyjdzie 7.74, nie ma innej opcji

0

Dziękuję bardzo za odpowiedzi :)
A co w przypadku gdy liczba to: 2.1 ? Chciałbym żeby zawsze były 2 cyfrowe - tj w tym przypadku 2.10 zamiast 2.1 :)

0

Odpowiem w osobnym poście bo w komentarzu się nie zmieści.
Number format działa jak należy -> popatrz na przykład kodu

<?php
$numbers = [7, 7.1, 7.14, 7.1463];

foreach ($numbers as $number) {
    echo 'Jako string ' . number_format($number, 2, '.', '');
    echo ' => cast do float: ' . (float) number_format($number, 2, '.', '');
    echo PHP_EOL;
}

Rezultat:

www-data@d989837b5332:~/html$ php test.php 
Jako string 7.00 => cast do float: 7
Jako string 7.10 => cast do float: 7.1
Jako string 7.14 => cast do float: 7.14
Jako string 7.15 => cast do float: 7.15

Jak dla mnie wszytko jest ok.Musisz rozróżniać float od stringa i tyle. $a = 7.10 i $a = '7.10' to dwie różne wartości.

A żeby lepiej zrozumieć temat to proponuję zrobić mały eksperyment i odpalić te dwa skrypty:

<?php

echo calc('7,00') . PHP_EOL;

function calc(float $x): float
{
    return number_format($x, '2', '.', '');
}

i potem ten:

<?php

declare(strict_types=1);

echo calc('7,00') . PHP_EOL;

function calc(float $x): float
{
    return number_format($x, '2', '.', '');
}

Wtedy powinno ci sie rozjaśnić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1