删除0#039;小数点后的s
很快地做了一个Lisp程序的Lisp程序,想知道如何删除零(defun c:test (/ dist p1 p2 ent)
(setq dist (rtos (distance
(setq p1 (getpoint "\nSpecify first point: "))
(setq p2 (getpoint p1 "\nSpecify second point: "))) 2))
(setq ent (entget (car (entsel "\nSelect text to modify: "))))
(entmod (subst (cons 1 dist)(assoc 1 ent) ent))
(princ)
)
我的意思示例
测量值为46.25而不是46.25000
或42.375而不是42.37500。我不是在寻找(rtos dist 2 2)或。。。距离2 3)
我在寻找某种自动改变精度的条件。 查看DIMZIN系统变量。 美好的谢谢 尝试以下操作:
(defun set-prec (num / precn numstr)
(setq li (reverse (vl-string->list (rtos num 2 (setq precn 12)))))
(while (= 48 (car li))
(setq li (reverse (vl-string->list (rtos num 2 (setq precn (1- precn))))))
)
(setq numstr (rtos num 2 precn))
)
(设置prec 1.123456789000)返回“1.123456789” 我试着用AUTOLISP尽可能多地学习,但VLISP的调用太大了 你是说像这样?
(defun c:TEST (/ dist eName eData)
(if
(and
(setq dist (vl-string-right-trim "0" (rtos (getdist "\nSpecify first point: "))))
(setq eName (car (entsel "\nSelect text to modify: "))))
(entmod (subst (cons 1 dist) (assoc 1 (setq eData (entget eName))) eData)))
(princ)) ;_end defun
请参阅,在这种情况下,当您在没有定义精度的情况下使用rtos时,它会将整个实数作为字符串返回(无论小数位数有多少)。现在将其与vl string right trim函数配对,得到一个返回的字符串,该字符串根据距离以十进制精度动态变化。
编辑:不更改系统变量
很抱歉吹毛求疵,但是
(rtos nil) 如果您想完全避免VL:
(defun c:test ( / d s )
(if
(and
(setq d (getdist "\nSpecify Distance: "))
(setq s (ssget "_:L" '((0 . "TEXT,MTEXT"))))
)
(
(lambda ( i / e )
(while (setq e (ssname s (setq i (1+ i))))
(entupd
(cdr
(assoc -1
(entmod
(subst
(cons 1
(
(lambda ( s )
(while (eq "0" (substr s (strlen s)))
(setq s (substr s 1 (1- (strlen s))))
)
s
)
(rtos d)
)
)
(assoc 1 (entget e)) (entget e)
)
)
)
)
)
)
)
-1
)
)
(princ)
)
李,请继续挑剔。。。这是我变得更好的唯一途径眨眼:
也许,这更可取:
(defun c:TEST (/ dist eName eData)
(vl-load-com)
(if
(and
(setq dist (getdist "\nSpecify first point: "))
(setq dist (vl-string-right-trim "0" (rtos dist)))
(setq eName (car (entsel "\nSelect text to modify: "))))
(entmod (subst (cons 1 dist) (assoc 1 (setq eData (entget eName))) eData)))
(princ)) ;_end defun
..........
页:
[1]
2