Olivier Eckmann Posté(e) le 29 mai 2024 Posté(e) le 29 mai 2024 Bonjour, On doit parfois convertir des entiers (N° de quelque chose) en texte mais en ajoutant des 0 en début pour conserver un tri correct sur des textes. Par exemple 1 devient 0001 24 devient 0024 145 devient 0145 En cherchant à droite et à gauche, je suis tombé sur une solution assez originale, en tout cas je n'y aurais jamais pensé. Si on veut convertir un entier sur 4 caractères, il suffit de le diviser par 10 puissance 4, le convertir en texte avec 4 décimales, puis supprimer les 2 premiers caractères. Ainsi, si on prend 12 et que l'on veut le mettre sur 4 caractères, on le divise par 10^4, on obtient 0.0012, puis on retire les 2 premiers caractères et il reste 0012. Voilà ce que ça peut donner en lisp (defun Int2Str (iNumber iNbZero) (substr (rtos (/ (float iNumber) (expt 10 iNbZero)) 2 iNbZero) 3 iNbZero) ) Je travaille toujours avec DIMZIN à 0, donc pas de souci de suppression des 0 de début ou de fin dans la conversion. Je pense qu'il faudrait l'intégrer. Olivier 2
Fraid Posté(e) le 29 mai 2024 Posté(e) le 29 mai 2024 Bonjour, Merci pour cette découverte sympa. Par contre ta fonction ne fonctionne plus avec (int2str 100 4) https://github.com/Fraiddd
didier Posté(e) le 29 mai 2024 Posté(e) le 29 mai 2024 Bonjour @Olivier Eckmann Merci pour le partage de connaissance, je n'y aurais pas pensé non plus. C'est adopté ! Par contre, je n'aurais pas choisi ce nom pour le deuxième argument, il prête à confusion, lonstr (pour longueur chaine) est plus proche (à mes yeux) de la destination finale. @Fraid, j'ai testé et je ne confirme pas ce que tu écris, ça fonctionne parfaitement avec (int2str 100 4) Quel résultat obtiens-tu ? Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
VDH-Bruno Posté(e) le 29 mai 2024 Posté(e) le 29 mai 2024 Commande : (int2str 100 4) "01" Commande : (int2str 1000 4) "1" Commande : (int2str 10 4) "001" Commande : (int2str 12 4) "0012" Si DIMZIN différent de 0 Salutations Bruno Apprendre => Prendre => Rendre
Olivier Eckmann Posté(e) le 29 mai 2024 Auteur Posté(e) le 29 mai 2024 J'ai intégré la gestion de la variable DIMZIN (defun Int2Str (iNumber iNbCarac / OldDIMZIN sResult) (setq OldDIMZIN (getvar "DIMZIN")) (setvar "DIMZIN" 0) (setq sResult (substr (rtos (/ (float iNumber) (expt 10 iNbCarac)) 2 iNbCarac) 3 iNbCarac)) (setvar "DIMZIN" OldDIMZIN) sResult )
VDH-Bruno Posté(e) le 29 mai 2024 Posté(e) le 29 mai 2024 Oui c'est préférable Apprendre => Prendre => Rendre
VDH-Bruno Posté(e) le 29 mai 2024 Posté(e) le 29 mai 2024 Cette discussion me rappelle ce sujet ou il était question de rajouter des 0 de fin sur des nombres décimaux https://cadxp.com/topic/37583-rtos/?do=findComment&comment=230041 Apprendre => Prendre => Rendre
didier Posté(e) le 29 mai 2024 Posté(e) le 29 mai 2024 OK, après l'injection du contrôle de DIMZIN, plus de doutes. Éternel débutant... Mon site perso : Programmer dans AutoCAD
Fraid Posté(e) le 29 mai 2024 Posté(e) le 29 mai 2024 Cela fait réfléchir aux tests unitaires des fonctions. Hors contexte, biens souvent elle ne fonctionnent pas. Pour moi, la première expression est la bonne, surtout si elle est inclue dans une boucle itérant sur une big data. mais doit être lancé depuis une autre fonction pour être testée. (defun c:test (/ OldDIMZIN sResult int2str) (defun int2str(iNumber iNbZero) (substr (rtos (/ (float iNumber) (expt 10 iNbZero)) 2 iNbZero) 3 iNbZero) ) (setq OldDIMZIN (getvar "DIMZIN")) (setvar "DIMZIN" 0) (setq sResult (int2str 12 4)) (setvar "DIMZIN" OldDIMZIN) sResult ) https://github.com/Fraiddd
Olivier Eckmann Posté(e) le 29 mai 2024 Auteur Posté(e) le 29 mai 2024 On peut aussi envisager un drapeau comme paramètre pour activer le test sur DIMZIN ;======================================================================= ; Int2Str : fonction convertissant un nombre entier en string avec ajout ; de 0 devant selon le nombre de caractère désiré en sortie ;----------------------------------------------------------------------- ; paramètres : ; iNumber : nombre entier à convertir ; iNbCarac : nombre de caractère totale de la chaine retournée ; bCheckDimZin : Drapeau de test de la variable DIMZIN à 0 ;======================================================================= (defun Int2Str (iNumber iNbCarac bCheckDimZin / OldDIMZIN sResult) (if (and bCheckDimZin (/= (setq OldDIMZIN (getvar "DIMZIN")) 0)) (setvar "DIMZIN" 0) ) (setq sResult (substr (rtos (/ (float iNumber) (expt 10 iNbCarac)) 2 iNbCarac) 3 iNbCarac)) (if (and bCheckDimZin (/= OldDIMZIN 0)) (setvar "DIMZIN" OldDIMZIN) ) sResult )
VDH-Bruno Posté(e) le 31 mai 2024 Posté(e) le 31 mai 2024 Le 29/05/2024 à 09:52, Olivier Eckmann a dit : Bonjour, On doit parfois convertir des entiers (N° de quelque chose) en texte mais en ajoutant des 0 en début pour conserver un tri correct sur des textes. Par exemple 1 devient 0001 24 devient 0024 145 devient 0145 En cherchant à droite et à gauche, je suis tombé sur une solution assez originale, en tout cas je n'y aurais jamais pensé. Si on veut convertir un entier sur 4 caractères, il suffit de le diviser par 10 puissance 4, le convertir en texte avec 4 décimales, puis supprimer les 2 premiers caractères. Ainsi, si on prend 12 et que l'on veut le mettre sur 4 caractères, on le divise par 10^4, on obtient 0.0012, puis on retire les 2 premiers caractères et il reste 0012. Voilà ce que ça peut donner en lisp (defun Int2Str (iNumber iNbZero) (substr (rtos (/ (float iNumber) (expt 10 iNbZero)) 2 iNbZero) 3 iNbZero) ) Je travaille toujours avec DIMZIN à 0, donc pas de souci de suppression des 0 de début ou de fin dans la conversion. Je pense qu'il faudrait l'intégrer. Olivier Sinon rapidement dans le même esprit pour ne pas avoir à se soucier de DIMZIN Ajouter en puissance de 10, plutôt que de diviser puis convertir le résultat en texte en suppriment le 1er caractère (defun Int2Str (iNumber iNbCarac) (substr (itoa (+ iNumber (expt 10 iNbCarac))) 2) ) _$ (int2str 10 4) "0010" _$ (int2str 12 4) "0012" _$ (int2str 9000 4) "9000" A la condition que le nombre soit inférieur au nombre de chiffre significatif que l'on veut obtenir sinon ajouter une condition de longueur dans la fonction substr A+ 1 Apprendre => Prendre => Rendre
VDH-Bruno Posté(e) le 31 mai 2024 Posté(e) le 31 mai 2024 Il y a 1 heure, VDH-Bruno a dit : A la condition que le nombre soit inférieur au nombre de chiffre significatif que l'on veut obtenir sinon ajouter une condition de longueur dans la fonction substr Et dans ce cas pour réduire le nombre au format souhaité dizaines, milliers ect.. (defun Int2Str (iNumber iNbCarac) (substr (setq iNumber (itoa (+ iNumber (expt 10 iNbCarac)))) (- (1+ (strlen iNumber)) iNbCarac) ) ) _$ (int2str 1259410 4) "9410" _$ (int2str 410 4) "0410" Apprendre => Prendre => Rendre
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant