似乎小数点后面不要格式化吧,还有就是如果能自定义格式化的格式就好了,如VB里的FORMAT

解决方案 »

  1.   

    hbhbhbhbhb1021 (天外水火(我要多努力))
    ---
    斑竹牛人呀
      

  2.   

    to ttyp(@http://www.cnblogs.com/ttyp/)
         有道理,我改动了下,但是现在还是不是太好,因为不能满足设置"###,##"这种格式,我想 可以设置一个数组堆栈,来实现这个,从最后开始匹配,匹配到了就进栈,晚上我整理下。
    to DeluxWorld(曾经的你) 谢谢to sanshisong(三师兄) 我争取以后成为牛人to youbl(wolf) 是,接受,加了些注释
    <script language=javascript>
    /*
    数字格式化函数
    总体思路,首先把数字分成整数和小数两部分,
    把整数部分逆序之后在通过计数器添加分割字符
    小数部分少了逆序部分
    */
    String.prototype.HBformatNumber=function(FormatPartternNum,FormatParttern)
    {
    function formatNUM(num)
    {
    jishuNum=-1;//初始化一个计数器
    NumArray=num.split("\.")
    str1=NumArray[0].split("").reverse().join("").replace(/\d/g,function($1){jishuNum++;return((jishuNum%FormatPartternNum==0)&&(jishuNum!=0))?FormatParttern+$1:$1}).split("").reverse().join("")
    jishuNum=-1;//重新初始化计数器用于小数部分
    return (NumArray.length==1)?str1:(str1+"."+(NumArray[1].replace(/\d/g,function($1){jishuNum++;return((jishuNum%FormatPartternNum==0)&&(jishuNum!=0))?FormatParttern+$1:$1})))
    }
    return (/^(([1-9]\d*)|(0))(\.\d*)?$/.test(this))?formatNUM(this):"不是数字格式"//判断格式是否符合数字
    }
    var a="12324536789.1243211";//在这里修改要格式化的字符串
    alert(a.HBformatNumber(4,"-"))//参数1为输入几个数字一隔,参数2为中间间隔的符号
    </script>
      

  3.   

    谢谢大家给我的建议
    我改了下,现在支持自定义数字格式化了,大家继续提啊<script language=javascript>
    /*
    参数1:以#表示数字,可加入小数点,格式化后的样式
    参数2:每组格式之间的连接符
    */
    String.prototype.HBformatNumber=function(FormatParttern,ConnectOption)
    {
    if(!/#/.test(FormatParttern))//判断格式是不是可以进行格式化
    {
    return "格式错误";
    }
    var FormatPartternArray=FormatParttern.split("\.");//分开小数部分和整数部分的格式
    function splitNUM(num)//此函数进行分开数字
    {
    NumArray=num.split("\.")
    if(NumArray.length==1)
    {
    return formatNUM(NumArray[0],FormatPartternArray[0],true)
    }
    else
    {
    if(FormatPartternArray.length==1)
    {
    return formatNUM(NumArray[0],FormatPartternArray[0],true)+"."+NumArray[1]
    }
    else
    {
    return formatNUM(NumArray[0],FormatPartternArray[0],true)+"."+formatNUM(NumArray[1],FormatPartternArray[1],false)
    }
    }
    }


    return (/^(([1-9]\d*)|(0))(\.\d*)?$/.test(this))?splitNUM(this):"不是数字格式"//判断格式是否符合数字

    /*
    格式化数字函数
    参数1:待格式化的数字
    参数2:格式化样式
    参数3:是否为整数格式化,true为整数格式化,false为小数
    */
    function formatNUM(num,Formatparttern,ifInterger)
    {
    var IntergerPushArray=new Array();//定义一个数组栈来存放整数
    var IntergerFormatPartternNum=Formatparttern.match(/\#/g).length //得到一组格式化样式中包含多少个数字/
    var IntegerParttern=(ifInterger)?(new RegExp(Formatparttern.replace(/[^#]/g,"").replace(/#/g,"\\d")+"$")):new RegExp("^"+Formatparttern.replace(/[^#]/g,"").replace(/#/g,"\\d"))//创建正则为了把每组数字取出来
    while(IntegerParttern.test(num))
    {
    IntergerPushArray.push(num.match(IntegerParttern))//把每一组放到数组中
    num=num.replace(IntegerParttern,"");//去掉这组,去拿下一组
    }
    if(num!="")
    {
    var RemainNum=num.match(/\d/g).length//剩下不够一组数字的时候判断还有几个数字
    var deleteNum=IntergerFormatPartternNum-RemainNum//一会需要去掉的数字个数
    for(var i=0;i<IntergerFormatPartternNum;i++)//把最后一组不够的位数加0填充
    {
    num=(ifInterger)?("0"+num):(num+"0")
    }
    num=(ifInterger)?num.substr((num.length-parseInt(IntergerFormatPartternNum))):num.substr(0,IntergerFormatPartternNum)//得到最后一个格式化后的函数
    IntergerPushArray.push(num);//将最后一组进栈
    }
    var StrArrayParttern=""
    for(var i=0;i<IntergerFormatPartternNum;i++)
    {
    StrArrayParttern=StrArrayParttern+"(\\d)"
    }
    var ArrayParttern=new RegExp(StrArrayParttern)//再次创建正则以备替换
    var j=0;
    var ArrayReplace=Formatparttern.replace(/#/g,function(){j++;return "$"+j})//创建正则替换时的第二个参数
    for(var i=0;i<IntergerPushArray.length;i++)
    {
    IntergerPushArray[i]=IntergerPushArray[i].toString().replace(ArrayParttern,ArrayReplace)//替换
    }
    var k=0;
    if(ifInterger)//如果整数返回数组逆序,并且通过连接字符连接每组数据,去掉多余的0;否则返回格式化后的小数部分
    {
    return (IntergerPushArray.reverse().join(ConnectOption).replace(/(.)/g,function($1){if(/\d/.test($1)){k++;}return((k<=parseInt(deleteNum))?"":$1)}))
    }
    else
    {
    return(IntergerPushArray.join(ConnectOption))
    }
    }
    }
    var a="12324536789.1243211";//在这里修改要格式化的字符串
    var b="20050908"
    var c="20050908091500"
    alert(a.HBformatNumber("###.###",","))//可以按各种需要进行格式化,比如格式化3位一组
    alert(a.HBformatNumber("###",","))//只格式化整数部分,3位一组
    alert(b.HBformatNumber("####-##-##",""))//时间字符串也支持,可以把input的maxlength属性设为相应格式的最大长度,这样就不会出现两组了,不过没有判断是否为时间对象
    alert(c.HBformatNumber("####-##-## ##:##:##",""))//加时分秒也可以
    alert(a.HBformatNumber("###,##.#-##"," "))//大部分特殊格式也支持
    </script>
      

  4.   

    1、既然作为String对象的方法定义,那么就应该支持任意字符串,而不是只针对数字字符串
    a = 20050908091500.HBformatNumber("####-##-## ##:##:##","");2、处理方法过于复杂,代码几乎让人看不清3、其实不用想的太复杂。
    既然使用#做为占位标志,那么只需在处理时补齐格式串较数字串不足的长度
    比如
    格式串 ###,###
    数字串 12345678
    则调整格式串为 ##,###,###
    然后将转换成字符串的数字串按字节逐次替换进去就可以了
    f = '##,###,###';
    n = '12345678';
    for(i=0; i<n.length; i++)
      f = f.replace(/#/, n.substr(i, 1));
      

  5.   

    同理
    f = "####-##-## ##:##:##";
    n = "20050908091500";
    for(i=0; i<n.length; i++)
      f = f.replace(/#/, n.substr(i, 1));得 2005-09-08 09:15:00一点建议,仅供参考
      

  6.   

    的确是上面的代码好一点,我的代码替换的正则和替换后的字符串格式都是动态生成的,显然效率应该比上面的要差,我把代码又改了下,在加上被格式的字符串长于要格式的格式时的一些代码。现在可以格式化字符串了
    <script language=javascript>
    /*
    参数1:以#表示数字或字符,可加入一个小数点,两个小数点就会出错,格式化后的样式
    参数2:每组格式之间的连接符
    */
    String.prototype.HBformatNumber=function(FormatParttern,ConnectOption)
    {
    if(!/#/.test(FormatParttern))//判断格式是不是可以进行格式化
    {
    return "格式错误";
    }
    var FormatPartternArray=FormatParttern.split("\.");//分开小数部分和整数部分的格式
    return splitNUM(this)
    function splitNUM(num)//此函数进行分开数字
    {
    NumArray=num.split("\.")
    if(NumArray.length==1)
    {
    return formatNUM(NumArray[0],FormatPartternArray[0],true)
    }
    else
    {
    if(FormatPartternArray.length==1)
    {
    return formatNUM(NumArray[0],FormatPartternArray[0],true)+"."+NumArray[1]
    }
    else
    {
    return formatNUM(NumArray[0],FormatPartternArray[0],true)+"."+formatNUM(NumArray[1],FormatPartternArray[1],false)
    }
    }
    }
    /*
    格式化字符串函数
    参数1:待格式化的字符串
    参数2:格式化样式
    参数3:是否为整数格式化,true为整数格式化,false为小数,字符串也为true
    */
    function formatNUM(num,Formatparttern,ifInterger)
    {
    var IntergerPushArray=new Array();//定义一个数组栈来存放整数
    var IntergerFormatPartternNum=Formatparttern.match(/\#/g).length//得到一组格式化样式中包含多少个数字/
    var IntegerParttern=(ifInterger)?(new RegExp(Formatparttern.replace(/[^#]/g,"").replace(/#/g,".")+"$")):new RegExp("^"+Formatparttern.replace(/[^#]/g,"").replace(/#/g,"."))//创建正则为了把每组数字取出来
    while(IntegerParttern.test(num))
    {
    IntergerPushArray.push(num.match(IntegerParttern))//把每一组放到数组中
    num=num.replace(IntegerParttern,"");//去掉这组,去拿下一组
    }
    if(num!="")
    {
    var RemainNum=num.length//剩下不够一组数字的时候判断还有几个数字
    var deleteNum=IntergerFormatPartternNum-RemainNum//一会需要去掉的数字个数
    for(var i=0;i<IntergerFormatPartternNum;i++)//把最后一组不够的位数加0填充
    {
    num=(ifInterger)?("0"+num):(num+"0")
    }
    num=(ifInterger)?num.substr((num.length-parseInt(IntergerFormatPartternNum))):num.substr(0,IntergerFormatPartternNum)//得到最后一个格式化后的函数
    IntergerPushArray.push(num);//将最后一组进栈
    }
    for(var i=0;i<IntergerPushArray.length;i++)
    {
    var j=-1;
    var str=IntergerPushArray[i].toString();
    IntergerPushArray[i]=Formatparttern.replace(/(#)/g,function($1){j++;return str.substr(j,1)})//替换
    }
    if(ifInterger)//如果整数返回数组逆序,并且通过连接字符连接每组数据,去掉多余的0;否则返回格式化后的小数部分
    {
    return (IntergerPushArray.reverse().join(ConnectOption).substr(parseInt(deleteNum)))
    }
    else
    {
    return(IntergerPushArray.join(ConnectOption))
    }
    }
    }
    var a="12324536789.1243211";//在这里修改要格式化的字符串
    var b="20050908"
    var c="20050908091500"
    var d="abcssfasdfsdfsdf"
    alert(a.HBformatNumber("###.###",","))//可以按各种需要进行格式化,比如格式化3位一组
    alert(a.HBformatNumber("###",","))//只格式化整数部分,3位一组
    alert(b.HBformatNumber("####-##-##",""))//时间字符串也支持,可以把input的maxlength属性设为相应格式的最大长度,这样就不会出现两组了,不过没有判断是否为时间对象
    alert(c.HBformatNumber("####-##-## ##:##:##",""))//可以加时分秒
    alert(a.HBformatNumber("###,##.#-##"," "))//支持大部分特殊格式
    alert(d.HBformatNumber("###",","))//支持大部分字符串
    </script>