查阅代码整理(一)之String非空判断及金额格式类型转换(java、js)

这段时间接手了一个项目,看着老前辈们写的代码有很高的复用性,就摘录出来进行记录,方便后续查阅。

背景:

      针对于number类型的金额从数据库中查出,公司的老框架经常会有返回为Long,BigDecimal格式什么的。当然这个老前辈们已经考虑到了,有特定的方法去进行接收,但是架不住不熟悉框架不是。经过摸索,发现用Object接收最为合适(但是就要多很多isEmpty(),isBlack())。 考虑这个方法不适合大众,有灌水嫌疑,那就加上珍藏部分金额格式转换(很好用的呀!)。

 

1 isBlank()和isEmpty()小坑规避

 

org.apache.commons.lang.StringUtils 类提供了 String 的常用操作,最为常用的判断是否为空的方法isEmpty(String str) 和 isBlank(String str)。
以下是两个方法源码:

StringUtils.isBlank(String str)判断某字符串是否为空或长度为 0 或由空白符 (whitespace) 构成

isWhitespace() 方法用于判断指定字符是否为空白字符,空白符包含:空格、tab 键、换行符。

 public static boolean isBlank(String str) {
        int strLen;
        if (str != null && (strLen = str.length()) != 0) {
            for(int i = 0; i < strLen; ++i) {
                if (!Character.isWhitespace(str.charAt(i))) {
                    return false;
                }
            }

            return true;
        } else {
            return true;
        }
    }

示例:

//isBlank(String str) 方法示例

StringUtils.isBlank(null);// true

StringUtils.isBlank("");//true

StringUtils.isBlank("     ");//true

StringUtils.isBlank("\t \n \f \r");// true  \t 制表符 \n换行符 \f换页符  \r回车符

StringUtils.isBlank("\b");// false "\b"为单词边界符

StringUtils.isBlank("bob");//false

StringUtils.isEmpty(String str)判断某字符串是否为空,为空的标准是 str==null 或str.length()==0,少了空白符判断。

 public static boolean isEmpty(String str) {
     return str == null || str.length() == 0;
 }

示例:

//isEmpty(String str) 方法示例

StringUtils.isEmpty(null);// true

StringUtils.isEmpty("");// true

StringUtils.isEmpty(" ");// false 

StringUtils.isEmpty("bob");// false


小坑规避

水灌完了,提个小坑,网上搜了下部分讲解不全面。

String的isEmpty()方法,在String为null的时候,会出现空指针错误;

这个是网上说的,搬过来就不引用出处了:
”” 和 new String(),会有占位符,也就是创建了对象,而null的时候,String 不会创建占位符。

既:”” 和new String() 的时候,String是有长度的,而null没有长度。

实际使用时候要多注意的三点(小知识)

1)相对的如果你new 了一个PO,这个PO字段值没有值,但这个时候PO并不是空的,判断时候要注意;

2)如果初始PO 为 null,这个时候要注意对PO非空的校验;

3)(str!=null&&!str.isEmpty())配套使用能规避空指针问题(有人会说可以用isBlank()。但实际业务是多样的,例如我们就见过只存储换行,换页的字段)。

 

2 很实用的金额类型转换

Sting类型的字符串(纯数字)转化为千分位显示;

/**
 * String 类型转为number类型之后格式化数据(仅String类型的数字串适用)
 * @param pattern 转化格式
 * @param value 值
 * @return String 
 */
public static String format(String pattern, Object value) {
        if (value == null) {
            if (pattern != null && pattern.indexOf("#,##0.00") != -1) {
                return new DecimalFormat(pattern).format(0);
            }
            return "";
        } else if (value instanceof Number) {
            return new DecimalFormat(pattern).format(value);
        } else if (value instanceof Date) {
            return new SimpleDateFormat(pattern).format(value);
        } else if (value instanceof Calendar) {
            return new SimpleDateFormat(pattern).format(((Calendar) value).getTime());
        } else {
            return value.toString();
        }
    }

使用: StringUtils.format('#,##0.00',String  number);

JS修改格式为千分位:

1)将数值四舍五入(保留2位小数)后格式化成金额形式

* 将数值四舍五入(保留2位小数)后格式化成金额形式

*

* @param num 数值(Number或者String)

* @return 金额格式的字符串,如'1,234,567.45'

* @type String

*/

function formatCurrency(num) {

num = num.toString().replace(/\$|\,/g,'');

if(isNaN(num))

num = "0";

sign = (num == (num = Math.abs(num)));

num = Math.floor(num*100+0.50000000001);

cents = num%100;

num = Math.floor(num/100).toString();

if(cents<10)

cents = "0" + cents;

for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)

num = num.substring(0,num.length-(4*i+3))+','+

num.substring(num.length-(4*i+3));

