{︶HB︶}一段数字格式化代码,顺便一些... ...

hbhbhbhbhb1021 2006-04-24 02:57:41
先发下感慨吧!
感觉自己技术差距很大,哎!
最近在研究数据机构的一些东东,大家多指点!
现在我正处于技术学习初级阶段,并且要长期保持下去,坚持一百年不动摇啊。
这段时间又上来那种浮躁的感觉了,发个帖子激励下自己。


下面写了一段数字格式化的代码,大家看看,是不是还可以在优化下。
<script language=javascript>
String.prototype.HBformatNumber=function()
{
function formatNUM(num)
{
jishuNum=-1;
NumArray=num.split("\.")
str1=NumArray[0].split("").reverse().join("").replace(/\d/g,function($1){jishuNum++;return((jishuNum%3==0)&&(jishuNum!=0))?","+$1:$1}).split("").reverse().join("")
jishuNum=-1;
return (NumArray.length==1)?str1:(str1+"."+(NumArray[1].replace(/\d/g,function($1){jishuNum++;return((jishuNum%3==0)&&(jishuNum!=0))?","+$1:$1})))
}
return (/^(([1-9]\d*)|(0))(\.\d*)?$/.test(this))?formatNUM(this):"不是数字格式"
}
var a="12324536789.1243211";//在这里修改要格式化的字符串
alert(a.HBformatNumber())
</script>
...全文
521 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
donggua12345678 2006-08-29
  • 打赏
  • 举报
回复
我UP
zhuangyan2004 2006-04-26
  • 打赏
  • 举报
回复
ice_berg16 2006-04-25
  • 打赏
  • 举报
回复
支持!
hbhbhbhbhb1021 2006-04-25
  • 打赏
  • 举报
回复
的确是上面的代码好一点,我的代码替换的正则和替换后的字符串格式都是动态生成的,显然效率应该比上面的要差,我把代码又改了下,在加上被格式的字符串长于要格式的格式时的一些代码。现在可以格式化字符串了
<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>
xuzuning 2006-04-25
  • 打赏
  • 举报
回复
同理
f = "####-##-## ##:##:##";
n = "20050908091500";
for(i=0; i<n.length; i++)
f = f.replace(/#/, n.substr(i, 1));

得 2005-09-08 09:15:00

一点建议,仅供参考
xuzuning 2006-04-25
  • 打赏
  • 举报
回复
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));

yiyioo 2006-04-25
  • 打赏
  • 举报
回复
又看到散分散代码了~
好~`
Candy38 2006-04-25
  • 打赏
  • 举报
回复
学习~~~
hbhbhbhbhb1021 2006-04-24
  • 打赏
  • 举报
回复
谢谢大家给我的建议
我改了下,现在支持自定义数字格式化了,大家继续提啊

<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>
是是非非 2006-04-24
  • 打赏
  • 举报
回复
参观~~~~~
hbhbhbhbhb1021 2006-04-24
  • 打赏
  • 举报
回复
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>
mingxuan3000 2006-04-24
  • 打赏
  • 举报
回复
没注释的代码 看着就头痛
游北亮 2006-04-24
  • 打赏
  • 举报
回复
最直接的缺点:可读性太差.
sanshisong 2006-04-24
  • 打赏
  • 举报
回复
hbhbhbhbhb1021 (天外水火(我要多努力))
---
斑竹牛人呀
DeluxWorld 2006-04-24
  • 打赏
  • 举报
回复
斑竹的精神可嘉~
ttyp 2006-04-24
  • 打赏
  • 举报
回复
似乎小数点后面不要格式化吧,还有就是如果能自定义格式化的格式就好了,如VB里的FORMAT
clare2003 2006-04-24
  • 打赏
  • 举报
回复
收藏
iasky 2006-04-24
  • 打赏
  • 举报
回复
mark

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