| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2167 人关注过本帖, 1 人收藏
标题:判断一个字符串是否纯数字,有无更优雅的算法?
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
VFP的字符串功能虽不弱,但也有限,实际应用还有不少考究。
2022-09-27 21:26
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:703
专家分:2780
注 册:2018-3-13
收藏
得分:0 
这一类的事情应该交给正则表达式去干,何必重新发明轮子。更重要的是,几乎所有语言都支持正则,以后不管你换啥语言都终身受用。

例如,达到你的需求:
程序代码:
oo = NewObject('vbscript.regexp')
oo.Pattern = '^\d+$'
? oo.test('1234')
? oo.test('a1234')

要实现二楼的带符号带小数判断,改下 pattern 就行
oo.Pattern = '^(\-?|\+?)(\d+)(\.?\d+)$'

要把 .1234 也算作合法,就这样
oo.Pattern = '^((\-?|\+?)(\d+)(\.?\d+)|(\.?\d+))$'

如果还要包含指数形式 1e234,也都可以通过只改匹配模板就轻易做到


[此贴子已经被作者于2022-9-28 03:16编辑过]


这家伙很懒,啥也没留下
2022-09-27 23:40
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1712
专家分:3318
注 册:2012-2-29
收藏
得分:0 
向各位大侠学习!
2022-09-28 06:26
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏(1)
得分:0 
来个C货
程序代码:
DECLARE long strlen IN msvcrt string
DECLARE long sscanf IN msvcrt string,string,string@

? isAllDigit("1021","%[0-9]")
? isAllDigit("238A","%[0-9]")
? isAllDigit("1314X520","%[0-9]")
? isAllDigit("-123.456","%[0-9.-]")
? isAllDigit("-12.34+45.67","%[0-9.-+]")

FUNCTION isAllDigit(lcString,lcFmt)
    len = strlen(lcString)
    IF len==0
        RETURN .f.
    ENDIF
    buf = REPLICATE(0h00,len+1)
    sscanf(lcString,lcFmt,@buf)
    RETURN strlen(buf)==len
ENDFUNC
2022-09-28 08:04
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:350
专家分: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
帖 子:350
专家分: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
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:786
专家分:1160
注 册:2021-10-13
收藏
得分:0 
人才
2022-09-28 16:26
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1712
专家分:3318
注 册:2012-2-29
收藏
得分:0 
学习,谢谢!
2022-09-29 06:30
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
以下是引用cssnet在2022-9-28 09:59:45的发言:



学到了,感谢!原来在msvcrt有宝藏啊,哈哈,看来要好好学习一下msvcrt.dll等库的参考手册。

微软的C函数库,会C函数编程就会用。
VFP也自带v7.1版的msvcr71.dll,VFP带来的应该要会用。
2022-09-29 07:29
easyppt
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:295
专家分:649
注 册:2021-11-24
收藏
得分:0 
各位都是算法高手,佩服!
2022-09-29 08:30
快速回复:判断一个字符串是否纯数字,有无更优雅的算法?
数据加载中...
 
   



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

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