使用PHP将数字缩写(5.2k,1.7m等)转换为有效整数

Mar*_*ios 6 php integer numbers

我有一个数据库,其中包含以"速记"编写的各种数字的列,例如:

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

我想用这些数字为PHP前端做一些计算,但我需要将它们转换为有效的整数才能这样做.我怎么能用PHP做到这一点?

Dhr*_*hak 6

如果这是您的数据格式,并且是一致的.你可以编写自己的函数.创建一个后缀到乘数的地图.."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);

?>
Run Code Online (Sandbox Code Playgroud)

这是一个简单的一个班轮:

<?php
$money = "86.6k";
$value = substr($money,0,-1)*pow(10,strpos("---k--m--b",substr($money,-1))) ;
var_dump($value);
?>
Run Code Online (Sandbox Code Playgroud)


cod*_*ict 5

就像是:

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

假设您的数据格式正确.如果没有更多的检查将需要像:

if (!preg_match('/^\d+(?:\.\d+)?[mbk]$/i',$input)) {
   // $input is not a valid format.
}
Run Code Online (Sandbox Code Playgroud)


Gil*_*ire 5

这里的大多数解决方案仅适用于整数.这个也适用于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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

反过来说:

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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

它达到万亿,你可以根据需要添加更高的值,但要确保将它们从最高到最低放入数组中.