TC官方合作论坛

 找回密码
 立即注册
查看: 2176|回复: 8

[功能] 判断某段字符串是否为数字的函数源码

[复制链接]
发表于 2014-2-19 01:37:52 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 贪吃蛇 于 2014-2-19 01:39 编辑

学习了Rainshine的函数isnum(&text,space=true,mode=1),自己也写了个,欢迎大大们指点。
  1. function isnum(&text,mode=-1)
  2.     //功能:判断某段字符串是否为数字,返回真-1或假0.
  3.     //参数:&text,字符串,可返回处理后的数值;mode,整型,具体含义如下:
  4.     //mode=-1:text不作处理;
  5.     //mode=0:text含有"空格、回车、换行、+、-、."之外的字符时返回原值,否则返回删除所有字符后的连起来的数(全数字).
  6.     //mode=1:text含有"空格、回车、换行、+、-、."之外的字符时返回原值,否则text允许保留第一个小数点的数字.
  7.     //mode=2:text含有"空格、回车、换行、+、-、."之外的字符时返回原值,否则text允许保留首位正负号及第一个小数点的数字.
  8.     //mode=3:text含有"空格、回车、换行、+、-、."之外的字符时返回原值,否则text="空格、回车、换行"之前的数,且只包含数字.
  9.     //mode=4:text含有"空格、回车、换行、+、-、."之外的字符时返回原值,否则temp="空格、回车、换行"之前的数,且数字之外只允许第1个出现的小数点.
  10.     //mode=5:text含有"空格、回车、换行、+、-、."之外的字符时返回原值,否则temp="空格、回车、换行"之前的数,且数字之外只允许第1个出现的小数点和首位正负号.
  11.     //示例:text="-1.2.+3 4 5",isnum(text)的返回值为0(该例返回值都为0),text不变; isnum(text,0)时text="12345";isnum(text,1)时text=1.2345;
  12.     //isnum(text,2)时text=-1.2345;isnum(text,3)时text=123;isnum(text,4)时text=1.23;isnum(text,5)时text=-1.23;
  13.     textTmp=text,temp=""
  14.     textTmp=str.strtrim(textTmp,"\r\n")
  15.     length=str.strleng(textTmp)
  16.     ascii=0,dot=0,n=0
  17.     for(i=0;i<length;i++)
  18.         ascii=str.strgetat(textTmp,i)
  19.         if(ascii>47&&ascii<58)
  20.             temp=str.strcat(temp,str.format("%c",ascii))
  21.             continue
  22.         endif         
  23.         if(ascii!=10 && ascii!=13 && ascii!=32 && ascii!=43 && ascii!=45 && ascii!=46)//10换行 13回车 32空格 43+ 45- 46.
  24.             return false
  25.         endif
  26.         n++
  27.         select(mode)
  28.             case -1://temp为原值
  29.             return false
  30.             case 0://temp全是数字
  31.             case 1://temp允许第1个出现的小数点
  32.             if(ascii==46 && dot==0)
  33.                 temp=str.strcat(temp,str.format("%c",ascii))
  34.                 dot=1
  35.             endif
  36.             case 2://temp允许正负号和第1个出现的小数点
  37.             if(ascii==46 && dot==0)
  38.                 temp=str.strcat(temp,str.format("%c",ascii))
  39.                 dot=1
  40.             endif
  41.             if(ascii==43&&i==0 || ascii==45&&i==0)
  42.                 temp=str.strcat(temp,str.format("%c",ascii))
  43.             endif
  44.             case 3://temp="空格、回车、换行"之前的数,且只包含数字
  45.             if(ascii==10 || ascii==13 || ascii==32)
  46.                 break
  47.             endif
  48.             case 4://temp="空格、回车、换行"之前的数,且数字之外只允许第1个出现的小数点
  49.             if(ascii==46 && dot==0)
  50.                 temp=str.strcat(temp,str.format("%c",ascii))
  51.                 dot=1
  52.             endif
  53.             if(ascii==10 || ascii==13 || ascii==32)
  54.                 break
  55.             endif
  56.             case 5://temp="空格、回车、换行"之前的数,且数字之外只允许第1个出现的小数点和正负号
  57.             if(ascii==46 && dot==0)
  58.                 temp=str.strcat(temp,str.format("%c",ascii))
  59.                 dot=1
  60.             endif
  61.             if(ascii==43&&i==0 || ascii==45&&i==0)
  62.                 temp=str.strcat(temp,str.format("%c",ascii))
  63.             endif
  64.             if(ascii==10 || ascii==13 || ascii==32)
  65.                 break
  66.             endif
  67.             default:
  68.             traceprint("isnum函数错误:参数2mode超出允许范围.")
  69.         endselect
  70.     endfor
  71.     if(mode>-1)
  72.         text=temp
  73.     endif
  74.     if(n>0)
  75.         return false
  76.     else
  77.         return true
  78.     endif
  79. endfunction
