Rimuovi zero cifre inutili dai decimali in PHP


Answers

potresti semplicemente usare la funzione floatval

echo floatval('125.00');
// 125

echo floatval('966.70');
// 966.7

echo floatval('844.011');
// 844.011
Question

Sto cercando di trovare un modo veloce per rimuovere zero decimals dai valori numerici come questo:

echo cleanNumber('125.00');
// 125

echo cleanNumber('966.70');
// 966.7

echo cleanNumber(844.011);
// 844.011

Esiste un modo ottimizzato per farlo?




A causa di questa domanda è vecchio. Innanzitutto, mi dispiace per questo.

La domanda riguarda il numero xxx.xx ma nel caso in cui sia x, xxx.xxxxx o separatore decimale differenza come xxxx, xxxx, questo può essere più difficile da trovare e rimuovere zero cifre dal valore decimale.

/**
 * Remove zero digits from decimal value.
 * 
 * @param string|int|float $number The number can be any format, any where use in the world such as 123, 1,234.56, 1234.56789, 12.345,67, -98,765.43
 * @param string The decimal separator. You have to set this parameter to exactly what it is. For example: in Europe it is mostly use "," instead of ".".
 * @return string Return removed zero digits from decimal value.
 */
function removeZeroDigitsFromDecimal($number, $decimal_sep = '.')
{
    $explode_num = explode($decimal_sep, $number);
    if (is_array($explode_num) && isset($explode_num[count($explode_num)-1]) && intval($explode_num[count($explode_num)-1]) === 0) {
        unset($explode_num[count($explode_num)-1]);
        $number = implode($decimal_sep, $explode_num);
    }
    unset($explode_num);
    return (string) $number;
}

Ed ecco il codice per il test.

$numbers = [
    1234,// 1234
    -1234,// -1234
    '12,345.67890',// 12,345.67890
    '-12,345,678.901234',// -12,345,678.901234
    '12345.000000',// 12345
    '-12345.000000',// -12345
    '12,345.000000',// 12,345
    '-12,345.000000000',// -12,345
];
foreach ($numbers as $number) {
    var_dump(removeZeroDigitsFromDecimal($number));
}


echo '<hr>'."\n\n\n";


$numbers = [
    1234,// 12324
    -1234,// -1234
    '12.345,67890',// 12.345,67890
    '-12.345.678,901234',// -12.345.678,901234
    '12345,000000',// 12345
    '-12345,000000',// -12345
    '12.345,000000',// 12.345
    '-12.345,000000000',// -12.345
    '-12.345,000000,000',// -12.345,000000 STRANGE!! but also work.
];
foreach ($numbers as $number) {
    var_dump(removeZeroDigitsFromDecimal($number, ','));
}



$x = '100.10'; 
$x = preg_replace("/\.?0*$/",'',$x); 
echo $x;

Non c'è nulla che non possa essere risolto con una semplice regex;)

http://xkcd.com/208/




$value = preg_replace('~\.0+$~','',$value);



$str = 15.00;
$str2 = 14.70;
echo rtrim(rtrim(strval($str), "0"), "."); //15
echo rtrim(rtrim(strval($str2), "0"), "."); //14.7



Modo complicato ma funziona:

$num = '125.0100';
$index = $num[strlen($num)-1];
$i = strlen($num)-1;
while($index == '0') {
   if ($num[$i] == '0') {
     $num[$i] = '';
     $i--;
   }

   $index = $num[$i];
}

//remove dot if no numbers exist after dot
$explode = explode('.', $num);
if (isset($explode[1]) && intval($explode[1]) <= 0) {
   $num = intval($explode[0]);
}

echo $num; //125.01

le soluzioni di cui sopra sono il modo ottimale, ma nel caso in cui si desidera avere il proprio si potrebbe usare questo. Ciò che questo algoritmo fa inizia alla fine della stringa e controlla se è 0 , se è impostato su una stringa vuota e poi passa al carattere successivo dal retro fino a quando l'ultimo carattere è > 0




Se si desidera rimuovere le cifre zero appena prima di essere visualizzate sulla pagina o sul modello.

Puoi usare la funzione sprintf()

sprintf('%g','125.00');
//125

‌‌sprintf('%g','966.70');
//966.7

‌‌‌‌sprintf('%g',844.011);
//844.011



Questo è quello che uso:

function TrimTrailingZeroes($nbr) {
    return strpos($nbr,'.')!==false ? rtrim(rtrim($nbr,'0'),'.') : $nbr;
}

NB Questo presuppone . è il separatore decimale. Ha il vantaggio che funzionerà su numeri arbitrariamente grandi (o piccoli) poiché non vi è alcun lancio float. Inoltre, non trasformerà i numeri in notazione scientifica (ad es. 1.0E-17).




Fai attenzione con l'aggiunta di +0.

echo number_format(1500.00, 2,".",",")+0;
//1

Il risultato è 1.

echo floatval('1,000.00');
// 1

echo floatval('1000.00');
//1000