Aller au contenu

Entier en texte avec ajout de 0 avant


Olivier Eckmann

Messages recommandés

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

  • Like 2
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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
)

 

Lien vers le commentaire
Partager sur d’autres sites

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
)
Lien vers le commentaire
Partager sur d’autres sites

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
)

 

Lien vers le commentaire
Partager sur d’autres sites

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+

  • Like 1

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

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

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é