return (((sign)?'':'-') + num + '.' + cents);

}

2)将数值四舍五入(保留1位小数)后格式化成金额形式

/**

* 将数值四舍五入(保留1位小数)后格式化成金额形式

*

* @param num 数值(Number或者String)

* @return 金额格式的字符串,如'1,234,567.4'

* @type String

*/

function formatCurrencyTenThou(num) {

num = num.toString().replace(/\$|\,/g,'');

if(isNaN(num))

num = "0";

sign = (num == (num = Math.abs(num)));

num = Math.floor(num*10+0.50000000001);

cents = num%10;

num = Math.floor(num/10).toString();

for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)

num = num.substring(0,num.length-(4*i+3))+','+

num.substring(num.length-(4*i+3));

return (((sign)?'':'-') + num + '.' + cents);

}


// 添加金额格式化

jQuery.extend({

formatFloat:function(src, pos){

var num = parseFloat(src).toFixed(pos);

num = num.toString().replace(/\$|\,/g,'');

if(isNaN(num)) num = "0";

sign = (num == (num = Math.abs(num)));

num = Math.floor(num*100+0.50000000001);

cents = num%100;

num = Math.floor(num/100).toString();

if(cents<10) cents = "0" + cents;

for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)

num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));

return (((sign)?'':'-') + num + '.' + cents);

}

});

另一种方式实现千分位

/**
	 * 初始化需要执行千分位显示的金额dom元素事件
	 * @param jQobj jquery 对象
	 */
	function initMonehQfwEvent(jQobj){
		jQobj.focus(function(){
		    var value = $(this).val();
			if(value != ""){
				$(this).val(value.replace(/,/g,''));
			}
	   });
	   
		jQobj.blur(function(){
		   var value = $(this).val();
			if(value == ""){
				   return false;
			}
			value=value.replace(/,/g,'');
			value=value.replace(/,/g,'');
			var patrn=/^[-+]?([1-9]\d*|0)(\.\d*[0-9])?$/; 
			if(patrn.test(value) == false){
			    $(this).val("");
			    alert("只能输入正负数(包含小数),请重新输入!"); 
		    }else{
		    	$(this).val(thousandBitSeparator(value));
		    }
			
	   });
	}
	
	/**
	 * 格式化科学技术法数据,展示正常数字
	 * @param jQobj jQuery对象
	 */
	function showNumSCE(jQobj){
		jQobj.each(function(){
			   var value = $(this).val();
				if(value != ""){
					var realNum = parseFloat(value).toString();//new Number(value).toFixed(2)
					$(this).val(thousandBitSeparator(realNum));
				}
			});
	}


//千位分隔符 
function thousandBitSeparator(str) {
	var fh = "";
	if(str.indexOf("-") == 0){
		str = str.substring(str.indexOf("-")+1,str.length);
		fh = "-";
	}else if(str.indexOf("+") == 0){
		str = str.substring(str.indexOf("+")+1,str.length);
	}
	if (/[^0-9\.\-]/.test(str)) {
		return "\u5fc5\u987b\u662f\u6570\u5b57\uff01";
	}
	str = str.replace(/^(\d*)$/, "$1.");
	str = (str + "00").replace(/(\d*\.\d\d)\d*/, "$1");
	str = str.replace(".", ",");
	var re = /(\d)(\d{3},)/;
	while (re.test(str)) {
		str = str.replace(re, "$1,$2");
	}
	str = str.replace(/,(\d\d)$/, ".$1");
	return fh + str.replace(/^\./, "0.");
}

使用:

$(document).ready(function(){
   initMonehQfwEvent($(moneyIds));//初始化需要执行千分位显示的金额dom元素事件

    showNumSCE($(moneyIds));//格式化科学技术法数据,展示千分位

   //对金额进行格式化
   $(".tbody").each(function(index) {
   showNumSCE($(document.getElementsByName("moneyName")[index]));//保存科学计数法数据时,转换为数字
        
 });
});

修改为正常数字

/**
	 * 保存科学计数法数据时,转换为数字
	 */
	function saveNumSCE(jQobj){
		jQobj.each(function(){
		   var value = $(this).val();
			if(value != ""){
				$(this).val(value.replace(/,/g,''));
			}
		});
	}

3)数字金额大写转换  参数(根据实际要求进行修改)
num  需要转换的数字    bz  币种   bzname 币种名称  美元,日元等

