Page 1 sur 2

Retourner le Nième entier numérique depuis une chaîne

Publié : lun. 12/sept./2016 22:31
par Ollivier

Code : Tout sélectionner

Procedure.S Digit(Text.S, n)
        Define Number.S
        For I = 1 To Len(Text + " ")
                A = Asc(Mid(Text, I, 1) )
                OldDigit = Digit
                If (A > 47) And (A < 58)
                        Digit = 1
                        If Not OldDigit
                                nb + 1
                        EndIf
                        Number + Chr(A)
                Else
                        Digit = 0
                        If OldDigit
                                If nb = n
                                        ProcedureReturn Number
                                EndIf
                                Number = ""
                        EndIf
                EndIf
        Next
EndProcedure

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : lun. 12/sept./2016 23:17
par falsam
Un debug de l'appel à la fonction ne me donne rien. Aurais tu un exemple ? Merci.

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mar. 13/sept./2016 10:24
par MLD
Salut Ollivier :lol:

Perso j'aurai fait comme ceci

Code : Tout sélectionner


Procedure.s Digit2(Text.s,n)
Digit = 0 : Dp = 0   
  For I = 1 To Len(Text.s)
    A = Asc(Mid(Text, I, 1))
    If (A > 47) And (A < 58)
      Digit = Digit +1
      If Digit = n
        Dp =1
        ProcedureReturn Chr(A)
      EndIf
    EndIf
  Next
  If Dp = 0
    ProcedureReturn ""
  EndIf  
EndProcedure

Debug Digit2("ac123sd45", 4)


Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mar. 13/sept./2016 11:54
par Ollivier
@MLD

Ton algo donne le Nième chiffre présent dans une chaîne.

Le mien donne le Nième nombre entier présent dans une chaîne.



Exemple :

Dans "J'ai 21 doigts sur moi. Le plus court fait 24 millimètres."

Si tu mets 1 en 2nd argument, tu obtiendras "21".
Si tu mets 2, tu obtiendras "24".

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mar. 13/sept./2016 12:23
par Zorro
moi j'aurai fait comme ça :lol: :)

Code : Tout sélectionner

Declare.s digit_by_zorro(text.s)

a.s= "J'ai 21 doigts sur moi. Le plus court fait 24 millimètres."
debug a.s
debug "nombre ressortis :"
Debug digit_by_zorro(a.s)
Debug digit_by_zorro(a.s)

Procedure.s digit_by_zorro(Text.S)
		; By Zorro
		static pos
		if pos=0:pos=1:Else:Pos=pos+1
		endif
		ref.s="0,1,2,3,4,5,6,7,8,9"
		For i=pos to CountString(Text.S," ")
				extrait.s=StringField(Text.s,i," ")
				For b=1 to 9
						if FindString(extrait.s,StringField(ref.s,b,","))>0
								pos=i
								ProcedureReturn StringField(Text.s,pos," ")
						Endif
				Next b
		Next i
EndProcedure


Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mar. 13/sept./2016 12:35
par Kwai chang caine

Code : Tout sélectionner

digit_by_zorro
; By Zorro
digit_by_zorro
digit_by_zorro
Celui qui ne sait pas que le code est de toi, il est pas tres observateur :mrgreen: :lol:

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mar. 13/sept./2016 12:38
par Zorro
Kwai chang caine a écrit :Celui qui ne sait pas que le code est de toi, il est pas tres observateur :mrgreen: :lol:
c'est clair ! :lol:
le code est de MOA !!!

il y a une explication a tout ça :)
je suis tellement épaté d'arriver a faire un truc, que du coup je me sent obligé de bien le dire :lol:

probablement un grand manque de confiance en moi , peut etre liée a mon actualitée ..
lorsqu'on doute de votre personne, vous en venez a chercher des bases a quoi se raccrocher, ça rassure

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mar. 13/sept./2016 14:39
par Micoute
Comme je te comprend !

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mar. 13/sept./2016 15:14
par MLD
Ollivier ok
Zorro Si l'entier touche une lettre ton algo ne fonctionne pas :mrgreen:

Code : Tout sélectionner



Procedure.s Digit3(text.s,n)
  Dim tabentier.s(0)
  For z = 1 To Len(text.s)
    A = Asc(Mid(text,z,1))
    If (A > 47) And (A < 58)
      dp =0
      c$ = tabentier.s(ArraySize(tabentier.s())) + Chr(A)
      b = ArraySize(tabentier.s())
      tabentier(b) = c$
    Else
      If dp = 0
        ReDim tabentier.s(ArraySize(tabentier.s())+1)
        dp = 1
      EndIf
    EndIf  
  Next 
  If n = < ArraySize(tabentier.s())
    ProcedureReturn  tabentier.s(n)
  Else
    ProcedureReturn ""
  EndIf
EndProcedure 

Debug Digit3("J'ai 21 doigts sur moi. Le plus court fait 24 millimètres.",2)
Ollivier 24mm c'est ton 21em doigt :?:

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mar. 13/sept./2016 16:28
par Zorro
MLD a écrit :Ollivier ok
Zorro Si l'entier touche une lettre ton algo ne fonctionne pas :mrgreen:
oui c'est clair , meme si les chiffres sont en chinois ,en cyrillique,en maya etc... ça ne marche pas non plus :)

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mar. 13/sept./2016 19:13
par Ollivier
MLD a écrit :Ollivier 24mm c'est ton 21em doigt ?
Après une heure de baignade dans une eau à 12 degrés, si t'as mieux, fais un selfie.

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mar. 13/sept./2016 19:15
par Shadow
Intéressant merci :)

