fnum

Quando vamos escrever um número via autolisp, precisamos que ele esteja formatado com separadores de milhar essas coisas...
;|formata um numero real em uma string com f casas decimais
  e com separador de milhar, exemplo:
 (fnum 123456789.123456789 3)|;

(defun fnum  (num f / int pos fp)
  (
setq int (rtos num 2 f)
        pos (vl-string-search "." int)
        pos (if pos pos (strlen int))
        fp  (substr int (+ pos 2) (strlen int))
        int (substr int 1 pos))
  (
while (< (strlen fp) f) (setq fp (strcat fp "0")))
  (
repeat (/ pos 3)
    (
setq int (strcat (substr int 1 (- pos 3))
                      "."
                      (substr int (- pos 2) (strlen int)))
          pos (- pos 3)))
  (
vl-string-left-trim "."
    (if (zerop f) int  (strcat int "," fp))))

Com esta rotina pode-se fazer esta formatação... também serve de exemplo de como usar a função "vl-string-left-trim"

para desfazer a formatação acima, use:
;(unformatnum str):
;converte numeros do tipo 123.456.789,00 para 123456789.0

(defun unformatnum  (str / v p)
  (
setq v (vl-string-search "," str)
        p (vl-string-search "." str))
  (
atof
    (cond ((and v p)
           (
vl-string-subst "."  ","
             (while (vl-string-search "." str)
               (
setq str (vl-string-subst "" "." str)))))
          (
v (vl-string-subst "." "," str))
          (
p str)
          (
t str))))

2 comentários:

  1. Onde estaria a definição da função
    (vl-string-search "." int)
    que o autolisp não reconhece?

    ResponderExcluir
  2. nas suas rotinas deve aparecer o (vl-load-com) ANTES de qualquer função visual lisp (que neste blog aparecem sempre em AZUL) que comece com "VL-". isso irá carregar as extesões VL, sem elas, nada feito...

    veja o help para VL-LOAD-COM, ok?

    ResponderExcluir