阿拉伯数字转中文大写,以及票据日期的写法

最近闲来无事吧旧代码整理了一下。以前也看到有人写过类似的内容,觉得挺有意思,遂自己试着写了一下,拿来玩玩还是很有意思的。小数点后的就没有弄了。

参考的是银行的那些要求,但是有些规则其实没有完全细致约定清楚……

银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、及时和安全。票据和结算凭证是银行、单位和个人凭以记载账务的会计凭证,是记载经济业务和明确经济责任的一种书面证明。因此,填写票据和结算凭证,必须做到标准化、规范化,要要素齐全、数字正确、字迹清晰、不错漏、不潦草,防止涂改。

一、中文大写金额数字应用正楷或行书填写,如壹(壹)、贰(贰)、叁(叁)、肆(肆)、伍(伍)、陆(陆)、柒、捌、玖、拾、佰、仟、万(万)、亿、元、角、分、零、整(正)等字样。不得用一、二(两)、三、四、五、六、七、八、九、十、念、毛、另(或0)填写,不得自造简化字。如果金额数字书写中使用繁体字,如贰、陆、亿、万、圆的,也应受理。
二、中文大写金额数字到“元”为止的,在“元”之后,应写“整”(或“正”)字,在“角”之后可以不写“整”(或“正”)字。大写金额数字有“分”的,“分”后面不写“整”(或“正”)字。
三、中文大写金额数字前应标明“人民币”字样,大写金额数字有“分”的,“分”后面不写 “整”(或“正”)字。
/四、中文大写金额数字前应标明“人民币”字样,大写金额数字应紧接“人民币”字样填写,不得留有空白。大写金额数字前未印“人民币”字样的,应加填“人民币”三字。在票据和结算凭证大写金额栏内不得预印固定的“仟、佰、拾、万、仟、佰、拾、元、角、分”字样。
五、阿拉伯小写金额数字中有“0”时,中文大写应按照汉语语言规律、金额数字构成和防止涂改的要求进行书写。举例如下:
(一)阿拉伯数字中间有“0”时,中文大写金额要写“零”字。如¥1,409.50,应写成人民币壹仟肆佰零玖元伍角。
(二)阿拉伯数字中间连续有几个“0”时,中文大写金额中间可以只写一个“零” 字。如¥6,007.14,应写成人民币陆仟零柒元壹角肆分。
(三)阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但千位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字。如¥1,680.32,应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分;又如¥107,000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。
(四)阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16,409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾伍元零肆分。
六、阿拉伯小写金额数字前面,均应填写人民币符号“¥”(或草写:)。阿拉伯小写金额数字要认真填写,不得连写分辩不清。
七、票据的出票日期必须使用中文大写。为防止变造票据的出票日期,在填写月、日时,月为壹、贰和壹拾的,日为壹至玖和壹拾、贰拾和叁拾的,应在其前加“零”;日为拾壹至拾玖的,应在其前加“壹”。如1月15日,应写成零壹月壹拾伍日。再如10月20日,应写成零壹拾月零贰拾日。
八、票据出票日期使用小写填写的,银行不予受理。大写日期未按要求规范填写的,银行可予受理,但由此造成损失的,由出票人自行承担。

废话少讲以下是阿拉伯数字转换成中文大写代码:

function NumberToCn() {

    var CN_UPPER_NUM = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
    var CN_UNIT = new Array('亿', '拾', '佰', '仟', '万');

    this.ArabicNumToCn = function(num) {

        var des = '';
        var preZero = false; //前一位为0
        var length = num.length; // 字符串长度
        var hundredMillions = Math.floor(length / 8); // 累加多个“亿”字符的数量(递减)
        var hasValue = true; //是否有非零值

        var index_4 = 0; // 取余4的值
        var index_8 = 0; // 取余8的值

        for (i = 0; i < length; i++) {

            var n = length - 1 - i; // 逐渐变化的长度

            var cInt = num.charAt(i); // 当前字符

            index_4 = n % 4; // 取余4
            index_8 = n % 8; // 取余8

            if (cInt != '0') {
                if (preZero) {
                    des += CN_UPPER_NUM[0];
                    preZero = false;
                }

                des += CN_UPPER_NUM[cInt - '0'];

                // 根据index_4的值接上 '拾', '佰', '仟'
                if (index_4 != 0) {
                    des += CN_UNIT[index_4];
                }

                hasValue = true;
            } else {
                preZero = true;
            }

            //如果万位之前有非零值接上'万'
            if (index_8 == 4 && hasValue) {
                des += CN_UNIT[4];
            }

            //亿位的处理
            if (index_8 == 0) {

                //超过9位数才处理,且亿位之前有非零值
                if (i <= length - 9 && hasValue) {
                    for (j = 0; j < hundredMillions; j++) {
                        //累加接上'亿',不用累加就只去掉循环
                        des += CN_UNIT[0];
                    }
                }

                hundredMillions--; // 将减少“亿”的累加次数
                hasValue = false;
            }
        }

        return des;
    };

//生成中文日期
    this.DateTimeToCn = function(date) {

        var year = date.getFullYear().toString();
        var month = (date.getMonth() + 1).toString();
        var day = date.getDate().toString();

        year = this.ArabicNumToCnPerDigi(year);

        month = this.ArabicNumToCn(month);

        if (month == '壹' || month == '贰' || month == '壹拾') {
            month = '零' + month;
        }

        day = this.ArabicNumToCn(day);

        if (day.Length == 1) {
            day = '零' + day;
        }
        else if (day == '壹拾' || day == '贰拾' || day == '叁拾') {
            day = '零' + day;
        }

        return year + '年' + month + '月' + day + '日';
    };

//每一位都对应转为大写中文
    this.ArabicNumToCnPerDigi = function(num) {

        var temp = '';

        var length = num.length;
        for (i = 0; i < length; i++) {
            temp += CN_UPPER_NUM[num.charAt(i) - '0'];
        }
        return temp;

    };
 }
function Test() {
            var s = new NumberToCn();
            alert(s.ArabicNumToCn('1010101010100000000101010010000'));
            var date = new Date();
            alert(s.DateTimeToCn(date));
            alert(s.ArabicNumToCnPerDigi('1010101010100000000101010010000'));
        }

至于那些日期的写法,我整理了一下:

普通日期表示转换为票据出票日期大写数字规则
年就是一位对一位2011就是贰零壹壹
月1,2,10 -> 零壹,零贰,零壹拾
1:零壹
2:零贰
3:(零)叁
4:(零)肆
5:(零)伍
6:(零)陆
7:(零)柒
8:(零)捌
9:(零)玖
10:零壹拾
11:壹拾壹
12:壹拾贰
日1~9,10,20,30 -> 零壹~零玖,零壹拾,零贰拾,零叁拾
日11~19 -> 壹拾壹~壹拾九
1:零壹       11:壹拾壹       21:贰拾壹      31:叁拾壹
2:零贰       12:壹拾贰       22:贰拾贰
3:零叁       13:壹拾叁       23:贰拾叁
4:零肆       14:壹拾肆       24:贰拾肆
5:零伍       15:壹拾伍       25:贰拾伍
6:零陆       16:壹拾陆       26:贰拾陆
7:零柒       17:壹拾柒       27:贰拾柒
8:零捌       18:壹拾捌       28:贰拾捌
9:零玖       19:壹拾玖       29:贰拾玖
10:零壹拾    20:零贰拾       30:零叁拾

以上就是总结的东西了,因为银行没有一个个去约定,只是举了一两个例子-_-!,问了财务才比较清楚一些,所以可能也有写不准确的,最终还是要按照实际银行和客户的要求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值