找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5350|回复: 52

[字符串] (XD::String:IsNum)判断一个字符串是否是纯数字

[复制链接]

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-8-2 21:34:55 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::String:IsNum
调用格式: (XD::String:IsNum str)
参数说明: 参数:
str --- 字符串
返回值: 表(字符串 匹配模式串)
否 NIL
函数简介: 判断一个字符串是否是纯数字(支持负数,小数)
函数来源: 原创
函数作者: Lispboy
适用版本: XDRX API 
最后更新时间: 2013-08-02
备注: 使用了正则表达式,返回的模式串可以供XD::String:RegExpR 替换时候用

命令: (xd::string:isnum "2.")
("2." "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")

命令: (xd::string:isnum ".2")
(".2" "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")

命令: (xd::string:isnum "+2")
("+2" "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")

命令: (xd::string:isnum "-2.")
("-2." "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")

命令: (xd::string:isnum "-")
nil

命令: (xd::string:isnum "+")
nil

命令: (xd::string:isnum "+1.")
("+1." "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")
演示图片: -

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 Lispboy 于 2013-8-3 22:28 编辑

  1. ;|
  2. 判断字符串是否是纯数字,支持负数
  3. 参数:
  4.    str --- 字符串
  5. 返回值:
  6.    表(字符串 匹配模式串)
  7.    否 NIL
  8. |;
  9. (defun XD::String:IsNum (str / ret)
  10.   (if (setq match "^[-|+]?([0-9]+\.[0-9]+)|[-|+]?([0-9]+\.)|[-|+]?(\.[0-9]+)|[-|+]?(\[0-9]+)$"
  11.             ret (XD::String:RegExpS match str "")
  12.       )
  13.     (list (car ret) match)
  14.   )
  15. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-4 16:48:58 | 显示全部楼层
本帖最后由 newer 于 2013-8-4 17:54 编辑
wowan1314 发表于 2013-8-4 15:10
你测试下"A0"
好像我原来写的就存在这个情况!!  

葛老,我看咱就设定个大多数人都习惯的

不带符号(CAD文字中基本没负数, -做连字符用吧)
有小数点前后都必须有数字,否则按字符处理,比如:A.  句号  A.1 连字符

的规则吧。


这样好像:(xd::string:regexps "^(\\d+)(\.\\d+)?$" "1.2" "")  就可以了。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

发表于 2013-8-3 07:28:05 来自手机 | 显示全部楼层
distof不能判断1
e6?来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-3 15:27:45 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-8-3 15:28 编辑

整复杂了
_$ (distof "1e99")
1.0e+099
_$ (distof "1e3")
1000.0
_$ (distof "1e3a")
nil
_$ (distof ".33")
0.33
_$ (distof "a.33")
nil
_$ (distof "1.33")
1.33
_$ (distof "-1.33")
-1.33
_$ (distof "-.33")
-0.33
_$ (distof "1e-1")
0.1
_$
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-3 15:49:31 | 显示全部楼层
命令: (XD::String:IsNum "-")
("-" "^[0-9.-]+$")

点评

葛老,试试新的写法,帮测试下 命令: (xd::string:isnum "-") nil 命令: (xd::string:isnum "2.01") ("2.01" "^-?([0-9]+.[0-9]+$)") 命令: (xd::string:isnum "-2.0") ("-2.0" "^-?([0-9]+.[0-9]+$  详情 回复 发表于 2013-8-3 16:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-8-3 16:58:46 | 显示全部楼层
wowan1314 发表于 2013-8-3 15:49
命令: (XD::String:IsNum "-")
("-" "^[0-9.-]+$")

葛老,试试新的写法,帮测试下

  1. (defun XD::String:IsNum (str / ret)
  2.   (if (setq ret (XD::String:RegExpS "^-?([0-9]+\.[0-9]+$)" str ""))
  3.     (list (car ret) "^-?([0-9]+\.[0-9]+$)")
  4.     (if (setq ret (XD::String:RegExpS "^-?[0-9]+$" str ""))
  5.       (list (car ret) "^-?[0-9]+$")
  6.     )
  7.   )
  8. )


命令: (xd::string:isnum "-")
nil

命令: (xd::string:isnum "2.01")
("2.01" "^-?([0-9]+.[0-9]+$)")

命令: (xd::string:isnum "-2.0")
("-2.0" "^-?([0-9]+.[0-9]+$)")

命令: (xd::string:isnum "-")
nil

命令: (xd::string:isnum "-2.")
nil


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-3 17:57:54 来自手机 | 显示全部楼层
-2.算数字啊来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-3 18:26:41 | 显示全部楼层
本帖最后由 wowan1314 于 2013-8-3 18:31 编辑

我觉的distof 来判断就不错啊。这个函数有什么不适用的情况吗?

.5应该得算是数字吧?
命令: (XD::String:IsNum ".5")
nil
命令: (XD::String:IsNum "+2")
nil

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-8-3 18:28:39 | 显示全部楼层
试试这个:
  1. ;;; (gxl-strIsNum str)        确定字符串是否为数字
  2. (defun gxl-strIsNum (str)
  3.   (numberp (VL-CATCH-ALL-APPLY
  4.        'read
  5.        (list (cond
  6.          ((= "." (substr str 1 1))
  7.           (strcat "0" str)
  8.          )
  9.          ((and
  10.       (= "-." (substr str 1 2))
  11.       (> (strlen str) 2)
  12.       )
  13.           (strcat "-0" (substr str 2))
  14.          )
  15.          ((and
  16.       (= "+." (substr str 1 2))
  17.       (> (strlen str) 2)
  18.       )
  19.           (strcat "+0" (substr str 2))
  20.          )
  21.          (t
  22.           str
  23.          )
  24.        )
  25.        )
  26.      )
  27.   )
  28. )

点评

命令: (gxl-strIsNum "12 A") T  详情 回复 发表于 2013-8-3 18:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-3 18:37:23 | 显示全部楼层

命令: (gxl-strIsNum "12 A")
T

点评

改了下,将空格例外掉:  详情 回复 发表于 2013-8-3 21:14

评分

参与人数 1D豆 +2 收起 理由
牢固 + 2 认真回复奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-8-3 21:14:52 | 显示全部楼层
wowan1314 发表于 2013-8-3 18:37
命令: (gxl-strIsNum "12 A")
T

改了下,将空格例外掉:
  1. (defun gxl-strIsNum (str)
  2.   (and (not (VL-STRING-SEARCH " " str))
  3.        (numberp  (VL-CATCH-ALL-APPLY
  4.       'read
  5.       (list  (cond
  6.         ((= "." (substr str 1 1))
  7.          (strcat "0" str)
  8.         )
  9.         ((and
  10.            (= "-." (substr str 1 2))
  11.            (> (strlen str) 2)
  12.          )
  13.          (strcat "-0" (substr str 2))
  14.         )
  15.         ((and
  16.            (= "+." (substr str 1 2))
  17.            (> (strlen str) 2)
  18.          )
  19.          (strcat "+0" (substr str 2))
  20.         )
  21.         (t
  22.          str
  23.         )
  24.       )
  25.       )
  26.     )
  27.        )
  28.   )
  29. )

点评

命令: (gxl-strIsNum "12\na") T  详情 回复 发表于 2013-8-3 21:28
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-3 21:28:21 | 显示全部楼层
牢固 发表于 2013-8-3 21:14
改了下,将空格例外掉:

命令: (gxl-strIsNum "12\na")
T

点评

修改了匹配串,看下一楼的帖子,看看还有没考虑到的情况没? 命令: (xd::string:isnum "2.") ("2." "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$") 命令: (xd::string:isnum ".2")  详情 回复 发表于 2013-8-3 22:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-8-3 22:29:16 | 显示全部楼层
wowan1314 发表于 2013-8-3 21:28
命令: (gxl-strIsNum "12\na")
T

修改了匹配串,看下一楼的函数,看看还有没考虑到的情况没?
命令: (xd::string:isnum "2.")
("2." "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")

命令: (xd::string:isnum ".2")
(".2" "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")

命令: (xd::string:isnum "+2")
("+2" "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")

命令: (xd::string:isnum "-2.")
("-2." "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")

命令: (xd::string:isnum "-")
nil

命令: (xd::string:isnum "+")
nil

命令: (xd::string:isnum "+1.")
("+1." "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")


点评

试试我写的?!  详情 回复 发表于 2013-8-3 22:59
命令: (t4 ".2.") (".2" "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$") 楼主为何不采用distof函数呢??  详情 回复 发表于 2013-8-3 22:45
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-3 22:45:16 | 显示全部楼层
Lispboy 发表于 2013-8-3 22:29
修改了匹配串,看下一楼的函数,看看还有没考虑到的情况没?
命令: (xd::string:isnum "2.")
("2." "^[- ...

命令: (t4 ".2.")
(".2" "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")

楼主为何不采用distof函数呢??  

点评

这个是个基础,用哪个其实达到目的就行,主要是用这个匹配串去做别的,比如组合文字的替换什么的,正则的替换是强大的。distof只是一个判断。  详情 回复 发表于 2013-8-3 23:11
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-3 22:59:56 | 显示全部楼层
Lispboy 发表于 2013-8-3 22:29
修改了匹配串,看下一楼的函数,看看还有没考虑到的情况没?
命令: (xd::string:isnum "2.")
("2." "^[- ...

试试我写的?!
  1. (defun t4 (str / ret match ret1 match1)
  2.     (if
  3.         (and
  4.             (setq match "^[+|-]?[0-9]*(\.)?[0-9]*$"
  5.                 ret (xd::string:regexps match str "")
  6.             )
  7.             (setq match1 "[0-9]"
  8.                 ret1 (xd::string:regexps match1 str "")
  9.             )
  10.         )
  11.         t nil
  12.     )
  13. )

点评

很好,准备用你这个了。 另外: (setq match1 "[0-9]" ret1 (xd::string:regexps match1 str "") ) 这个是考虑的什么情况?  详情 回复 发表于 2013-8-3 23:22
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-8-3 23:11:58 | 显示全部楼层
wowan1314 发表于 2013-8-3 22:45
命令: (t4 ".2.")
(".2" "^[-|+]?([0-9]+.[0-9]+)|[-|+]?([0-9]+.)|[-|+]?(.[0-9]+)|[-|+]?([0-9]+)$")
...

这个是个基础,用哪个其实达到目的就行,主要是用这个匹配串去做别的,比如组合文字的替换什么的,正则的替换是强大的。distof只是一个判断。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 00:33 , Processed in 0.529003 second(s), 76 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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