这段时间接手了一个项目,看着老前辈们写的代码有很高的复用性,就摘录出来进行记录,方便后续查阅。
针对于number类型的金额从数据库中查出,公司的老框架经常会有返回为Long,BigDecimal格式什么的。当然这个老前辈们已经考虑到了,有特定的方法去进行接收,但是架不住不熟悉框架不是。经过摸索,发现用Object接收最为合适(但是就要多很多isEmpty(),isBlack())。 考虑这个方法不适合大众,有灌水嫌疑,那就加上珍藏部分金额格式转换(很好用的呀!)。
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()。但实际业务是多样的,例如我们就见过只存储换行,换页的字段)。
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);
实测很好用,希望大家留言相互交流;
交流促进发展,发展提升自身进步,加油各位!