Преобразование сокращений чисел (5.2k, 1.7m и т. Д.) В действительные целые числа с помощью PHP - PullRequest
6 голосов
/ 29 марта 2011

У меня есть база данных со столбцом, содержащим различные числа, написанные в «стенографии», например:

5К для 5000
86,6 тыс. Для 86 600
4,1 м для 4 100 000
1,2b за 1 200 000 000

Я хотел бы сделать некоторые вычисления с этими числами для внешнего интерфейса PHP, но для этого мне нужно преобразовать их в действительные целые числа. Как я могу сделать это с PHP?

Ответы [ 6 ]

6 голосов
/ 29 марта 2011

Если это ваш формат данных и соответствует. Вы можете написать свою собственную функцию. создать карту суффикса для множителя .. "k" => 1000, "m" => 100000

и умножьте целочисленное значение на множитель. Вот решение на основе sscanf: 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);

?>

А вот простой вкладыш:

<?php
$money = "86.6k";
$value = substr($money,0,-1)*pow(10,strpos("---k--m--b",substr($money,-1))) ;
var_dump($value);
?>
5 голосов
/ 05 ноября 2011

Большинство решений здесь работают только для целых чисел. Этот также будет работать для чисел, таких как 1.5M или 6.83K.

Я думаю, что эта функция намного чище и эффективнее

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);
        }
    }
}

И наоборот:

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;
            }
        }
    }

Достигается триллион, вы можете добавить более высокие значения, если хотите, но не забудьте поместить их в массив от самого высокого до самого низкого.

5 голосов
/ 29 марта 2011

Что-то вроде:

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

Предполагая, что ваши данные хорошо отформатированы. Если не больше, проверка будет необходима, как:

if (!preg_match('/^\d+(?:\.\d+)?[mbk]$/i',$input)) {
   // $input is not a valid format.
}
2 голосов
/ 29 марта 2011

На странице руководства указана функция PHP: ini_get() (на самой странице руководства, а не в примечаниях пользователя) , это делает именно это.

Цитата:

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;
}


Обратите внимание, что эта функция используется, чтобы показать, как преобразовать сокращенные байтовые значения в целочисленные байтовые значения, и, как таковая, считает, что 1k = 1024; а не 1000.

0 голосов
/ 29 марта 2011
$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);
0 голосов
/ 29 марта 2011

Логика для реализации, итерация по всем символам, и когда вы найдете символ (не цифру), просто сохраните индекс.Теперь разделите это на две части: цифровое значение и символ.Теперь создайте функцию, которая возвращает значение переданного символа.например.getValueOf ('M') = 1000000 И, наконец, выполните это числовое значение * getValueOf ('M'). Вот и все.Примечание. Ваши числовые значения содержат запятые, поэтому также сделайте str_replace (',', '', числовое значение), а затем преобразуйте его в int

...