写一个方法实现数字转中文大写的方法

简介: 之前开发了一个报销相关的应用,其中遇到了小写数字转中文大写的需求,搜寻了一些资料以后对方法进行了改进,现在分享出来给大家参考

话不多说直接上代码:

export function numberToChinese(money) {
   
   
    //汉字的数字
    var cnNums = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
    //基本单位
    var cnIntRadice = new Array('', '拾', '佰', '仟');
    //对应整数部分扩展单位
    var cnIntUnits = new Array('', '万', '亿', '兆');
    //对应小数部分单位
    var cnDecUnits = new Array('角', '分', '毫', '厘');
    //整数金额时后面跟的字符
    var cnInteger = '';
    //整型完以后的单位
    var cnIntLast = '';
    //最大处理的数字
    var maxNum = 999999999999999.9999;
    //金额整数部分
    var integerNum;
    //金额小数部分
    var decimalNum;
    //输出的中文金额字符串
    var chineseStr = '';
    //分离金额后用的数组,预定义
    var parts;
    if (money == '') {
   
   
        return '';
    }
    money = parseFloat(money);
    if (money >= maxNum) {
   
   
        //超出最大处理数字
        return '超出最大数字范围';
    }
    if (money == 0) {
   
   
        chineseStr = cnNums[0] + cnIntLast + cnInteger;
        return chineseStr;
    }
    //转换为字符串
    money = money.toString();
    if (money.indexOf('.') == -1) {
   
   
        integerNum = money;
        decimalNum = '';
    } else {
   
   
        parts = money.split('.');
        integerNum = parts[0];
        decimalNum = parts[1].substr(0, 4);
    }
    //获取整型部分转换
    if (parseInt(integerNum, 10) > 0) {
   
   
        var zeroCount = 0;
        var IntLen = integerNum.length;
        for (var i = 0; i < IntLen; i++) {
   
   
            var n = integerNum.substr(i, 1);
            var p = IntLen - i - 1;
            var q = p / 4;
            var m = p % 4;
            if (n == '0') {
   
   
                zeroCount++;
            } else {
   
   
                if (zeroCount > 0) {
   
   
                    chineseStr += cnNums[0];
                }
                //归零
                zeroCount = 0;
                chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
            }
            if (m == 0 && zeroCount < 4) {
   
   
                chineseStr += cnIntUnits[q];
            }
        }
        chineseStr += cnIntLast + "元";
    }
    //小数部分
    if (decimalNum != '') {
   
   
        var decLen = decimalNum.length;
        for (var i = 0; i < decLen; i++) {
   
   
            var n = decimalNum.substr(i, 1);
            if (n != '0') {
   
   
                chineseStr += cnNums[Number(n)] + cnDecUnits[i];
            } else if (n == '0') {
   
   
                chineseStr += cnNums[Number(n)];
            }
        }
    }
    if (chineseStr == '') {
   
   
        chineseStr += cnNums[0] + cnIntLast + cnInteger;
    } else if (decimalNum == '') {
   
   
        chineseStr += cnInteger + "整";
    }
    return chineseStr;
}


函数中用到了一些相关的变量和数组,如cnNums保存了汉字的数字,cnIntRadice保存了基本单位(拾、佰、仟),cnIntUnits保存了整数部分的扩展单位(万、亿、兆),cnDecUnits保存了小数部分的单位(角、分、毫、厘),cnInteger保存了整数金额时后面跟的字符,cnIntLast保存了整型完以后的单位。

函数首先对输入的金额进行检测和处理,然后根据整数部分和小数部分,使用循环和条件语句构建中文金额字符串。最后根据情况加上“元”和“整”。

image.png

相关文章
|
6月前
|
JavaScript
JS自动生成速记符、拼音简写/拼音的声母(例如:“你挚爱的强哥”转换为“NZADQG”)。提取首字母,返回大写形式;提取拼音, 返回首字母大写形式(全拼)。
JS自动生成速记符、拼音简写/拼音的声母(例如:“你挚爱的强哥”转换为“NZADQG”)。提取首字母,返回大写形式;提取拼音, 返回首字母大写形式(全拼)。
从键盘录入一个字符串,统计该串中有大写字母、小写字母、数字各有多少个。比如:Hello12345World大写:2个 小写:8个数字:5个。
从键盘录入一个字符串,统计该串中有大写字母、小写字母、数字各有多少个。比如:Hello12345World大写:2个 小写:8个数字:5个。
262 0
|
C++
C++实现中文大写与阿拉伯数字的相互转换(类封装)
C++实现中文大写与阿拉伯数字的相互转换(类封装)
583 0
写几个正则表达式:只允许输入汉字、数字、字母、中英文小括号,并且10个字符以内|只允许输入汉字、数字、字母、英文小括号|电话号码正则表达式
写几个正则表达式:只允许输入汉字、数字、字母、中英文小括号,并且10个字符以内|只允许输入汉字、数字、字母、英文小括号|电话号码正则表达式
266 0
转换字符串的首字母为大写
转换字符串的首字母为大写
57 0
判断字符串首个字母是否大写,若大写,则输出该字符串中大写字母的个数 并打印。
判断字符串首个字母是否大写,若大写,则输出该字符串中大写字母的个数 并打印。
156 0
|
Java 程序员 Apache
技术:字符串首字母由大写改小写简单方法以及一些思考归纳
字符串首字母由大写改小写。 首先,这得是一个字符串,其次,他得有能力被改写为小写字母。当然这之前的一些判定需要自行处理。 String的中文含义是:一串;线;细绳;带子;一系列;一连串;一批;字符串;弦等。
技术:字符串首字母由大写改小写简单方法以及一些思考归纳
正则表达式去除空格、符号,只保留中文、英文、数字
正则表达式去除空格、符号,只保留中文、英文、数字
798 0
|
C#
C# 设置textedit只能输入英文数字下划线,并且只能以英文开头(正则表达式)
this.textEdit1.Properties.Mask.EditMask = @"[a-zA-z][a-zA-Z0-9_]*";
1720 0