Zorro, je ne sais pas trop mais je pense que c'est peut être une bonne chose si tu doute de toi non ?
Perso je trouve que tu as fais de gros effort ici pour rester plus zen et je t'en félicite d'ailleurs.

C'est bien de savoir se remettre en question.
Peut être que les évènements qui ton toucher ont aider à cela ?

En tous les cas moi j'te félicite car t'es bien plus agréable à vivre.
Est ce que je suis le seule à penser ça ?

Non parce que quand ça va mal, faut le dire
mais quand ça va bien aussi !

Cordialement.

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mer. 14/sept./2016 9:23
par MLD
Ollivier
Aprés reflexions, je trouve ceci pratique.

Code : Tout sélectionner

Procedure.s Digit3(text.s,n)
  nd = 1:c$ = ""
  For z = 1 To Len(text.s + " ")
    A = Asc(Mid(text,z,1))
    Select A
      Case 48 To 57  
        dp =1
        c$ =c$ + Chr(A)
        Default
        If dp = 1
          If n = nd
            ProcedureReturn c$
          Else
            dp =0 : c$ = ""
            nd = nd +1
          EndIf
        EndIf
    EndSelect    
  Next
  ProcedureReturn ""    
EndProcedure 

Debug Digit3("J'ai 21 doigts sur moi. Le plus court fait 24 millimètres.",2)
Maintenant un entier ou un chiffre décimal

Code : Tout sélectionner

Procedure.s Digit4(text.s,n)
  nd = 1:c$ = ""
  For z = 1 To Len(text.s + " ")
    A = Asc(Mid(text,z,1))
    Select A
      Case 48 To 57 
        dp =1
        c$ =c$ + Chr(A)
      Case 44,46
        If dp = 1
          c$ =c$ + Chr(A)
        EndIf  
      Default
        If dp = 1
          If n = nd
            ProcedureReturn c$
          Else
            dp =0 : c$ = ""
            nd = nd +1
          EndIf
        EndIf
    EndSelect    
  Next
  ProcedureReturn ""    
EndProcedure
Debug Digit4("J'ai 21 doigts sur moi. Le plus court fait 24.2 millimètres.",2)
Pas besoin de selfie regarde :oops: :mrgreen:

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mer. 14/sept./2016 9:30
par Kwai chang caine
Lord dayvid shadow a écrit :En tous les cas moi j'te félicite car t'es bien plus agréable à vivre.
Est ce que je suis le seule à penser ça ?
Non non, je suis exactement du même avis.
J'aurais pas dit mieux, et tu as raison aussi de dire que y'a pas que le négatif qu'il faut souligner :D
Doux, poli, posé, respectueux.....un vrai "gnagneau" .....
Pour une fois le conte se finit bien...c'est le loup qui a été mangé :wink: :lol:

Re: Retourner le Nième entier numérique depuis une chaîne

Publié : mer. 14/sept./2016 10:32
par Zorro
MLD a écrit : Maintenant un entier ou un chiffre décimal
juste pour info , ma methode fonctionne aussi pour les chiffres decimal

petite variante pour faire ressortir les entiers, les decimal, l'hexa,les chiffres romains, les binaires ! (LOL)

ps: en utilisant le meme principe avec les RegEx on doit pouvoir pousser le principe :)

Code : Tout sélectionner

Declare.s digit_by_zorro(text.s,reset=#false)


;a.s= "J'ai 21 doigts sur moi. Le plus court fait 24 millimètres."
;a.s="J'ai 21 doigts sur moi. Le plus court fait 24.2 millimètres."
a.s="J'ai 21 doigts sur moi. Le plus court fait $A1 millimètres, voir 2.54 ou bien VII cm ça depends des moments, voir meme %1001 "
debug a.s
Debug ""

digit_by_zorro(a.s,#true)
For t=1 to 5
		Debug "nombre ressortis :"+digit_by_zorro(a.s)
Next t


Procedure.s digit_by_zorro(Text.S,reset=#False)
		; By Zorro		
		; le parametre Reset permet de remettre le pointeur de recherche 'pos' a zero
		static pos
		if pos=0 or Reset=#true		
				pos=1
				ProcedureReturn ""
		Else
				Pos=pos+1
		endif
		ref.s="0,1,2,3,4,5,6,7,8,9,$A,$B,$C,$D,$E,$F,I,II,III,IV,V,VI,VII,VIII,IX,X,%0,%1"
		For i=pos to CountString(Text.S," ")+1
				extrait.s=StringField(Text.s,i," ")
				;debug extrait.s
				For b=1 to countstring(Ref.s,",")+1			
						if FindString(extrait.s,StringField(ref.s,b,","))>0
								pos=i
								ProcedureReturn StringField(Text.s,pos," ")
						Endif
				Next b
		Next i
EndProcedure
;Epb

[reedit]
j'ai ajouté un parametre de reset pour remettre le pointeur de recherche (variable static 'Pos' ) a zero
pour permettre une nouvelle recherche a partir du debut de la phrase