zoukankan      html  css  js  c++  java
  • 较大数字转换为中文表示的方法

    在财务或者其他一些特殊的领域,客户可能需要处理一串较长的数字,这个过程中容易产生一些错误,比如 1000000000 这个数字,普通人几乎不可能一眼看出这串数字到底表示多少,但如果写成10亿,就一目了然了。在最近的一个项目中就遇到了这样的问题,我们为用户提供了一 个文本框来输入一笔交易的金额,因为这涉及到关键信息,所以我们不希望用户在填写这一数字的时候出现任何错误或者疏忽,于是我们设计为监听文本框的键盘事 件,并对文本框里的输入进行即时的反馈:

        $('input').keyup(function(){
                var moneyFormat = cnNumFormat($(this).val());
                $('#money_tip').text(moneyFormat.a+"元");
        });
    

    较大数字转换为中文表示的方法

    这样的话,用户在输入数字的时候可以清晰地即时检查自己有没有输入错误。这里我们使用了一个函数 cnNumFormat ,它将较长的数字转化为上图中的易读的形式。这里所说的较长是指4位数以上,即数字大于 10000 则进行处理。这个函数主要借助正则表达式来完成工作,下面是函数的完整代码:

    var cnNumFormat = function(n){
    	if( isNaN(n) ){
    		return false;
    	}
    	if(n < 10000) return n;
    	var core = {
    		tenThousand : function(n){
    			var nFormatArray = n.match(/(\d+)(\d{4}$)/);
    			var balance = this.checkBalance(nFormatArray[2]);
    			var result = nFormatArray[1] + "万" + balance;
    			return result;
    		},
    		hundredMillion : function(n){
    			var nHM = n.match(/^\d+/)[0];
    			var left = n.match(/\D+\d*$/)[0];
    			var leftNum = n.match(/\d*$/)[0];
    			if(nHM.length <= 4){
    				return n
    			}else{
    				var nFormatArray = nHM.match(/(\d+)(\d{4}$)/);
    				var balance = this.checkBalance(nFormatArray[2]);
    				var result = nFormatArray[1] + "亿" + balance;
    				if(!balance.length){
    					if(!leftNum.length){
    						left = left.replace(/万/,'');
    					}else{
    						left = left.replace(/万/,'零');
    					}
    				}
    				return (result + left).replace(/零零/,'零');
    			}
    		},
    		checkBalance : function(n){
    			if (n === "0000") {
    				return "";
    			}
    			else {
    				return n.replace(/^0+/, "零");
    			}
    		},
    		decimal : function(n){
    			if(!n || n === "00"){
    				return '';
    			}
    			n = n.replace(/\./,'');
    			if( new RegExp('^[1-9]0?$').test(n) ){
    				return n.match(/[1-9]/)+"角";
    			}else if( new RegExp('0\\d?').test(n) ){
    				return n.match(/[1-9]/)+"分";
    			}else{
    				return n.slice(0,1)+"角"+n.slice(1,2)+"分"
    			}
    		}
    	}
    	n += "";
    	n = n.match(/(\d+)(\.\d{1,2})?/);
    	var r1 = core.tenThousand(n[1]);
    	var r2 = core.hundredMillion(r1);
    	var r3 = core.decimal(n[2]);
    	return {
    		a:r2,
    		b:r3
    	};
    }
    
    说明:

    1. 参数: 该函数接收一个参数,等待转换的数字。这个数字可以为数值类型也可以是字符串类型,这并不重要。如果该数字小于10000则原样返回,否则进行转换。

    2. 验证: 为了不和你的验证系统做重复的工作,函数内部只做了 isNaN 的验证,验证失败则返回 false

    3. 小数: 如果要进行转换的数字是浮点数,则小数位的前两位转换为“角分”,更多的则会被忽略。

    4. 返回值: 返回值为一个对象,包含 a 和 b 两个属性,它们分别是整数部分的处理结果和小数部分的处理结果(如果有小数部分)。

    转换的例子:
        var r = cnNumFormat(10002.2);
        r.a + "元" + r.b    //1万零2元2角
    
  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/myphoebe/p/2226316.html
Copyright © 2011-2022 走看看