使用 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.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;
它高达万亿,如果需要,您可以添加更高的值,但请确保将它们从最高到最低放入数组中。
【讨论】:
也修复了负数,只需要一个简单的 abs()以上是关于使用 PHP 将数字缩写(5.2k、1.7m 等)转换为有效整数的主要内容,如果未能解决你的问题,请参考以下文章