找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1696|回复: 14

[字符串] (XD::String:ModF) 将数字字符串分解为整数部分和小数部分

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-24 21:25:48 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::String:ModF
调用格式: (XD::String:ModF str)
参数说明: str -- 数字字符串
约定: 如果带小数点,前面必须有数,后面可无
返回值:
函数简介: 将数字字符串分解为整数部分和小数部分,支持正负号
函数来源: 原创
函数作者: Newer
适用版本: XDRX API 
最后更新时间: 2014-11-24
备注: (XD::STRING:MODF "-1.2") ----》("-1" "-2")
(XD::STRING:MODF "1.2") ----》("1" "2")
(XD::STRING:MODF "1.") ----》("1" "0")
(XD::STRING:MODF "+1.2") ----》("1" "2")
(XD::STRING:MODF ".2") ----》nil
演示图片: -

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

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

×
  1. ;|
  2. 将数字字符串分解为整数部分和小数部分,支持正负号
  3. 约定: 如果带小数点,前面必须有数
  4.        如果带正号,返回值去掉符号
  5. 例子:
  6.   (XD::STRING:MODF "-1.2") ----》("-1" "-2")
  7.   (XD::STRING:MODF "1.2") ----》("1" "2")
  8.   (XD::STRING:MODF "1.") ----》("1" "0")
  9.   (XD::STRING:MODF "+1.2") ----》("1" "2")
  10.   (XD::STRING:MODF ".2") ----》nil
  11. |;
  12. (defun XD::String:ModF (str / ret ret1)
  13.   (if (setq ret (XD::String:IsNum str))
  14.     (progn
  15.       (setq ret1 (xdrx_string_regexps "[^.]+" (car ret)))
  16.       (if (= (length ret1) 1)
  17.         (list (car ret1) "0")
  18.         (cond
  19.           ((= "-" (substr str 1 1))
  20.             (list (car ret1) (strcat "-" (cadr ret1)))
  21.           )
  22.           ((= "+" (substr str 1 1))
  23.             (list (substr (car ret1) 2) (cadr ret1))
  24.           )
  25.           (t
  26.             ret1
  27.           )
  28.         )
  29.       )
  30.     )
  31.   )
  32. )


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

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-24 21:28:51 来自手机 | 显示全部楼层
不是有个api函数吗?

点评

你说的是 xdrx_math_modf 吧,那个是对浮点数操作的,不是字符串。 用那个转换下也行,这个主要是试试正则直接操作字符串。  详情 回复 发表于 2014-11-24 21:44
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2014-11-24 21:44:07 | 显示全部楼层
st788796 发表于 2014-11-24 21:28
不是有个api函数吗?

你说的是 xdrx_math_modf 吧,那个是对浮点数操作的,不是字符串。
用那个转换下也行,这个主要是试试正则直接操作字符串。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-24 21:57:01 来自手机 | 显示全部楼层
newer 发表于 2014-11-24 21:44
你说的是 xdrx_math_modf 吧,那个是对浮点数操作的,不是字符串。
用那个转换下也行,这个主要是试试正 ...

先distof再分

点评

那就在提供一个DISTOF版本的 命令: (XD::STRING:MODF "2") ("2.0" "0.0") 命令: XD::STRING:MODF*取消* 命令: (XD::STRING:MODF "a") nil  详情 回复 发表于 2014-11-25 10:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2014-11-25 10:27:23 | 显示全部楼层

那就在提供一个DISTOF版本的

  1. (defun XD::String:ModF (str)
  2.   (mapcar
  3.     '(lambda (x)
  4.        (vl-princ-to-string x)
  5.      )
  6.     (xdrx_math_modf (distof str))
  7.   )
  8. )



命令: (XD::STRING:MODF "2")
("2.0" "0.0")

命令: XD::STRING:MODF*取消*

命令: (XD::STRING:MODF "a")
nil


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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2014-11-25 11:44:40 | 显示全部楼层
本帖最后由 newer 于 2014-11-25 11:46 编辑

