1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
class Num2RmbClass{
/**
* 人民币数值转中文大写
* @author SunsCheung
* @time 2015.11.11
* @param string $number 数值 默认为0
* @param string $int_unit 币种单位,默认"元",有的需求可能为"圆"
* @param bool $is_round 是否对小数进行四舍五入
* @param bool $is_extra_zero 是否对整数部分以0结尾,小数存在的数字附加0,比如1960.30,
* 有的系统要求输出"壹仟玖佰陆拾元零叁角",实际上"壹仟玖佰陆拾元叁角"也是对的
* @param bool $dec_to_int 是否对让小数部分进位到个位,如果进位,个位加1,小数为0,
* @return string
*/
public static function num2rmb( $number = 0, $int_unit = '元' , $is_round = TRUE, $is_extra_zero = FALSE, $dec_to_int = FALSE) {
// 将数字切分成两段
$parts = explode ( '.' , $number , 2);
$int = isset( $parts [0]) ? strval ( $parts [0]) : '0' ;
$dec = isset( $parts [1]) ? strval ( $parts [1]) : '' ;
// 如果小数点后多于2位,不四舍五入就直接截,否则就处理
$dec_len = strlen ( $dec );
if (isset( $parts [1]) && $dec_len > 2) {
if ( $is_round ){
if ( round ( floatval ( "0." . $dec ), 2) == 1 && $dec_to_int ){ //小数进位到个位
$int = empty ( $int )?1: strval ( $parts [0]+1);
$dec = 0;
} elseif ( round ( floatval ( "0." . $dec ), 2) == 1){ //小数不进位到个位
$dec = "99" ;
} else {
$dec = substr ( strrchr ( strval ( round ( floatval ( "0." . $dec ), 2)), '.' ), 1);
echo $dec ; die ( 'boss' );
}
} else {
$dec = substr ( $parts [1], 0, 2);
}
}
// 当number为0.001时,小数点后的金额为0元
if ( empty ( $int ) && empty ( $dec )) {
return '零' ;
}
// 定义
$chs = array ( '0' , '壹' , '贰' , '叁' , '肆' , '伍' , '陆' , '柒' , '捌' , '玖' );
$uni = array ( '' , '拾' , '佰' , '仟' );
$dec_uni = array ( '角' , '分' );
$exp = array ( '' , '万' );
$res = '' ;
// 整数部分从右向左找
for ( $i = strlen ( $int ) - 1, $k = 0; $i >= 0; $k ++) {
$str = '' ;
// 按照中文读写习惯,每4个字为一段进行转化,i一直在减
for ( $j = 0; $j < 4 && $i >= 0; $j ++, $i --) {
$u = $int { $i } > 0 ? $uni [ $j ] : '' ; // 非0的数字后面添加单位
$str = $chs [ $int { $i }] . $u . $str ;
}
//echo $str."|".($k - 2)."<br>";
$str = rtrim( $str , '0' ); // 去掉末尾的0
$str = preg_replace( "/0+/" , "零" , $str ); // 替换多个连续的0
if (!isset( $exp [ $k ])) {
$exp [ $k ] = $exp [ $k - 2] . '亿' ; // 构建单位
}
$u2 = $str != '' ? $exp [ $k ] : '' ;
$res = $str . $u2 . $res ;
}
// 如果小数部分处理完之后是00,需要处理下
$dec = rtrim( $dec , '0' );
// 小数部分从左向右找
if (! empty ( $dec )) {
$res .= $int_unit ;
// 是否要在整数部分以0结尾的数字后附加0,有的系统有这要求
if ( $is_extra_zero ) {
if ( substr ( $int , -1) === '0' ) {
$res .= '零' ;
}
}
for ( $i = 0, $cnt = strlen ( $dec ); $i < $cnt ; $i ++) {
$u = $dec { $i } > 0 ? $dec_uni [ $i ] : '' ; // 非0的数字后面添加单位
$res .= $chs [ $dec { $i }] . $u ;
}
$res = rtrim( $res , '0' ); // 去掉末尾的0
$res = preg_replace( "/0+/" , "零" , $res ); // 替换多个连续的0
} else {
$res .= $int_unit . '整' ;
}
return $number < 0 ? "(负)" . $res : $res ;
}
}
|
使用方法
1
2
|
//$a = new Num2RmbClass;
echo (Num2RmbClass::num2rmb( '1600020039.9989' , '圆' ,false,false,false));
|
再给大家分享一个简单点的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
function cny( $ns )
{
static $cnums = array ( "零" , "壹" , "贰" , "叁" , "肆" , "伍" , "陆" , "柒" , "捌" , "玖" ),
$cnyunits = array ( "圆" , "角" , "分" ),
$grees = array ( "拾" , "佰" , "仟" , "万" , "拾" , "佰" , "仟" , "亿" );
list( $ns1 , $ns2 ) = explode ( "." , $ns ,2);
$ns2 = array_filter ( array ( $ns2 [1], $ns2 [0]));
$ret = array_merge ( $ns2 , array (implode( "" , _cny_map_unit( str_split ( $ns1 ), $grees )), "" ));
$ret = implode( "" , array_reverse (_cny_map_unit( $ret , $cnyunits )));
return str_replace ( array_keys ( $cnums ), $cnums , $ret );
}
function _cny_map_unit( $list , $units )
{
$ul = count ( $units );
$xs = array ();
foreach ( array_reverse ( $list ) as $x )
{
$l = count ( $xs );
if ( $x != "0" || !( $l %4))
{
$n =( $x == '0' ? '' : $x ).( $units [( $l -1)% $ul ]);
}
else
{
$n = is_numeric ( $xs [0][0]) ? $x : '' ;
}
array_unshift ( $xs , $n );
}
return $xs ;
}
$value = '23058.04' ;
print cny( $value ); echo '
';
输出:贰万叁仟零伍拾捌圆肆角
|
再来一个网友做好的也很不错
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
/**
*数字金额转换成中文大写金额的函数
*String Int $num 要转换的小写数字或小写字符串
*return 大写字母
*小数位为两位
**/
function num_to_rmb( $num ){
$c1 = "零壹贰叁肆伍陆柒捌玖" ;
$c2 = "分角元拾佰仟万拾佰仟亿" ;
//精确到分后面就不要了,所以只留两个小数位
$num = round ( $num , 2);
//将数字转化为整数
$num = $num * 100;
if ( strlen ( $num ) > 10) {
return "金额太大,请检查" ;
}
$i = 0;
$c = "" ;
while (1) {
if ( $i == 0) {
//获取最后一位数字
$n = substr ( $num , strlen ( $num )-1, 1);
} else {
$n = $num % 10;
}
//每次将最后一位数字转化为中文
$p1 = substr ( $c1 , 3 * $n , 3);
$p2 = substr ( $c2 , 3 * $i , 3);
if ( $n != '0' || ( $n == '0' && ( $p2 == '亿' || $p2 == '万' || $p2 == '元' ))) {
$c = $p1 . $p2 . $c ;
} else {
$c = $p1 . $c ;
}
$i = $i + 1;
//去掉数字最后一位了
$num = $num / 10;
$num = (int) $num ;
//结束循环
if ( $num == 0) {
break ;
}
}
$j = 0;
$slen = strlen ( $c );
while ( $j < $slen ) {
//utf8一个汉字相当3个字符
$m = substr ( $c , $j , 6);
//处理数字中很多0的情况,每次循环去掉一个汉字“零”
if ( $m == '零元' || $m == '零万' || $m == '零亿' || $m == '零零' ) {
$left = substr ( $c , 0, $j );
$right = substr ( $c , $j + 3);
$c = $left . $right ;
$j = $j -3;
$slen = $slen -3;
}
$j = $j + 3;
}
//这个是为了去掉类似23.0中最后一个“零”字
if ( substr ( $c , strlen ( $c )-3, 3) == '零' ) {
$c = substr ( $c , 0, strlen ( $c )-3);
}
//将处理的汉字加上“整”
if ( empty ( $c )) {
return "零元整" ;
} else {
return $c . "整" ;
}
}
echo num_to_rmb(23000000.00); //贰仟叁佰万元整
|