santalin 发表于 2011-2-10 13:31:39

编写一个函数让数字保留指定整数和小数位数,【不足补零】!

比如:
(defun lsd_format (a b c /)
...
)

a=3.1
b=2(整数位数)
c=3(小数位数)
程序输出:03.100

a=133.1183
b=2(整数位数)
c=3(小数位数)
程序输出:33.118

这个程序怎么写啊?!!

Gu_xl 发表于 2011-2-10 18:04:35

本帖最后由 Gu_xl 于 2011-2-10 18:11 编辑


(defun lsd_format (a b c / dimzin n)
(setq dimzin (getvar "dimzin"))
(setvar "dimzin" 0)
(setq a (rtos a 2 c))
(setq n (VL-STRING-SEARCH "." a))
(if n
    (if (>= b n)
      (repeat (- b n) (setq a (strcat "0" a)))
      (setq a (substr a (- n b -1) ))
      )
    (if (>= b (strlen a))
      (repeat (- b (strlen a)) (setq a (strcat "0" a)))
      (setq a (substr a (- (strlen a) b -1) ))
      )
    )
(setvar "dimzin" dimzin)
a
)


ZZXXQQ 发表于 2011-2-10 20:51:16

本帖最后由 ZZXXQQ 于 2011-2-11 20:11 编辑


(defun lsd_format (a b c / dimzin aa i)
(setq dimzin (getvar "dimzin"))
(setvar "dimzin" 0)
(setq a (/ a (expt 10.0 b)))
(setq aa (* (- a (fix a)) (expt 10 b)))
(setq a (rtos aa 2 c))
(setq i 1)
(repeat (1- b)
(if (< aa (expt 10 (- b i))) (setq a (strcat "0" a)))
(setq i (1+ i))
)
(setvar "dimzin" dimzin)
a
)

Gu_xl 发表于 2011-2-10 22:55:55

回复 ZZXXQQ 的帖子

(lsd_format2 3 4) 返回000.0000 ,将 (expt 10 b) 改为(expt 10. b),避免整整相除为0的情况!

461045462 发表于 2011-2-11 08:41:37

请问版主:
在cad图形中,有些数据带有小数,我想修改成指定小数的位数,用lsp语句要如何编辑?
如下图:




例如,我要将所有的原来有3位小数的数据改到2位,或者是整数。
数据的属性为:选择对象: ((-1 . <图元名: 7ef9ac78>) (0 . "TEXT") (330 . <图元名: 7ef97cc0>) (5
. "318FF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "dgx") (6 .
"Continuous") (100 . "AcDbText") (10 491172.0 4.38832e+006 1660.37) (40 .
4.80107) (1 . "1660.371") (50 . 2.1188) (41 . 0.8) (51 . 0.0) (7 . "HZ") (71 .
0) (72 . 4) (11 491163.0 4.38833e+006 1660.37) (210 0.0 0.0 1.0) (100 .
"AcDbText") (73 . 0) (-3 ("SOUTH" (1000 . "201200"))))
请指教
谢谢

Gu_xl 发表于 2011-2-11 12:25:19

回复 461045462 的帖子


(defun c:tt(/ ss n nn txt enl en dimzin)
(setq nn (getint "\n保留小数点位数<2>:"))
(if (null nn) (setq nn 2))
(setq dimzin (getvar "dimzin"))
(setvar "dimzin" 0)
(setq ss (ssget "x" '((0 . "text") (1 . "*#*"))))
(if ss
    (progn
      (Setq n 0)
      (repeat (sslength ss)
(setq en (ssname ss n)
       txt (cdr (assoc 1 (setq enl (entget en))))
       n (1+ n)
       )
(if (or (= 'real (type (read txt)))
(= 'int (type (read txt)))
)
   (progn
   (setq txt (rtos (read txt) 2 nn))
   (setq enl (subst (cons 1 txt) (assoc 1 enl) enl))
   (entmod enl)
   )
   )
)
      )
    )
(setvar "dimzin" dimzin)
(princ)
)

461045462 发表于 2011-2-11 16:01:46

回复 Gu_xl 的帖子

谢谢版主
收藏了,运行后,正是我需要的
好好学习,领会领会
祝兔年吉祥如意!

gzbccy 发表于 2011-2-11 16:12:07

回复 Gu_xl 的帖子

谢谢斑竹,收藏了。要好好学习
祝你兔年吉祥如意,恭喜发财

chengx2000 发表于 2011-2-12 08:23:54

回复 Gu_xl 的帖子

请问版主,系统变量dimzin是控制什么的,在帮助文件里说是:控制主单位的消零处理
不是很明白,请指教。
另外有没有一个关于系统变量的详细教程,谢谢!

Gu_xl 发表于 2011-2-12 10:46:15

本帖最后由 Gu_xl 于 2011-2-12 10:50 编辑

回复 chengx2000 的帖子
具体的系统变量用法德看cad的帮助文件!
下面是cad对dimzin变量的具体描述
DIMZIN 概念   操作步骤   快速参考
类型: 整数
保存位置: 图形
初始值: 0
控制对主单位值的消零处理。当在命令行中输入或在“注释”对话框的“主单位”区域中设置时,DIMZIN 将存储此值。DIMTZIN 的值为 0 到 3 时只影响英尺-英寸标注。
0
消除零英尺和零英寸

1
包含零英尺和零英寸

2
包含零英尺,消除零英寸

3
包含零英寸,消除零英尺

4
消除十进制标注中的前导零(例如,0.5000 变为 .5000)

8
消除十进制标注中的后续零(例如,12.5000 变为 12.5)

12
消除前导零和后续零(例如,0.5000 变为 .5)

DIMZIN 还影响 AutoLISP rtos 和 angtos 函数执行的实数-字符串转换。


页: [1] 2 3
查看完整版本: 编写一个函数让数字保留指定整数和小数位数,【不足补零】!