* echo Num::bytes('200K'); // 204800 * echo static::bytes('5MiB'); // 5242880 * echo static::bytes('1000'); // 1000 * echo static::bytes('2.5GB'); // 2684354560 * * * @author Kohana Team * @copyright (c) 2009-2011 Kohana Team * @license http://kohanaframework.org/license * @param string file size in SB format * @return float */ public static function bytes($size = 0) { // Prepare the size $size = trim((string) $size); // Construct an OR list of byte units for the regex $accepted = implode('|', array_keys(static::$byte_units)); // Construct the regex pattern for verifying the size format $pattern = '/^([0-9]+(?:\.[0-9]+)?)('.$accepted.')?$/Di'; // Verify the size format and store the matching parts if (!preg_match($pattern, $size, $matches)) { throw new \Exception('The byte unit size, "'.$size.'", is improperly formatted.'); } // Find the float value of the size $size = (float) $matches[1]; // Find the actual unit, assume B if no unit specified $unit = \Arr::get($matches, 2, 'B'); // Convert the size into bytes $bytes = $size * pow(2, static::$byte_units[$unit]); return $bytes; } /** * Converts a number of bytes to a human readable number by taking the * number of that unit that the bytes will go into it. Supports TB value. * * Note: Integers in PHP are limited to 32 bits, unless they are on 64 bit * architectures, then they have 64 bit size. If you need to place the * larger size then what the PHP integer type will hold, then use a string. * It will be converted to a double, which should always have 64 bit length. * * @param integer * @param integer * @return boolean|string */ public static function format_bytes($bytes = 0, $decimals = 0) { $quant = array( 'TB' => 1099511627776, // pow( 1024, 4) 'GB' => 1073741824, // pow( 1024, 3) 'MB' => 1048576, // pow( 1024, 2) 'KB' => 1024, // pow( 1024, 1) 'B ' => 1, // pow( 1024, 0) ); foreach ($quant as $unit => $mag ) { if (doubleval($bytes) >= $mag) { return sprintf('%01.'.$decimals.'f', ($bytes / $mag)).' '.$unit; } } return false; } /** * Converts a number into a more readable human-type number. * * Usage: * * echo Num::quantity(7000); // 7K * echo Num::quantity(7500); // 8K * echo Num::quantity(7500, 1); // 7.5K * * * @param integer * @param integer * @return string */ public static function quantity($num, $decimals = 0) { if ($num >= 1000 && $num < 1000000) { return sprintf('%01.'.$decimals.'f', (sprintf('%01.0f', $num) / 1000)).'K'; } elseif ($num >= 1000000 && $num < 1000000000) { return sprintf('%01.'.$decimals.'f', (sprintf('%01.0f', $num) / 1000000)).'M'; } elseif ($num >= 1000000000) { return sprintf('%01.'.$decimals.'f', (sprintf('%01.0f', $num) / 1000000000)).'B'; } return $num; } /** * Formats a number by injecting non-numeric characters in a specified * format into the string in the positions they appear in the format. * * Usage: * * echo Num::format('1234567890', '(000) 000-0000'); // (123) 456-7890 * echo Num::format('1234567890', '000.000.0000'); // 123.456.7890 * * * @link http://snippets.symfony-project.org/snippet/157 * @param string the string to format * @param string the format to apply * @return string */ public static function format($string = '', $format = '') { if(empty($format) or empty($string)) { return $string; } $result = ''; $fpos = 0; $spos = 0; while ((strlen($format) - 1) >= $fpos) { if (ctype_alnum(substr($format, $fpos, 1))) { $result .= substr($string, $spos, 1); $spos++; } else { $result .= substr($format, $fpos, 1); } $fpos++; } return $result; } /** * Transforms a number by masking characters in a specified mask format, and * ignoring characters that should be injected into the string without * matching a character from the original string (defaults to space). * * Usage: * * echo Num::mask_string('1234567812345678', '************0000'); ************5678 * echo Num::mask_string('1234567812345678', '**** **** **** 0000'); // **** **** **** 5678 * echo Num::mask_string('1234567812345678', '**** - **** - **** - 0000', ' -'); // **** - **** - **** - 5678 * * * @link http://snippets.symfony-project.org/snippet/157 * @param string the string to transform * @param string the mask format * @param string a string (defaults to a single space) containing characters to ignore in the format * @return string the masked string */ public static function mask_string($string = '', $format = '', $ignore = ' ') { if(empty($format) or empty($string)) { return $string; } $result = ''; $fpos = 0; $spos = 0; while ((strlen($format) - 1) >= $fpos) { if (ctype_alnum(substr($format, $fpos, 1))) { $result .= substr($string, $spos, 1); $spos++; } else { $result .= substr($format, $fpos, 1); if (strpos($ignore, substr($format, $fpos, 1)) === false) { ++$spos; } } ++$fpos; } return $result; } /** * Formats a phone number. * * @link http://snippets.symfony-project.org/snippet/157 * @param string the unformatted phone number to format * @param string the format to use, defaults to '(000) 000-0000' * @return string the formatted string * @see format */ public static function format_phone($string = '', $format = null) { is_null($format) and $format = static::$config['formatting']['phone']; return static::format($string, $format); } /** * Formats a variable length phone number, using a standard format. * * Usage: * * echo Num::smart_format_phone('1234567'); // 123-4567 * echo Num::smart_format_phone('1234567890'); // (123) 456-7890 * echo Num::smart_format_phone('91234567890'); // 9 (123) 456-7890 * echo Num::smart_format_phone('123456'); // => 123456 * * * @param string the unformatted phone number to format * @see format */ public static function smart_format_phone($string) { $formats = static::$config['formatting']['smart_phone']; if(is_array($formats) and isset($formats[strlen($string)])) { return static::format($string, $formats[strlen($string)]); } return $string; } /** * Formats a credit card expiration string. Expects 4-digit string (MMYY). * * @param string the unformatted expiration string to format * @param string the format to use, defaults to '00-00' * @see format */ public static function format_exp($string, $format = null) { is_null($format) and $format = static::$config['formatting']['exp']; return static::format($string, $format); } /** * Formats (masks) a credit card. * * @param string the unformatted credit card number to format * @param string the format to use, defaults to '**** **** **** 0000' * @see mask_string */ public static function mask_credit_card($string, $format = null) { is_null($format) and $format = static::$config['formatting']['credit_card']; return static::mask_string($string, $format); } } /* End of file num.php */