La conversione di numero di abbreviazioni (5.2 k, 1.7 m, ecc) in numeri interi validi con PHP

Ho un database con una colonna contenente una serie di numeri scritti in “breve”, per esempio:

5k per 5.000
86.6 k per 86,600
4.1 m per 4,100,000
1.2 b per 1,200,000,000

Vorrei fare alcuni calcoli con questi numeri per un frontend PHP, ma ho bisogno di convertirli in numeri interi validi per farlo. Come potrei fare questo con PHP?

  • è questo formato di dati coerenti ?
  • Sì, è costante nell’intero set di dati
  • ho scritto una soluzione assumendo consistenza.

 

6 Replies
  1. 5

    Qualcosa di simile:

    switch (strtolower(substr($input, -1))) {
            case 'k':
                    $input*=1000;
                    break;
            //similarly for m, M, b, B.
    }

    Supponendo che i dati siano ben formattato. Se non di più controllo sarebbe necessario, come:

    if (!preg_match('/^\d+(?:\.\d+)?[mbk]$/i',$input)) {
       //$input is not a valid format.
    }
    • In questo contesto, m è 1.000.000 quindi, è necessario aggiornare il vostro più.
    • Mi piacerebbe andare con un switch(strtolower(...)), ma nel complesso +1.
    • Ya, che lo rende più pulito.
    • Questo ha funzionato perfettamente, grazie codaddict!
    • Hai dimenticato di tagliare il carattere effettivo prima di moltiplicarlo.
  2. 6

    Se questo è il formato di dati, ed è coerente.
    è possibile scrivere la propria funzione.
    creare una mappa del suffisso moltiplicatore..
    “k” => 1000, “m” => 100000

    e moltiplicare il valore intero valore del moltiplicatore.
    Qui è un sscanf soluzione a base di : http://codepad.org/FjwBbx1D

    <?php
    
    $map = array("k" => 1000,"m" => 1000000,"b" => 1000000000);
    $money = "86.6k";
    list($value,$suffix) = sscanf($money, "%f%s");
    $final = $value*$map[$suffix];
    var_dump($final);
    
    ?>

    E qui è una semplice fodera:

    <?php
    $money = "86.6k";
    $value = substr($money,0,-1)*pow(10,strpos("---k--m--b",substr($money,-1))) ;
    var_dump($value);
    ?>
  3. 5

    La maggior parte delle soluzioni qui funzionano solo per i numeri interi. Questo funziona anche per i numeri, come 1.5M o 6.83K.

    Penso che questa funzione è molto più pulito e più efficiente

    function formatAbbreviationToNumber($number) {
        $abbrevs = array(12 => "T", 9 => "B", 6 => "M", 3 => "K", 0 => "");
    
        foreach($abbrevs as $exponent => $abbrev) {
            if(strtoupper(substr($number, -1)) == $abbrev) {
                return substr_replace($number, "", -1) * pow(10, $exponent);
            }
        }
    }

    E in un altro modo:

    function formatNumbertoAbbreviation($number) {
            $abbrevs = array(12 => "T", 9 => "B", 6 => "M", 3 => "K", 0 => "");
    
            foreach($abbrevs as $exponent => $abbrev) {
                if(abs($number) >= pow(10, $exponent)) {
                    return intval($number / pow(10, $exponent)) . $abbrev;
                }
            }
        }

    Si va trilioni di dollari, è possibile aggiungere i valori più alti se si vuole, ma assicurarsi che li metti in un array, dalla più alta alla più bassa.

    • Non funziona con i numeri negativi.
    • fissa per i numeri negativi e, solo bisogno di un semplice abs()
  4. 2

    C’è una funzione PHP dato sul manuale della pagina di ini_get() (nella pagina di manuale di per sé, non gli utenti note), che fa proprio questo.

    Citazione :

    function return_bytes($val) {
        $val = trim($val);
        $last = strtolower($val[strlen($val)-1]);
        switch($last) {
            //The 'G' modifier is available since PHP 5.1.0
            case 'g':
                $val *= 1024;
            case 'm':
                $val *= 1024;
            case 'k':
                $val *= 1024;
        }
    
        return $val;
    }


    Si noti che questa funzione è utilizzata per mostrare come convertire abbreviata valori di byte per intero byte valori, e, come tale, considera che 1 k = 1024 e non 1000.

  5. 0

    Logica da implementare,
    scorrere tutti i caratteri, e quando si trova un personaggio (non cifre) a soli salvare l’indice.
    Ora divisa in due parti: digital valore e carattere.
    Ora è possibile creare una funzione che restituisce il valore del passato del personaggio.
    es. getValueOf(‘M’)=1000000
    E poi finalmente fare questo
    Valore numerico * getValueOf(‘M’)
    Questo è tutto.
    Nota: i Tuoi valori numerici sono virgole, in modo anche di fare str_replace(‘,’,”,valore numerico)
    e poi convertire int

  6. 0
    $string = '5k'; //or whatever
    $suffix = strspn($string, '.0123456789');
    $value = doubleval(substr($string, 0, $suffix))
    if($suffix < strlen($string))
    {
     switch($string[$suffix])
     {
      case 'k':
       $value *= 1000;
       break;
      case 'm':
       $value *= 1000000;
       break;
      case 'b':
       $value *= 1000000000;
       break;
     }
    }
    echo number_format($value);

Lascia un commento