Lt Dan's l 发表于 2022-7-6 10:31:01

删除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)
我在寻找某种自动改变精度的条件。

Lee Mac 发表于 2022-7-6 10:38:17

查看DIMZIN系统变量。

Lt Dan's l 发表于 2022-7-6 10:42:15

美好的谢谢

Hippe013 发表于 2022-7-6 10:49:23

尝试以下操作:
 

(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”

Lt Dan's l 发表于 2022-7-6 10:51:51

我试着用AUTOLISP尽可能多地学习,但VLISP的调用太大了

BlackBox 发表于 2022-7-6 10:56:02

你是说像这样?
 

(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函数配对,得到一个返回的字符串,该字符串根据距离以十进制精度动态变化。
 
编辑:不更改系统变量

Lee Mac 发表于 2022-7-6 11:00:08

 
很抱歉吹毛求疵,但是
 
(rtos nil)

Lee Mac 发表于 2022-7-6 11:07:18

如果您想完全避免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)
)

BlackBox 发表于 2022-7-6 11:11:57

 
 
李,请继续挑剔。。。这是我变得更好的唯一途径眨眼:
 
也许,这更可取:
 

(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

Lee Mac 发表于 2022-7-6 11:13:40

 
..........
页: [1] 2
查看完整版本: 删除0#039;小数点后的s