平时我们有可能遇到需要把网站中的数字(通常是价格)用一种统一的方式显示出来,比如每隔3个字符加一个空格。如果数值比较大的话这种方法很有利于用户阅读。
用XSLT的朋友可能知道在XSL中可以用如下代码实现
<xsl:decimal-format name="currency" decimal-separator="." grouping-separator=" "/>
今天研究了一下,写了一个对应的javascript代码.
有趣的部分是方法二是用正则表达式实现的,非常明了!
function currencyFormatter(oNum,decimalSeparator,groupingNumber,groupingSeparator){
//check type
if(isNaN(parseFloat(oNum))){
alert(oNum + 'is not a number!');
return "";
}
//get sign and make oNum to abstract
var sign = (oNum == (oNum = Math.abs(oNum)));
//get fraction
var nDecimalString = oNum + '';
var nIndex = nDecimalString.indexOf('.');
var sFraction = '';
if(nIndex != -1){
sFraction = nDecimalString.substr(nIndex);
}
//get integer
var nInteger = parseInt(Math.floor(oNum));
var nInegerString = nInteger + '';
//insert separator
var aResult = [];
//method 1
/*
var length = nInegerString.length;
for (var i=length; i > 0 ; i-=groupingNumber) {
var nextI = i - groupingNumber;
if(nextI <= 0){
break;
}
aResult.unshift(nInegerString.substring(nextI,i));
aResult.unshift(groupingSeparator);
};
if(nextI <= 0){
aResult.unshift(nInegerString.substring(nextI,i));
}
*/
//method 2
aResult = nInegerString.split("");
aResult = aResult.reverse();
var exp= new RegExp("(//d{"+groupingNumber+"})",'g');
aResult = aResult.join('').replace(exp,'$1'+groupingSeparator)
aResult = aResult.split('');
aResult = aResult.reverse();
//put things together
var sReturn = ((sign)?'':'-') + aResult.join('') + sFraction;
if(decimalSeparator){
sReturn = sReturn.replace(".",decimalSeparator);
}
return sReturn;
}
例子:
currencyFormatter(-1234567890.323234,',',3,',')
结果 -1,234,567,890,323234