找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1148|回复: 5

[编程申请]:字符型里程值数值计算后再转换为字符型(含思路)

[复制链接]
发表于 2009-6-13 15:05:26 | 显示全部楼层 |阅读模式

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

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

×
【编程请求】
一个里程值 1+234.56,就是1234.56m,现在需要增加一个定值比如6789.12m,增加定值后里程值为8023.68m,再分解为8+023.68。
流程:
1+234.56 >> 1234.56 >> 1234.56 + 6789.12(定值)=8023.68 >> 8+023.68
思路:
1、将1+234.56转换为数值型数字 1234.56(里程值通过框选选择)
(setq A "1+234.56")     ;A=1+234.56
(setq B (substr A 1 1)) ;B=1
(setq C (substr A 3))   ;C=234.56
(setq D (strcat B C))   ;D=1234.56 字符型
(setq D (atof D))       ;D=1234.56 数值型
2、将数值型1234.56加上一个定值E(手工输入6789.12)
(setq X (+ D E))   ;X=8023.68
3、将数值型8023.68转换为字符型 8+023.68
(setq int 2)  ;int为精度
(setq MM (substr (rtos (+1000 (rem X 1000)) 2 int) 2))   ;MM=023.68
(setq KK (itoa (fix (/ X 1000))))                        ;KK=8
(setq KKMM (strcat KK "+" MM))
4、将原来框选的里程值替换为增加定值后的里程值。

我不太会lisp,知道基本的思路,但没办法写出完成的程序,请那位大侠帮帮忙,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2009-6-13 22:19:03 | 显示全部楼层
试试下面的程序,看看行不行:
[PHP](defun C:nn ( / d e1 en k n nam nam1 ss str str1 str2)   
   (setq ss (ssget '((0 . "TEXT"))) nam0 (if nam0 nam0 1000.0))
   (princ "\n输入要增加的定值<")(princ (rtos nam0 2 2))
   (setq d (getreal ">") n 0
   )
   (if (= d nil)(setq d nam0))
   (setq nam0 d)
   (repeat (sslength ss)
     (setq en (entget (ssname ss n)) n (1+ n)
           nam (cdr (assoc 1 en)) str1 (substr nam 1 1)
           str2 (substr nam 3) str (strcat str1 str2)
           nam (atof str) nam (+ nam d)
           nam1 (fix (/ nam 1000)) str (rtos nam 2 2)
           str1 (itoa nam1) k (strlen str1) str2 (substr str  (1+ k))
           str (strcat str1 "+" str2)
     )   
     (setq e1 (subst (cons 1 str) (assoc 1 en) en))
     (entmod e1)
   )
   (princ)
)[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-14 10:36:30 | 显示全部楼层
我的失误,少考虑了一种情况

比如12+345.67 之类“+”符号前有多个数字的情况。

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

使用道具 举报

发表于 2009-6-15 08:47:11 | 显示全部楼层
最初由 Linux 发布
[B]

比如12+345.67 之类“+”符号前有多个数字的情况……

[/B]

[PHP](defun c:nn ( / d e1 en k l lop m n nam nam1 ss str str1 str2)   
   (setq ss (ssget '((0 . "TEXT"))) nam0 (if nam0 nam0 1000.0))
   (princ "\n输入要增加的定值<")(princ (rtos nam0 2 2))
   (setq d (getreal ">") n 0
   )
   (if (= d nil)(setq d nam0))
   (setq nam0 d)
   (repeat (sslength ss)
     (setq en (entget (ssname ss n)) n (1+ n)
           nam (cdr (assoc 1 en)) l (strlen nam)
     )
     (setq m 0 lop t)
     (while (and lop (< m l))
       (setq m (1+ m) str (substr nam m 1))
       (if (= str "+") (setq lop nil))
     )
     (if lop
       (setq str nam)
       (setq str1 (substr nam 1 (1- m))
           str2 (substr nam (1+ m)) str (strcat str1 str2)
           nam (atof str) nam (+ nam d)
           nam1 (fix (/ nam 1000)) str (rtos nam 2 2)
           str1 (itoa nam1) k (strlen str1) str2 (substr str  (1+ k))
           str (strcat str1 "+" str2)
       )
     )  
     (princ str) (princ "   ")
     (setq e1 (subst (cons 1 str) (assoc 1 en) en))
     (entmod e1)
   )
   (princ)
)[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-15 13:14:35 | 显示全部楼层
非常感谢,我又修改了一下,如下:

str (rtos nam 2 2)
改为
str (rtos (+ 1000 (rem nam 1000)) 2 1)


k (strlen str1) str2 (substr str  (1+ k))
改为
str2 (substr str 2)

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

使用道具 举报

发表于 2009-6-15 21:50:13 | 显示全部楼层
最初由 Linux 发布
[B]我又修改了一下,如下:


k (strlen str1) str2 (substr str  (1+ k))
改为
str2 (substr str 2)

[/B]


如果k (strlen str1) str2 (substr str  (1+ k))
改为str2 (substr str 2),则+号前是两位数的情况时会出错。
比如:
12+345.78加上1234.56后会成为13+3580.34,
正确结果应为13+580.34。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-6 19:20 , Processed in 0.390529 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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