Fix #1174 Add number_shorten() function and 'shorten' template filter

This commit is contained in:
Kijin Sung 2019-07-27 21:33:30 +09:00
parent 4f20f0e8c1
commit 72577ce6bb
4 changed files with 73 additions and 0 deletions

View file

@ -664,6 +664,11 @@ class TemplateHandler
case 'number_format':
$var = $filter_option ? "number_format({$var}, {$filter_option})" : "number_format({$var})";
break;
case 'shorten':
case 'number_shorten':
$var = $filter_option ? "number_shorten({$var}, {$filter_option})" : "number_shorten({$var})";
break;
case 'link':
$var = $this->_applyEscapeOption($var, $escape_option);

View file

@ -381,6 +381,35 @@ function base64_decode_urlsafe($str)
return @base64_decode(str_pad(strtr($str, '-_', '+/'), ceil(strlen($str) / 4) * 4, '=', STR_PAD_RIGHT));
}
/**
* This function shortens a number using common suffixes.
*
* @param int $number The number to shorten
* @param int $significant_digits The number of significant digits to retain
* @return string
*/
function number_shorten($number, $significant_digits = 2)
{
$length = strlen(abs(intval($number)));
switch ($length)
{
case 0: case 1: case 2: case 3: return strval(intval($number));
case 4: return number_format($number / 1000, max(0, $significant_digits - 1)) . 'K';
case 5: return number_format($number / 1000, max(0, $significant_digits - 2)) . 'K';
case 6: return number_format($number / 1000, max(0, $significant_digits - 3)) . 'K';
case 7: return number_format($number / 1000000, max(0, $significant_digits - 1)) . 'M';
case 8: return number_format($number / 1000000, max(0, $significant_digits - 2)) . 'M';
case 9: return number_format($number / 1000000, max(0, $significant_digits - 3)) . 'M';
case 10: return number_format($number / 1000000000, max(0, $significant_digits - 1)) . 'G';
case 11: return number_format($number / 1000000000, max(0, $significant_digits - 2)) . 'G';
case 12: return number_format($number / 1000000000, max(0, $significant_digits - 3)) . 'G';
case 13: return number_format($number / 1000000000000, max(0, $significant_digits - 1)) . 'T';
case 14: return number_format($number / 1000000000000, max(0, $significant_digits - 2)) . 'T';
case 15: return number_format($number / 1000000000000, max(0, $significant_digits - 3)) . 'T';
default: return floor($number / 1000000000000) . 'T';
}
}
/**
* Convert a server-side path to a URL.
*

View file

@ -399,6 +399,14 @@ class TemplateHandlerTest extends \Codeception\TestCase\Test
'<p>{$foo|format:2}</p>',
'?><p><?php echo number_format($__Context->foo, \'2\') ?></p>'
),
array(
'<p>{$foo|shorten}</p>',
'?><p><?php echo number_shorten($__Context->foo) ?></p>'
),
array(
'<p>{$foo|shorten:2}</p>',
'?><p><?php echo number_shorten($__Context->foo, \'2\') ?></p>'
),
array(
'<p>{$foo|date:His}</p>',
'?><p><?php echo getDisplayDateTime(ztime($__Context->foo), \'His\') ?></p>'

View file

@ -103,6 +103,37 @@ class FunctionsTest extends \Codeception\TestCase\Test
$this->assertEquals('Rhymix ^~', base64_decode_urlsafe('Umh5bWl4IF5-'));
}
public function testNumberShorten()
{
$this->assertEquals('1', number_shorten(1));
$this->assertEquals('12', number_shorten(12));
$this->assertEquals('123', number_shorten(123));
$this->assertEquals('1.2K', number_shorten(1234));
$this->assertEquals('12K', number_shorten(12345));
$this->assertEquals('123K', number_shorten(123456));
$this->assertEquals('1.2M', number_shorten(1234567));
$this->assertEquals('12M', number_shorten(12345678));
$this->assertEquals('123M', number_shorten(123456789));
$this->assertEquals('1.2G', number_shorten(1234567890));
$this->assertEquals('12G', number_shorten(12345678900));
$this->assertEquals('123G', number_shorten(123456789000));
$this->assertEquals('1.2T', number_shorten(1234567890000));
$this->assertEquals('12T', number_shorten(12345678900000));
$this->assertEquals('123T', number_shorten(123456789000000));
$this->assertEquals('1234T', number_shorten(1234567890000000));
$this->assertEquals('123', number_shorten(123, 1));
$this->assertEquals('1K', number_shorten(1234, 1));
$this->assertEquals('12K', number_shorten(12345, 1));
$this->assertEquals('5.68K', number_shorten(5678, 3));
$this->assertEquals('56.8K', number_shorten(56789, 3));
$this->assertEquals('9.877M', number_shorten(9876543, 4));
$this->assertEquals('98.77M', number_shorten(98765432, 4));
$this->assertEquals('3.3333G', number_shorten(3333333333, 5));
$this->assertEquals('33.333G', number_shorten(33333333333, 5));
$this->assertEquals('1.00000T', number_shorten(1000000000000, 6));
$this->assertEquals('10.0000T', number_shorten(10000000000000, 6));
}
public function testHex2Rgb2Hex()
{
$this->assertEquals(array(128, 128, 128), hex2rgb('808080'));