将长数转换为短数和紧凑数

问题描述

我很难找到将 (Compact Number Format) 与 NumberFormatter 一起使用的方法

作为参考,这里有一个使用 JavaScript 的工作示例

new Intl.NumberFormat('en-GB',{ 
    notation: "compact"
}).format(987654321);

// → 988M

new Intl.NumberFormat('en-GB',{ 
    notation: "compact"
}).format(78656666589);

// → 79B

我使用以下脚本查看可用模式

$fmt = new NumberFormatter('en_US',NumberFormatter::DURATION);
var_dump($fmt->getPattern());

我看过

  • NumberFormatter::PATTERN_DECIMAL
  • NumberFormatter::DECIMAL
  • NumberFormatter::CURRENCY
  • NumberFormatter::PERCENT
  • NumberFormatter::SCIENTIFIC
  • NumberFormatter::SPELLOUT
  • NumberFormatter::ORDINAL

它们都没有紧凑模式。

有人有 PHP 的工作代码吗? 或者,目前不支持 compact 模式?

解决方法

您正在寻找 NumberFormatter::PADDING_POSITION

$fmt = new NumberFormatter('en_US',NumberFormatter::PADDING_POSITION);

for($i=1;$i<1.E10;$i *=10){
  echo $i.' => '.$fmt->format($i)."<br>\n";
}
/*
1 => 1
10 => 10
100 => 100
1000 => 1K
10000 => 10K
100000 => 100K
1000000 => 1M
10000000 => 10M
100000000 => 100M
1000000000 => 1B
*/

我在 PHP 7.4.2 下测试过。

,

你可以使用这样的东西

    function compact_number($n) {
        // first strip any formatting;
        $n = (0+str_replace(",","",$n));
       
        // is this a number?
        if(!is_numeric($n)) return false;
       
        // now filter it;
        if($n>1000000000000) return round(($n/1000000000000),1).' T';
        else if($n>1000000000) return round(($n/1000000000),1).' B';
        else if($n>1000000) return round(($n/1000000),1).' M';
        else if($n>1000) return round(($n/1000),1).' K';
       
        return number_format($n);
    }

echo compact_number(247704360);
echo compact_number(866965260000);

//    Outputs:

// 247704360 -> 247.7 M
// 866965260000 -> 867 B

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...