<?php $arr = array( 0, 0.00, 0.001, 0.0001, 1118, 1118.0, 1118.00, 1118.000, 1118.001, 1118.0001, 1118.3, 1118.30, 1118.301, 1118.305, 1118.3001, 1118.5, 1118.50, 1118.500, 1118.501, 1118.578, '0', '0.00', '0.001', '0.0001', '1118', '1118.0', '1118.00', '1118.000', '1118.001', '1118.0001', '1118.3', '1118.30', '1118.301', '1118.305', '1118.3001', '1118.5', '1118.50', '1118.500', '1118.501', '1118.5786', 'dd', ); foreach ($arr as $val) { echo _format_numeric_iphone($val, 2) . PHP_EOL; } /** * If it's a whole number (including 0, 1, 2, N.00), * it will be formatted without decimals. * * Example: * 0.00 => 0 * 1234.00 => 1234 * 1234 => 1234 * '0.00' => 0 * '1234.00' => 1234 * '1234' => 1234 * * Else, it will be formatted with two decimals. * @param * @return */ function _format_numeric_iphone($num, $decimals = 0) { if (is_numeric($num)) { // check if it's a whole number. // _is_digit() is matching: // 0, 0.00, 1234, 1234.00, '0', '1234' if (_is_digit($num)) { return $num; } else { // formatted to two decimals first. $num = number_format($num, $decimals, '.', ''); if (_has_decimal_trailing_zeros($num)) { return number_format($num, 0, '.', ''); } } } return $num; } /** * check if a number contains only "digits" (including negative number) * @param * @return */ function _is_digit($num) { return preg_match('/^[+-]?[0-9]+$/', $num); } /** * This function will not catch 123.00, since PHP convert that to 123 internally. * However, it will catch '123.00'. * @param * @return */ function _has_decimal_trailing_zeros($num) { return preg_match('/\.0+$/', $num); } ?>
Tuesday, November 16, 2010
format numeric
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment