| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2191 人关注过本帖, 1 人收藏
标题:判断一个字符串是否纯数字,有无更优雅的算法?
取消只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
结帖率:100%
收藏(1)
 问题点数:0 回复次数:7 
判断一个字符串是否纯数字,有无更优雅的算法?
遇一个函数,需将传入的字符串参数逐字拆解,判断是否纯十进制数字。
比方说:
"1021"、"238A"、"1314X520"……
最粗鲁的算法,无非For...Endfor循环,逐字判断是否数字。

人活世上,可不能要求那么低!——不能光吃饱了完事,还应有所追求吧。
除了眼前的苟且,我感觉吧,还应远眺一眼远方。
你说是吧?
那么,有没有更优雅一点点、让人眼前一亮、会心一笑的算法?
想了一个,自我感觉挺讨巧的,只可惜无法处理"0023"、"001"这种带前导“0”的情况:
*----------------------------------
* 拆解一个字符串参数,逐字判断是否纯十进制数字?
*----------------------------------
function isAllDigit
lpara lcString
if empty(lcString)
    return .F.
endif
lnLen = len(lcString)-1
lnDigit = val(lcString)
if lnDigit > 10 ^ lnLen
    return .T.
else
    return .F.
endif
*----------------------------------

敢问诸侠,砖我是抛出来了,有无玉可捡?
搜索更多相关主题的帖子: 判断 数字 是否 字符串 算法 
2022-09-27 09:28
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
以下是引用厨师王德榜在2022-9-27 10:15:17的发言:
"全数字"要允许字串中含有 "- + . " 符号.
同时, "+ -" 必须在最左,且不能同时出现 ,
      "." 可以在 最左/最右/中间,但是,必须只能出现一次.
总之,我对字串是不是全数字的判断标准,就是:用val()转换后,数值不失真.


厨版确实是一只老谋深算的狐狸仙,事情考虑得周全,无一遗漏,小可真心佩服得紧哪!
哦,对了,厨版的鞋面有一点点尘,请让我给您擦一擦,好不好?


是这样的,这函数用途较特殊,判断是否纯数字,仅仅是用于给文件夹或文件命名——
不会有“+ - .”等情况,特别是文件名当中绝不允许出现“.”,扩展名才有“.”。
故而可算是“阉割版”的纯数字判断:只需匹配0--9。只需要找公公,不需要找小鸡鸡。
不过前导“0”的情况,则避无可避,必须精准处理。
2022-09-27 10:34
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
当然,这问题纯属“中学生Basic语言竞赛题”那样无聊的“脑筋急转弯”,无非是希望设计一个偏门古怪算法:

不用循环,判断0--9纯数字

若用循环,那就不好玩啦。
呵呵。

我老人家琢磨了一下,将顶楼代码稍事改造一下,应能办到!
优雅、轻盈;
风流倜傥,玉树临风;
面如冠玉,貌胜潘安。

2022-09-27 10:55
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 

开古:

*----------------------------------
* 拆解一个字符串参数,逐字判断是否纯十进制数字?
* Ver 0.2
*----------------------------------
function isAllDigit
lpara lcString
if empty(lcString)
    return .F.
endif
if val("1"+lcString) >= 10 ^ len(lcString)
    return .T.
else
    return .F.
endif
*----------------------------------
2022-09-27 11:18
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
以下是引用laowan001在2022-9-27 13:52:26的发言:

此题吹版之前给过精简方法
if empty(CHRTRAN(lcString,'1234567890',''))
    messagebox(lcString+'是纯数字串')
endif


这一个函数可太妙啦!
而且不需考虑数值溢出。
我写的函数,其实有个整型值溢出的问题,须加个on error。
2022-09-27 14:23
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2022-9-27 17:15:07的发言:

FUNCTION isAllDigit(lcString)
    RETURN ALINES(arr,lcString,5,"0","1","2","3","4","5","6","7","8","9")==0
ENDFUNC


这一个函数也非常巧妙!

不过,用空数组来搞,有些晦涩,乍一看,有些晕
另,不排除空字符串参数,这可能是个小漏洞。

? isAllDigit("")
2022-09-27 17:44
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
以下是引用csyx在2022-9-27 23:40:46的发言:
这一类的事情应该交给正则表达式去干,何必重新发明轮子。更重要的是,几乎所有语言都支持正则,以后不管你换啥语言都终身受用。


确实,在现代编程语言的世界里,正则是字符串检索的全宇宙标准,没有之一。
唯,楼主的需求本身就很小,最直观的解决方案,一个VFP循环即可搞定。
一来“贪玩”,二来考虑到执行效率,用VFP原生代码执行效率自然比较高。
诚如吹版所言:VFP的字符串处理并不弱,甚至强过了许多流行语言。
若非要用正则object来处理,颇有点儿“大炮打蚊子”意味。
呵呵。

Function isAllDigit()本身没有对错,有的只是算法上的巧与拙、妙与凡的小小差别而已。
或者这么说吧——两个字:
好玩!
2022-09-28 09:57
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:330
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2022-9-28 08:04:13的发言:
来个C货
DECLARE long strlen IN msvcrt string
DECLARE long sscanf IN msvcrt string,string,string@


学到了,感谢!原来在msvcrt有宝藏啊,哈哈,看来要好好学习一下msvcrt.dll等库的参考手册。
2022-09-28 09:59
快速回复:判断一个字符串是否纯数字,有无更优雅的算法?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018293 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved