Aller au contenu

Petit truc que je ne comprends pas avec (wcmatch.


DenisHen

Messages recommandés

Bonjour à la communauté.
J'ai des nombres positifs et négatifs (-5, -3, 0, 3, 5...) mais pour créer un calque, j'ai besoin que le format soit "-05", "-03", "00", "03";..
J'ai donc fait un petit test dans la console, et j'obtient ça :

_$ (rtos -2 2 0)
"-2"
_$ (wcmatch (rtos -2 2 0) "-")
nil
_$ (wcmatch (rtos -2 2 0) "2")
nil
_$ (wcmatch (rtos -2 2 0) "6")
nil

Je ne comprends pas le résultat.
J'ai toujours la solution de demander si le nombre est négatif, je le multiplie par -1, et j'ajoute "-0" au début.
Mais je ne trouve pas ça très... joli.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

En fait, après consultation du site @didier, j'ai fini par trouver, en plus, je format en deux caractères :

(defun c:DH_test ()
  (setq Val 20)
  (if (< Val 0)
    ;;Négatif
    (progn (setq Long (strlen (setq Val$ (rtos Val 2 0)))) ;
      (setq Val$ (strcat "-0" (substr Val$ 2 5)));
      ) ;_ Fin de progn
    ;;Positif
    (progn (if (< (strlen (rtos Val 2 0)) 2)
             (setq Val$ (strcat "0" (rtos Val 2 0)))
             (setq Val$ (rtos Val 2 0))
           ) ;_ Fin de if
    ) ;_ Fin de progn
  ) ;_ Fin de if
  (princ Val$)
  (princ)
) ;_ Fin de defun

Encore un grand merci à didier pour son site...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Y'a un truc qui me dérange dans ton code.

Sinon tu peux tenter un truc dans ce genre :
- 1) contrôler la longueur totale du nombre par rapport à la longueur du nombre en valeur absolue afin de déterminer si le nombre est négatif -> utiliser la fonction "ABS"
- 2) contrôler la longueur du nombre en valeur absolue -> si inférieur à 2 appliquer un 0 devant sinon garder la valeur 
- 3) associer les deux étapes précédentes
 

Lien vers le commentaire
Partager sur d’autres sites

Salut @JPhil et merci pour ta proposition.
Je n'ai pas tout compris, ça changera quoi à mon code.
Si j'ai Val=-5, j'obtiendrais "-05", et si Val=3, j'obtiendrais "03", et si j'ai Val=12, j'obtiendrais "12".
Mon code fonctionne comme ça, et surtout, je le comprends...
Mais si tu as une autre proposition, pourquoi pas...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Question, si tu as Val=-15 qu'obtiens-tu ? ^^" car si je comprends bien ton code, tu devrais obtenir "-012", right ?

Ce que suggère @JPhil c'est de simplifier ton code en ajoutant le signe "-" uniquement après, évitant le premier (if) en utilisant la fonction (abs) !
Quelque chose comme ceci devrais fonctionner par exemple :

(defun foo (num i / str lng)
  (setq str (itoa (abs num)))
  (setq lng (strlen str))
  (repeat (- i lng) (setq str (strcat "0" str)))
  (if (minusp num)
    (strcat "-" str)
    str
  )
)

Avec num correspondant au nombre que tu veux (donc par exemple Val, ici 20) et i le nombre de chiffres significatifs (indique le nombre de "0" à placer au début si nécessaire)
Donc pour l'exemple ci-dessus :

_$ (foo 20 2)
"20"
_$ (foo -5 2)
"-05"
_$ (foo -5 0)
"-5"
_$ (foo 3 2)
"03"
_$ (foo 20 3)
"020"

Évidemment, tes exemples utilisent uniquement des valeurs fixes, donc si on veut étendre le jeu aux nombres décimaux on peut faire cela plutôt :

(defun foo2 (num i / str lng)
  (setq str (vl-princ-to-string (abs num)))
  (setq lng (strlen (itoa (fix (abs num)))))
  (repeat (- i lng) (setq str (strcat "0" str)))
  (if (minusp num)
    (strcat "-" str)
    str
  )
)

NB: Dans ce genre de cas, je préfère utiliser (vl-princ-to-string) au lieu de (rtos) car elle n'est pas influencée par la valeur de DIMZIN contrairement à (rtos), pouvant ainsi renvoyer une chaîne de caractères ne correspondant pas exactement au nombre renseigné au départ.
On pourrait également renforcer le programme en vérifiant que l'argument num est bien un nombre (entier ou décimal) en utilisant la fonction (numberp).

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Sa"lu-na" (Hi hi hi)
Que dire, Wouaouw ! ! !
Encore un grand merci à toi, J'apprends plein de trucs...
J'ai cherché à mettre en défaut ton FOO (pourquoi toujours "FOO", ça vient d'Eric Raymond ?), mais rien à dire...
Merci encore à toi, et Miaou à tout le monde...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Je viens de m'apercevoir que je me suis trompé sur Val=-15 donc renvoie "-012"... >w<

Pour la fonction foo, j'ai remarqué que sur les forums anglophones les fonctions étaient toujours nommées ainsi. Je suppose que l'explication vient de là :

In the US (as Wikipedia says) "foo" and "bar" are common placeholders in computer programming. They are often used as the names of unimportant variables. They've been used since the early 1960s. They come from the combination "foobar", another meaningless term used since the 1960s in computing.

Du coup chat me semble parfaitement logique d'utiliser cette dénomination lorsque le nom de la fonction importe peu...

Bisous, Luna

Lien vers le commentaire
Partager sur d’autres sites

ChaLuna.
Je me suis apperçu plusieurs fois, au fil du temps, que je copiais bêtement les "FOO" dans mes Lisp.
Et il interféraient entre eux (le dernier chargé avait raison 😉 ).
Ce doit être pour cette raison que Maître (gile) et d'autres les personnalisent systématiquement.
Encore merci à toi...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Le 31/08/2022 à 20:06, DenisHen a dit :

Ce doit être pour cette raison que Maître (gile) et d'autres les personnalisent systématiquement.

Non, je peux aussi utiliser 'foo' assez souvent mais généralement de façon locale (d'où l'importance de déclarer les variables et aussi les noms de fonction localement).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

En effet, j'ai oublié de préciser qu'il s'agit d'un nom temporaire... C'est à toi de renommer la fonction selon tes envies/habitudes (car le nom d'une fonction peut sembler logique pour quelqu'un et complètement aberrant pour quelqu'un d'autre) ou bien il faut déclarer tes fonctions localement comme l'explique (gile) ! A vrai dire, c'est également un soucis de flemmardise de ne pas vouloir réfléchir à un nom pour une fonction développée à la va vite, et je m'en excuse.

Une chose est sûre en tous cas, à chaque fois que je développe une fonction dont je ne trouve pas de nom pertinent (et qui n'a d'utilité que pour un unique programme), j'ai souvent à les appeler (foo) voire (f). Mais bien évidemment dans 100% des cas, ces fonctions sont déclarées localement !

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Tu m'aides, tu me rends service et tu t'excuses ? ? ? 😊
Tu n'as pas à t'excuser, c'est à moi de le faire, même avec mes piètres connaissances, j'aurais du le savoir...
Encore merci à vous...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité