<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题 1</title>
<script type="text/javascript" src="jquery-1.7.1.js"></script>
<script type="text/javascript">
function format(val, formatString){
var re=/%/;
if(re.test(formatString))
{
val=val*100;
}
var numbers = (val+"").split(".");
//--------整理格式化字符串------------
var patterns = formatString.split(".");
var s=[];
var ss;
if(numbers[0].length>patterns[0].length){
var temp=numbers[0].length/3;
var len= (temp=parseInt(temp))?temp:temp+2;
var sct=/0\,00/;
var scz=/#\,##/;
if(sct.test(formatString)){
ss=sct;
for(var i=0;i<len;i++){
s.push("0,00");
}
}else if(scz.test(formatString)){
ss=scz;
for(var i=0;i<len;i++){
s.push("#,##");
}
}
}
formatString=formatString.replace(ss,s.join(""));
//----------------------
var patterns = formatString.split(".");
var lpatterns = patterns[0].split("");
var lpatternsbak = patterns[0].split("");
var lkeep = "";
var rkeep = "";
//小数点后大于样式长度进行四舍五入
if (numbers[1]){
var rnumbers=numbers[1].split("");
var count=0;
if(patterns[1]){
var rpatterns = patterns[1].split("");
for(var i=0;i< rpatterns.length;i++){
if(rpatterns[i]=="#"|| rpatterns[i]=="0"){
count++;
}
}
}
if(rnumbers.length>count){
numbers = ( val.toFixed(count)+"").split(".");
}
}
var lnumbers = numbers[0].split("");
//得到左侧要替换的部分
var lplaces = [];
for(var i=0;i <lpatterns.length;i++){
var parternchar = lpatterns[i];
if (parternchar == "#" || parternchar == "0"){
lplaces.push(i);
}
}
//替换左侧,左侧有数字才要替换,以避免v = .99型的数字而产生错误
if (lnumbers[0] && lnumbers[0].length>0){
var numberIndex = lnumbers.length - 1;
var replaced = 0;
for(var i=lplaces.length - 1;i>=0;i--){
replaced ++; //被替换的字符数量
var place = lplaces[i];
lpatterns[place] = lnumbers[numberIndex];
if (numberIndex == 0) {
break;
}
numberIndex--;
}
//处理以#为第一个格式(#前可能有非0的其他串也在此范围)的格式串,对于以#开头的格式串,将不会截取数字串,要补齐
var lstartIdx = lplaces[0];
//补漏
var nlen=lnumbers.length;
var plen=lplaces.length;
if(nlen>plen)
lpatternsbak.splice(lstartIdx,0,"#");
if (lpatternsbak[lstartIdx]=="#"){
if (lnumbers.length > replaced){
var idx = lnumbers.length - replaced;
for(var i=0;i <idx;i++){
lkeep += lnumbers[i];
}
lpatterns[lstartIdx] = lkeep + lpatterns[lstartIdx];
}
}
}
//替换右侧
if (patterns[1] && patterns[1].length > 0){
var rpatterns = patterns[1].split("");
if (numbers[1] && numbers[1].length>0){
var rnumbers = numbers[1].split("");
//得到右侧将要替换的部分
var rplaces = [];
for(var i=0;i <rpatterns.length;i++){
var parternchar = rpatterns[i];
if (parternchar == "#" || parternchar == "0"){
rplaces.push(i);
}
}
var replaced = 0;
for(var i=0;i <rplaces.length;i++){
replaced ++; //被替换的字符数量
var place = rplaces[i];
rpatterns[place] = rnumbers[i];
if (i==rnumbers.length - 1){
break;
}
}
}
}
for(var i=0;i <lpatterns.length;i++){
if (lpatterns[i]=="#"){
lpatterns[i] = "";
}
}
var result = lpatterns.join("");
if (patterns[1]){
for(var i=0;i <rpatterns.length;i++){
if (rpatterns[i] == "#"){
rpatterns[i] = "";
}
}
result += "." + rpatterns.join("");
}
//替换掉起始,号
result = result.replace(/^\,+/g,"");
//替换掉起始结尾
result = result.replace(/\,+$/g,"");
return result;
}
</script>
<script type="text/javascript">
$(document).ready(function(){
$("#num").change(function(){
alert(format($(this).val(),"#,###.00"));
alert(format($(this).val(),"0,000.00"));
});
});
</script>
</head>
<body>
<input type="text" id="num"/>
<br />
<br />
alert(format("12345.67","#,###.00")); //输出:12,345.67<br />
alert(format("12345.67","0,000.00")); //输出:2,345.67(0匹配符,产生了截取)<br />
alert(format("12345.67","#.00")); //输出:12345.00<br />
alert(format("12345.67","¥#,###元0角0分")); //输出:¥12,345元6角7分<br />
alert(format(".67","#,###.00")); //输出:.67<br />
alert(format(".67","###,##0.00")); //输出:0.67<br />
alert(format("12345.67","FUCK CNN#想怎样输出就怎样,##输出#FUCK JAPANESE.0祖国万岁"));<br />
//输出:FUCK CNN12想怎样输出就怎样,34输出5FUCK JAPANESE.6祖国万岁 (:D,一般没这么离谱,在前后加特殊字符比较常用)<br />
alert(format("12345.67","钱不少啊¥###,##0.00元")); //输出:钱不少啊¥12,345.67元<br />
alert(format("075524826309","(#)########")); //输出:(0755)24826309<br />
alert(format("075524826309","(000)########")); //输出:(755)24826309 (取三位区号)
<div id="result">
</div>
</body>
</html>
javascript 数字格式化
最新推荐文章于 2024-07-03 15:45:53 发布