复制代码




评分

参与人数 2威望 +10 金币 +5 收起 理由
菜鸟狙丶 + 5 '
kevinqq + 5 + 5 继续加油

查看全部评分

回复

使用道具 举报

发表于 2014-2-19 12:23:26 | 显示全部楼层
这个功能的作用是什么?
若是 判断某段字符串是否为数字,
判断一次是否为整型 ,再判断一次是否为浮点型不是更快?
若是为了 去除非数字 正则替换 不是更好?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 15:32:47 | 显示全部楼层
小西 发表于 2014-2-19 12:23
这个功能的作用是什么?
若是 判断某段字符串是否为数字,
判断一次是否为整型 ,再判断一次是否为浮点型不是 ...

自己最近在做一些数学运算的函数,需要判断用户的输入是否非法,如果用户输入的是整型或浮点型还好办,但输入的要是字符表示的数字就要判断是否全为数字,或者带正负号和小数点的数字……
正则替换处理这个事情是不是更简洁、更快?得好好学学了。
回复 支持 反对

使用道具 举报

发表于 2014-2-19 20:54:20 | 显示全部楼层
贪吃蛇 发表于 2014-2-19 15:32
自己最近在做一些数学运算的函数,需要判断用户的输入是否非法,如果用户输入的是整型或浮点型还好办,但 ...

字符表示的数字,不知所云

整型与浮点型包括有负数
浮点型是带小数点的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 21:43:17 | 显示全部楼层
小西 发表于 2014-2-19 20:54
字符表示的数字,不知所云

整型与浮点型包括有负数

123是数字,“123”就是字符表示的数字。
我现在在传参时都尽可能用字符型,防止出现.123这种小数点开头的数传参变成null。
这个函数已经用正则表达式匹配函数重写了,简洁不少。
回复 支持 反对

使用道具 举报

发表于 2014-2-19 22:18:24 | 显示全部楼层
贪吃蛇 发表于 2014-2-19 21:43
123是数字,“123”就是字符表示的数字。
我现在在传参时都尽可能用字符型,防止出现.123这种小数点开头 ...

a=123  类型.是否为整型(a)   返回为 真
b="123"   类型.是否为整型(b)   返回亦为 真  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 23:00:46 | 显示全部楼层
小西 发表于 2014-2-19 22:18
a=123  类型.是否为整型(a)   返回为 真
b="123"   类型.是否为整型(b)   返回亦为 真   ...

是 .123 ,有小数点的。如下例参数变空值:
  1. var a=.123
  2. traceprint(测试.小数参数(a))
  3. function 小数参数(纯小数)
  4.     var x=""
  5.     x="纯小数="&纯小数
  6.     return x   
  7. endfunction
复制代码

运行得到的结果是:
输出>>“纯小数=”                  行号:…………
回复 支持 反对

使用道具 举报

发表于 2014-2-20 12:01:49 | 显示全部楼层
贪吃蛇 发表于 2014-2-19 23:00
是 .123 ,有小数点的。如下例参数变空值:

运行得到的结果是:

如果是手工数据寻入的情况下,正常应该是没有人会写  .123 就以 是否整型与浮点型判断,不符合判错.
如果是程序内部计算的话,如 a=1/3 的变量形式,程序能自动识别.不需要处理.
如果是以反馈到界面或配置文件,然后再录入的话,不如在输出的时候做处理.
将 .123 处理为 0.123
一是看起来也整洁易懂美观,
二是处理过程也简单,六七行代码.远比这六七十行来得方便.
所以,真没觉得这么长一大串代码有什么实际作用.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-21 10:43:15 | 显示全部楼层
小西 发表于 2014-2-20 12:01
如果是手工数据寻入的情况下,正常应该是没有人会写  .123 就以 是否整型与浮点型判断,不符合判错.
如果是 ...

是的,我已经将1楼那繁长的代码改用正则表达式处理,几条语句就解决了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-3 23:41 , Processed in 0.052122 second(s), 25 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表