May 27
前些天写的程序在上线的时候出现BUG了,错误提示就是call_user_func_array无法调用指定的函数。

代码大概是这样的
class foo {
  public static function bar($arg1, $arg2) {
    //do sth.
  }
}

call_user_func_array("foo:bar", array(1, 2));


追了一下发现是PHP版本的问题,开发环境使用的是php 5.2.17,而线上环境是旧版本的5.1.6。5.1版的php的call_user_func / call_user_func_array函数没法调用类的静态函数,所以出现了这个问题。

没有很好的解决方法,大致就是

1. 升级PHP(最后我们是这么做的)

2. 使用字符串拼出一段php代码,然后用eval来执行。很挫,但是也能用。
May 21
支持到 万亿,精确到角分。
<?php

$_NUMS = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');

function four_num($num)
{
    global $_NUMS;
    $unit = array("", "拾", "佰", "仟");
    $str = '';
    $i = 0;
    if ($num == 0)
        return '零';
    $arr_str = array();
    while ($num > 0) {
        $x = $num % 10;
        if ($x == 0)
            $arr_str[] = $_NUMS[0];
        else
            $arr_str[] = $_NUMS[$x] . $unit[$i];
        $num = floor($num / 10);
        $i++;
    }
    $arr_str = array_reverse($arr_str);
    $str = join("", $arr_str);
    $str = preg_replace('/(零)+/', '零', $str);
    $str = preg_replace('/零$/', '', $str);
    return $str;
}

function rmb($amount)
{
    //去除开头的空格、正负号、前导0、小数点、符号
    $amount = preg_replace('/(^\s*(\+|-)?0*)|\.|¥/', '', $amount);
    if ($amount == '')
        return '零元整';
    if (strlen($amount) == 1) $amount = '0' . $amount;

    $int_part = substr($amount, 0, '-2');
    $float_part = substr($amount, -2);
    $jiao = intval($float_part{0});
    $fen = intval($float_part{1});

    $unit = array('', '万', '亿', '万');
    while (strlen($int_part) % 4 != 0) $int_part = '0' . $int_part;
    $groups = str_split($int_part, 4);
    $groups = array_reverse($groups);
    //print_r($groups);
    $arr_str = array();
    for ($i = 0; $i < count($groups); $i++) {
        $arr_str[] = four_num($groups[$i]) . $unit[$i];
        if ($groups[$i] < 1000)
            $arr_str[] = '零';
    }
    $arr_str = array_reverse($arr_str);
    //print_r($arr_str);
    $ret = join('', $arr_str);
    $ret = preg_replace('/^(零)+/', '', $ret);
    $ret = preg_replace('/(零)+/', '零', $ret);
    $ret = preg_replace('/零万/', '', $ret);
    $ret = preg_replace('/零亿/', '亿', $ret);
    $ret = preg_replace('/(零)$/', '', $ret);
    if ($ret !== '') $ret .= '元';
    if ($float_part == 0) {
        $ret .= '整';
    }
    else {
        global $_NUMS;
        if ($ret !== '' && ($groups[0] % 10 == 0 || $jiao == 0)) {
            $ret .= '零';
        }
        if ($jiao != 0) $ret .= $_NUMS[$jiao] . '角';
        if ($fen != 0) $ret .= $_NUMS[$fen] . '分';
    }
    return $ret;
}

//TEST CASE
case_test("壹仟肆佰零玖元伍角", rmb('1409.50'));
case_test("陆仟零柒元壹角肆分", rmb('6007.14'));
case_test("壹仟陆佰捌拾元零叁角贰分", rmb('1680.32'));
case_test("壹拾万柒仟元零伍角叁分", rmb('107000.53'));
case_test("壹万陆仟肆佰零玖元零贰分", rmb('16409.02'));
case_test("叁佰贰拾伍元零肆分", rmb('325.04'));
case_test("壹亿壹仟元零叁角", rmb('10000100030'));

function case_test($stdans, $ans)
{
    if ($stdans == $ans)
        echo "TEST OK\n";
    else
        echo "$stdans <==> $ans\n";
}

?>
May 21

Reborn 不指定

felix021 @ 2011-5-21 23:15 [随想] 评论(2) , 引用(0) , 阅读(7132) | Via 本站原创
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]