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

Posted

技术标签:

【中文标题】使用 PHP 将数字缩写(5.2k、1.7m 等)转换为有效整数【英文标题】:Converting number abbreviations (5.2k, 1.7m, etc) into valid integers with PHP 【发布时间】:2011-07-24 23:20:47 【问题描述】:

我有一个数据库,其中有一列包含用“速记”写的各种数字,例如:

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

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

【问题讨论】:

这个数据格式是否一致? 是的,整个数据集都是一致的 我写了一个假设一致性的解决方案。 【参考方案1】:

实现的逻辑, 遍历所有字符,当你找到一个字符(不是数字)时,只需保存索引。 现在将其分为两部分:数字值和字符。 现在创建一个返回传递字符值的函数。 例如。 getValueOf('M')=1000000 然后最后做到这一点 数值 * getValueOf('M') 就这样。 注意:您的数值中有逗号,所以 str_replace(',','',numeric value) 然后转换为 int

【讨论】:

【参考方案2】:

类似:

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.

【讨论】:

在这种情况下 m 是 1,000,000 所以你需要更新你的倍数。 我会选择switch(strtolower(...)),但总体+1。 @deceze:是的,这让它更干净。 你忘了在相乘之前把实际的字符剪掉。【参考方案3】:
$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);

【讨论】:

【参考方案4】:

如果这是您的数据格式,并且是一致的。 您可以编写自己的函数。 创建一个后缀映射到乘数.. "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】:

ini_get() 的手册页上提供了一个 PHP 函数(在手册页本身——而不是在用户注释中),就是这样做的。

引用:

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;

请注意,此函数用于显示如何将 shorthand byte values 转换为整数字节值,因此认为 1k = 1024 ;而不是 1000。

【讨论】:

【参考方案6】:

这里的大多数解决方案仅适用于整数。这也适用于1.5M6.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;
            
        
    

它高达万亿,如果需要,您可以添加更高的值,但请确保将它们从最高到最低放入数组中。

【讨论】:

也修复了负数,只需要一个简单的 abs()

以上是关于使用 PHP 将数字缩写(5.2k、1.7m 等)转换为有效整数的主要内容,如果未能解决你的问题,请参考以下文章

如果一千或更多,则将数字格式化为 2.5K,否则为 900

PHP 5.2知识讲解

在R中将数字1000格式化为1k,将1000000格式化为1m等[重复]

C语言经典实例 php版(仅练习用)

ggplot2中y比例标签的好K/M/G缩写

如何将数字转换为具有特定长度和 k、m、b 的智能数字