//数字金额格式化
function number_format(str){
	var isFs=false;
	if(/[^0-9\.\-]/.test(str)) return "必须是数字!";
    if (str<0){
	  	isFs=true;
		str=String(-str);
	}else{
		str=String(str);
	}
	str=str.replace(/^(\d*)$/,"$1.");
	str=(str+"00").replace(/(\d*\.\d\d)\d*/,"$1");
	str=str.replace(".",",");
	var re=/(\d)(\d{3},)/;
	while(re.test(str))
		str=str.replace(re,"$1,$2");
                
	str=str.replace(/,(\d\d)$/,".$1");
	if(isFs) str="-"+str;
	return "¥" + str.replace(/^\./,"0.")
 }
//数字金额大写转换
function chineseNumber(num){
    if (isNaN(num) || num > Math.pow(10, 12)) 
        return ""
    var cn = "零壹贰叁肆伍陆柒捌玖"
    var unit = new Array("拾佰仟", "分角")
    var unit1 = new Array("万亿", "")
    var numArray = num.toString().split(".")
    var start = new Array(numArray[0].length - 1, 2)
    
    function toChinese(num, index){
        var num = num.replace(/\d/g, function($1){
            return cn.charAt($1) + unit[index].charAt(start-- % 4 ? start % 4 : -1)
        })
        return num
    }
    
    for (var i = 0; i < numArray.length; i++) {
        var tmp = ""
        for (var j = 0; j * 4 < numArray[i].length; j++) {
            var strIndex = numArray[i].length - (j + 1) * 4
            var str = numArray[i].substring(strIndex, strIndex + 4)
            var start = i ? 2 : str.length - 1
            var tmp1 = toChinese(str, i)
            tmp1 = tmp1.replace(/(零.)+/g, "零").replace(/零+$/, "")
            tmp = (tmp1 + unit1[i].charAt(j - 1)) + tmp
        }
        numArray[i] = tmp
    }
    
    numArray[1] = numArray[1] ? numArray[1] : ""
    numArray[0] = numArray[0] ? numArray[0] + "元" : numArray[0], numArray[1] = numArray[1].replace(/^零+/, "")
    numArray[1] = numArray[1].match(/分/) ? numArray[1] : numArray[1] + "整"
    return numArray[0] + numArray[1]
}

//数字金额大写转换
//num  需要转换的数字
//bz   币种 00970001
//bzname 币种名称  美元,日元等
function cmycurd(num,bz,bzname){  //转成人民币大写金额形式
  if(bz != '00970001') {
	  return "";
  }
  if (num == 0){
      if(bz == '00970001') {
	      return '零元整';
      }
      return '零' + bzname + '整';
  }
 //  alert(bzname);
  var str1 = '零壹贰叁肆伍陆柒捌玖';  //0-9所对应的汉字
  var str2 = '万仟佰拾亿仟佰拾万仟佰拾元角分'; //数字位所对应的汉字
  var str3;    //从原num值中取出的值
  var str4;    //数字的字符串形式
  var str5 = '';  //人民币大写金额形式
  var i;    //循环变量
  var j;    //num的值乘以100的字符串长度
  var ch1;    //数字的汉语读法
  var ch2;    //数字位的汉字读法
  var nzero = 0;  //用来计算连续的零值是几个
  
  num = Math.abs(num).toFixed(2);  //将num取绝对值并四舍五入取2位小数
  str4 = (num * 100).toFixed(0).toString();  //将num乘100并转换成字符串形式
  
  j = str4.length;      //找出最高位
  if (j > 15){return '溢出';}
  str2 = str2.substr(15-j);    //取出对应位数的str2的值。如:200.55,j为5所以str2=佰拾元角分
  
  //循环取出每一位需要转换的值
  for(i=0;i= 3){
             ch1 = '';
             ch2 = '';
             nzero = nzero + 1;
           }else{
             if (j >= 11){
               ch1 = '';
               nzero = nzero + 1;
             }else{
				 ch1 = '';
				 ch2 = str2.substr(i,1);
				 nzero = nzero + 1;
             }
          }
        }
      }
    }
    if (i == (j-11) || i == (j-3)){  //如果该位是亿位或元位,则必须写上
	  if(bz=="00970002" && i == (j-3)){
		     ch2 = "美元";
		}else{
		     ch2 = str2.substr(i,1);
		}
    }
    str5 = str5 + ch1 + ch2;
    
    if (i == j-1 && str3 == '0' ){   //最后一位(分)为0时,加上“整”
      if(bz!="00970001" && bz !="00970002"){
            str5 = str5 + bzname;
      }
      str5 = str5 + '整';
    }
  }
  if(bz != '00970001' && bz != '00970002') {
      str5 = str5.substr(0, str5.indexOf('元')) + str5.substr(str5.indexOf('元') + 1, str5.length);
  }
  return str5;
}



使用:

var money = chineseNumber(document.getElementById("moneyId").value);

 

实测很好用,希望大家留言相互交流;

交流促进发展,发展提升自身进步,加油各位!

 

 

你可能感兴趣的:(查阅整理,日常小结,分享)