标题:判断一个字符串是否纯数字,有无更优雅的算法?
只看楼主
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
VFP的字符串功能虽不弱,但也有限,实际应用还有不少考究。
2022-09-27 21:26
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册: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: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
向各位大侠学习!
2022-09-28 06:26
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分: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: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
以下是引用csyx在2022-9-27 23:40:46的发言:
这一类的事情应该交给正则表达式去干,何必重新发明轮子。更重要的是,几乎所有语言都支持正则,以后不管你换啥语言都终身受用。


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

Function isAllDigit()本身没有对错,有的只是算法上的巧与拙、妙与凡的小小差别而已。
或者这么说吧——两个字:
好玩!
2022-09-28 09:57
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册: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: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
人才
2022-09-28 16:26
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
学习,谢谢!
2022-09-29 06:30
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册: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: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:0 
各位都是算法高手,佩服!
2022-09-29 08:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510150-1-1.html




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

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