完善下,提供个DIFTOF终极版的,这个DISTOF版本缺点就是由于中间用浮点数过渡,在小数位数很多的情况下,会有意外,不过不常见。
  1. (defun XD::String:ModF (str / len pofix ret ret1 x)
  2.   (and
  3.     (XD::String:IsNum str)
  4.     (setq len 1)
  5.     (or
  6.       (and
  7.         (setq pofix (xdrx_string_regexps "\.[0-9]+$" str))
  8.         (setq len (- (strlen (car pofix)) 1))
  9.       )
  10.       t
  11.     )
  12.     (setq ret (distof str))

  13.     (setq ret (mapcar
  14.                 '(lambda (x)
  15.                    (vl-princ-to-string (rtos x 2 len))
  16.                  )
  17.                 (xdrx_math_modf ret)
  18.               )
  19.     )
  20.     (setq ret1 (list (xdrx_string_regexpr "\.0$" (car ret) "")
  21.                      (xdrx_string_regexpr "^0\." (cadr ret) "")
  22.                )
  23.     )
  24.   )
  25.   ret1
  26. )

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-25 12:45:42 来自手机 | 显示全部楼层
[0-9]+$  小数点及后面数字能保留?

点评

你指的是 (setq pofix (xdrx_string_regexps "\.[0-9]+$" str)) 这个吧 ? 这个地方时得到小数点后面的,判断小数的位数,作为下面RTOS的参数,保证浮点的位数正确,因为math_modf 在位数很多时候,会截断显示  详情 回复 发表于 2014-11-25 13:00
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-11-25 13:00:59 | 显示全部楼层
st788796 发表于 2014-11-25 12:45
[0-9]+$  小数点及后面数字能保留?

你指的是 (setq pofix (xdrx_string_regexps "\.[0-9]+$" str)) 这个吧 ?


这个地方时得到小数点后面的,判断小数的位数,作为下面RTOS的参数,保证浮点的位数正确,因为math_modf 在位数很多时候,会截断显示的。


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-25 13:33:34 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2014-11-25 13:35 编辑

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-25 21:04:48 | 显示全部楼层
XDSoft 发表于 2014-11-25 13:00
你指的是 (setq pofix (xdrx_string_regexps "\.[0-9]+$" str)) 这个吧 ?

刚看了下手册,应该还可以简化

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

使用道具 举报

已领礼包: 191个

财富等级: 日进斗金

发表于 2014-11-30 12:57:51 | 显示全部楼层
本帖最后由 口味虾 于 2014-11-30 12:59 编辑

命令: (XD::STRING:MODF "-1.2")
(-0.2 -1.0)
命令: (XD::STRING:MODF "1.2")
(0.2 1.0)
命令: (XD::STRING:MODF "1.")
(0.0 1.0)
命令: (XD::STRING:MODF "+1.2")
(0.2 1.0)
命令: (XD::STRING:MODF ".2")
(0.2 0.0)



结果为什么是这样了。。。2014-11-30版本的。
运行于WIN7-64 cad2007

点评

这个函数已经加到晓东LISP函数库里面了,刚测试 命令: (XD::String:ModF "1.2") (1.0 0.2) 命令: (XD::String:ModF "-12.23") (-12.0 -0.23) 正常。  详情 回复 发表于 2014-11-30 13:38
你用的是几楼的代码?  详情 回复 发表于 2014-11-30 13:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2014-11-30 13:35:06 | 显示全部楼层
口味虾 发表于 2014-11-30 12:57
命令: (XD::STRING:MODF "-1.2")
(-0.2 -1.0)
命令: (XD::STRING:MODF "1.2")

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2014-11-30 13:38:22 | 显示全部楼层
口味虾 发表于 2014-11-30 12:57
命令: (XD::STRING:MODF "-1.2")
(-0.2 -1.0)
命令: (XD::STRING:MODF "1.2")

这个函数已经加到晓东LISP函数库里面了,刚测试

命令: (XD::String:ModF "1.2")
(1.0 0.2)
命令: (XD::String:ModF "-12.23")
(-12.0 -0.23)


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

使用道具 举报

已领礼包: 191个

财富等级: 日进斗金

发表于 2014-11-30 14:04:55 | 显示全部楼层
重启系统后又正常了,可能是cad刚加载新版本api的问题,

点评

刚才我看错了,应该是返回字符串,你重新下载下刚更新的LISP函数库。  详情 回复 发表于 2014-11-30 14:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2014-11-30 14:18:47 | 显示全部楼层
口味虾 发表于 2014-11-30 14:04
重启系统后又正常了,可能是cad刚加载新版本api的问题,

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 23:39 , Processed in 0.385954 second(s), 66 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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