1#数字中文化/货币化
if (! function_exists('number2chinese')) {
function number2chinese($number, $isRmb = false)
{
if (!preg_match('/^-?\d+(\.\d+)?$/', $number)) {
throw new Exception('number2chinese() wrong number', 1);
}
list($integer, $decimal) = explode('.', $number . '.0');
$symbol = '';
if (substr($integer, 0, 1) == '-') {
$symbol = '负';
$integer = substr($integer, 1);
}
if (preg_match('/^-?\d+$/', $number)) {
$decimal = null;
}
$integer = ltrim($integer, '0');
$numArr = ['', '一', '二', '三', '四', '五', '六', '七', '八', '九', '.' => '点'];
$descArr = ['', '十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千', '万亿', '十', '百', '千', '兆', '十', '百', '千'];
if ($isRmb) {
$number = substr(sprintf("%.5f", $number), 0, -1);
$numArr = ['', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '.' => '点'];
$descArr = ['', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟', '万亿', '拾', '佰', '仟', '兆', '拾', '佰', '仟'];
$rmbDescArr = ['角', '分', '厘', '毫'];
}
$integerRes = '';
$count = strlen($integer);
if ($count > max(array_keys($descArr))) {
throw new Exception('number2chinese() number too large.', 1);
} else if ($count == 0) {
$integerRes = '零';
} else {
for ($i = 0; $i < $count; $i++) {
$n = $integer[$i];
$j = $count - $i - 1;
$isLing = $i > 1
&& $n !== '0'
&& $integer[$i - 1] === '0';
$cnZero = $isLing ? '零': '';
$cnNum = $numArr[$n];
$isEmptyDanwei = ($n == '0' && $j % 4 != 0)
|| substr($integer, $i - 3, 4) === '0000';
$descMark = isset($cnDesc) ? $cnDesc : '';
$cnDesc = $isEmptyDanwei ? '' : $descArr[$j];
if ($i == 0 && $cnNum == '一' && $cnDesc == '十') $cnNum = '';
$isChangeEr = $n > 1 && $cnNum == '二'
&& !in_array($cnDesc, ['', '十', '百'])
&& $descMark !== '十';
if ($isChangeEr ) $cnNum = '两';
$integerRes .= $cnZero . $cnNum . $cnDesc;
}
}
$decimalRes = '';
$count = strlen($decimal);
if ($decimal === null) {
$decimalRes = $isRmb ? '整' : '';
} else if ($decimal === '0') {
$decimalRes = '零';
} else if ($count > max(array_keys($descArr))) {
throw new Exception('number2chinese() number too large.', 1);
} else {
for ($i = 0; $i < $count; $i++) {
if ($isRmb && $i > count($rmbDescArr) - 1) break;
$n = $decimal[$i];
$cnZero = $n === '0' ? '零' : '';
$cnNum = $numArr[$n];
$cnDesc = $isRmb ? $rmbDescArr[$i] : '';
$decimalRes .= $cnZero . $cnNum . $cnDesc;
}
}
$res = $symbol . ($isRmb ?
$integerRes . ($decimalRes === '零' ? '元整' : "元$decimalRes"):
$integerRes . ($decimalRes ==='' ? '' : "点$decimalRes"));
return $res;
}
}
2# 取毫秒级时间戳
function msectime($msec_length = 3, $random_length = 0, $dot = false, $delay = 0) {
list($msec, $sec) = explode(' ', microtime());
$rand = $random_length > 0 ?
number_format(
mt_rand(1, (int)str_repeat('9', $random_length))
* (float)('0.' . str_repeat('0', $random_length - 1) . '1'),
$random_length,
'.',
'') : '';
$msectime = sprintf('%.0f', (floatval($msec) + floatval($sec) + $delay) * pow(10, $msec_length));
return $dot ? $msectime . '.' . substr($rand, 2) : $msectime . substr($rand, 2);
}