mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-04 17:21:39 +09:00
Fix #1174 Add number_shorten() function and 'shorten' template filter
This commit is contained in:
parent
4f20f0e8c1
commit
72577ce6bb
4 changed files with 73 additions and 0 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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>'
|
||||
|
|
|
|||
|
|
@ -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'));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue