【问题标题】:Converting number abbreviations (5.2k, 1.7m, etc) into valid integers with PHP使用 PHP 将数字缩写(5.2k、1.7m 等)转换为有效整数
【发布时间】: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 做到这一点?

【问题讨论】:

  • 这个数据格式是否一致?
  • 是的,整个数据集都是一致的
  • 我写了一个假设一致性的解决方案。

标签: php numbers integer


【解决方案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()
          猜你喜欢
          • 2012-01-12
          • 2011-03-12
          • 2012-08-04
          • 1970-01-01
          • 2019-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多