人民币数值转中文大写

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;
    }

}
//$a = new Num2RmbClass;
echo (Num2RmbClass::num2rmb(‘1600020039.9989‘,‘圆‘,false,false,false));//壹佰贰拾叁圆肆角伍分
时间: 2024-08-04 06:50:58

人民币数值转中文大写的相关文章

SSRS 实现数字金额转换为中文大写汉字

比如: 金额=49,701,120.00,将其转换为"肆仟玖佰柒拾万壹仟壹佰贰拾元整":金额 289,546.52 ,转换为 "贰拾捌万玖仟伍佰肆拾陆元伍角贰分". 解决方法:添加VB的转换函数写在CODE里,然后在表达式里调用自定义函数转换. 如:增加两个占位符表达式,如小数位为0时表达式2添加"整", 表达式1=Code.GetCnString(Fields!Amount.Value) 表达式2=IIF(Fields!Amount.Value

金额阿拉伯数字转换为中文大写

最近的做项目中需要弄一个金额是阿拉伯数字转为中文大写的金额,自己偷懒了,就总结一下. 第一种方法相对复杂 private static readonly String cnNumber = "零壹贰叁肆伍陆柒捌玖"; private static readonly String cnUnit = "分角元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟"; 1 public static String GetCnString(String MoneyString) //传入数字 2

阿拉伯数字转换成中文大写

package Demo;public class Money{ public static void main(String args[]) { Money mon = new Money(); System.out.println(mon.change("124")); } //把"1"转化成1时用下标找TOBIG[1]就是对应的 private static final String[] TOBIG = new String[] { "零"

【OBJC】数字转中文大写

博客园都不知道怎么外链图片…… - (void)numToString:(double)num{ int iLen,iNum,iAddZero=0; NSMutableString *szChMoney = [[NSMutableString alloc] init]; NSArray *hzUnit = @[@"分",@"角",@"元",@"拾",@"佰",@"仟",@"万&

POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写

再读本篇文章之前,请先看我的前一篇文章,前一篇文章中有重点讲到POI设置EXCEL单元格格式为文本格式,剩下的设置小数.百分比.货币.日期.科学计数法和中文大写这些将在下面一一写出 以下将要介绍的每一种都会用到这三行中的变量 HSSFWorkbook demoWorkBook = new HSSFWorkbook(); HSSFSheet demoSheet = demoWorkBook.createSheet("The World's 500 Enterprises"); HSSFC

金额小写转中文大写类

using System; using System.Collections.Generic; using System.Text; namespace Class_ZhH { /// <summary> /// 金额小写转中文大写类(附带一个数字转大写). /// 整数支持到万亿:小数部分支持到分(超过两位将进行Banker舍入法处理) /// </summary> public class NumGetString { private static String[] Ls_Sh

日期转换为中文大写数字

动手写一个转换日期的小方法,虽然很短,但是需要考虑的东西还是挺多的,记录一下. /// <summary> /// 将日期转换为中文大写 /// 如:一九八三 十一 二十七 /// </summary> public class ChineseNumberHelper { static Dictionary<int, string> _theNumOfChineseCapital = new Dictionary<int, string>() { {0,&q

JavaScript表单验证中文大写字母

JavaScript表单验证中文大写字母,判断一个输入量是否为中文或大写的英文字母,通过正则表达式实现. // 检查是否为有效的真实姓名,只能含有中文或大写的英文字母 function isValidTrueName(strName){ var str = Trim(strName); //判断是否为全英文大写或全中文,可以包含空格 var reg = /^[A-Z u4E00-u9FA5]+$/;http://rl.82676666.com if(reg.test(str)){ return

数字转中文,大写,金额

最近,又发现了另外一种数字转中文,大写,金额的方法,觉得会比之前找到的跟合适一点:npm安装包地址:https://npm.taobao.org/package/nzh(在这里,会有更加详细的使用介绍.而我就只是测了其中一种......) 简介:Nzh适用于开发过程中需要将数字转换为中文的场景 以字符串的方式转换,解决超大数及浮点数等问题,请自行对原数据进行四舍五入等操作. 1.首先在项目中安装依赖包:npm install nzh 2.其实这是自己在做小测试的时候,使用nzh的,在安装完依赖包