Page 1 sur 1

String numérique décimal

Publié : mer. 01/sept./2021 10:00
par MLD
Comme le dit Blendman il serait bien que nous fassions profiter la communauté PB de certaine lacunes de celui ci.
J'ai souvent eu besoin d'un string numérique avec des décimales. Alors voici.
Vous pouvez entrez des chiffres positifs ou négatifs. De plus la virgule est transformée en point. Donc utilisable directement par exemple avec ValD.

Code : Tout sélectionner

Enumeration
#Ma_fen:#stringD
EndEnumeration
Procedure String_NumericD(Gadget)   
If Len(GetGadgetText(Gadget)) <> 0 
 SendMessage_(GadgetID(Gadget), #EM_GETSEL, @Debut_Position, @Fin_position)     
  a$ = Mid(GetGadgetText(Gadget),Debut_position,1)
  ValeurASCII = Asc(a$)
  If Len(GetGadgetText(Gadget))> 1 And  ValeurASCII = 45:ValeurASCII = 0:EndIf ;evite de mettre le signe - dans les chiffres
   If ValeurASCII = 46 Or ValeurASCII = 45
     Else
     If ValeurASCII <48 Or ValeurASCII > 57  
      y = Debut_Position
      Texte.s = GetGadgetText(Gadget)
      x = Len(Texte)
      If Mid(Texte,y,1) = "," ; modification d'une virgule en point
       Texte2.s = Left(Texte,y -1) + "." + Right(Texte,x-y)
       SetGadgetText(Gadget,Texte2)
       SendMessage_(GadgetID(Gadget), #EM_SETSEL, x + 1, x + 1) 
      Else
       Texte2.s = Left(Texte,y -1) + Right(Texte,x-y)
       SetGadgetText(Gadget,Texte2)
       SendMessage_(GadgetID(Gadget), #EM_SETSEL, x-1, x-1)    
    EndIf 
  EndIf
 EndIf 
EndIf 
EndProcedure

OpenWindow(#Ma_fen,720,75,660,250,"Ma Fenêtre",#PB_Window_MinimizeGadget)
;Vos gadgets ici
StringGadget(#stringD,45,100,210,30,"",#ES_CENTER)
;
Repeat
  Event = WaitWindowEvent()
  Select Event
   Case #PB_Event_Gadget
    Select EventGadget()
      Case #stringD
        String_NumericD(#stringD)
   EndSelect
  EndSelect 
Until Event  = #PB_Event_CloseWindow
End

Re: String numérique décimal

Publié : mer. 01/sept./2021 14:23
par Micoute
Très bon, j'adore, merci d'avoir partagé.

Re: String numérique décimal

Publié : mer. 01/sept./2021 19:12
par falsam
Micoute a écrit : mer. 01/sept./2021 14:23 Très bon, j'adore, merci d'avoir partagé.
Tu as testé ? Pour moi ça ne fonctionne pas. On peut saisir plusieurs virgules ou plusieurs points !

Re: String numérique décimal

Publié : mer. 01/sept./2021 21:07
par falsam
l'API GetNumberFormat_ (Windows) conjointement avec la structure NUMBERFMT (Windows) permet de définir le masque d'affichage.

NUMBERFMT est défini dans le compilateur et vous trouverez ci-dessous quelques explications sur chacun des membres de cette structure.

-NumDigits : Nombre de chiffres à afficher après la virgule.
-LeadingZero : Si zéro, complète les chiffres après la virgule avec le nombre de zéros spécifié dans NumDigits.
-Grouping : Nombre de chiffres à inclure dans chaque groupe pour les chiffres avant la virgule. (Défaut : 3).
-lpDecimalSep : Caractère à utiliser comme séparateur décimal. (Défaut : ".").
-lpThousandSep : Caractère à utiliser comme séparateur de groupe (Défaut " ").
-NegativeOrder : Valeur représentant l'affichage d'un nombre négatif. Exemple avec le nombre -123.99 :
0 donne (123,99)
1 donne -123,99
2 donne - 123,99
3 donne 123,99-
4 donne 123,99 -

:arrow: En savoir plus sur ce lien https://www.purebasic.fr/french/viewtop ... 63#p169263

Re: String numérique décimal

Publié : jeu. 02/sept./2021 8:21
par Micoute
falsam a écrit : mer. 01/sept./2021 19:12
Micoute a écrit : mer. 01/sept./2021 14:23 Très bon, j'adore, merci d'avoir partagé.
Tu as testé ? Pour moi ça ne fonctionne pas. On peut saisir plusieurs virgules ou plusieurs points !
Je dois bien avouer qu'il m'arrive très rarement de mettre plusieurs séparateurs pour les nombres décimaux.

Re: String numérique décimal

Publié : jeu. 02/sept./2021 16:04
par MLD
Merci Micoute
Pour ma part il m'arrive couramment de mettre plusieurs points ou virgules dans un chiffre et le signe moins a la fin, mais seulement quand je m'adresse aux Martiens, tu sais bien ceux que l'on entend le matin vers 6 H ,qui sont habillés en vert, et qui ont un engin qui clignote orange.
Pour les habitants de la lune, "les lunatiques" j'utilise un autre langage. Quand aux Habitants de Bâle, là ou il y a le fameux trou, je ne t'en parle même pas.

Re: String numérique décimal

Publié : jeu. 02/sept./2021 18:48
par falsam
MLD a écrit : jeu. 02/sept./2021 16:04Quand aux Habitants de Bâle, là ou il y a le fameux trou, je ne t'en parle même pas.
MLD je viens de comprendre d'ou sort ton code ^^ Ha ha ha

Re: String numérique décimal

Publié : jeu. 02/sept./2021 20:59
par case
modification du code de MLD sorti de mon A..s a moi aussi :mrgreen:
fini les . et , multiples les signes - intempestifs

:mrgreen:

allez des bisous a tous ^ ^

Code : Tout sélectionner

Enumeration
#Ma_fen:#stringD
EndEnumeration
Procedure String_NumericD(Gadget)   
If Len(GetGadgetText(Gadget)) <> 0 
 SendMessage_(GadgetID(Gadget), #EM_GETSEL, @Debut_Position, @Fin_position)     
  a$ = Mid(GetGadgetText(Gadget),Debut_position,1)
  ValeurASCII = Asc(a$)
  Texte.s = GetGadgetText(Gadget)
  y = Debut_Position
  x = Len(Texte)      
  Select ValeurASCII 
    Case 45   ;-
      If y>1
         Texte2.s = Left(Texte,y -1) + "" + Right(Texte,x-y)
         SetGadgetText(Gadget,Texte2)
         SendMessage_(GadgetID(Gadget), #EM_SETSEL, x + 1, x + 1) 
      EndIf
    Case 44,46   ; . ,           
      If CountString(texte,".")=1      ; pas de point dans le nombre        
         Texte2.s = Left(Texte,y -1) + "." + Right(Texte,x-y)
         SetGadgetText(Gadget,Texte2)
         SendMessage_(GadgetID(Gadget), #EM_SETSEL, x + 1, x + 1) 
      Else
         Texte2.s = Left(Texte,y -1) + "" + Right(Texte,x-y)
         SetGadgetText(Gadget,Texte2)
         SendMessage_(GadgetID(Gadget), #EM_SETSEL, x + 1, x + 1) 
      EndIf      
    Case 48 To 57 ; numeric
          Texte2.s = texte
          SetGadgetText(Gadget,Texte)
          SendMessage_(GadgetID(Gadget), #EM_SETSEL, x + 1, x + 1)       
       Default ; not numeric
         Texte2.s = Left(Texte,y -1) + "" + Right(Texte,x-y)
         SetGadgetText(Gadget,Texte2)
         SendMessage_(GadgetID(Gadget), #EM_SETSEL, x + 1, x + 1)    
  EndSelect 
  EndIf 

EndProcedure

OpenWindow(#Ma_fen,720,75,660,250,"Ma Fenêtre",#PB_Window_MinimizeGadget)
;Vos gadgets ici
StringGadget(#stringD,45,100,210,30,"",#ES_CENTER)
;
Repeat
  Event = WaitWindowEvent()
  Select Event
   Case #PB_Event_Gadget
    Select EventGadget()
      Case #stringD
        String_NumericD(#stringD)
   EndSelect
  EndSelect 
Until Event  = #PB_Event_CloseWindow
End



Re: String numérique décimal

Publié : ven. 03/sept./2021 9:02
par MLD
Bonjour case
Très bien, moi aussi j'évite les point multiples ou virgules, mais en dehors de la procédure principale. Le but est d'avoir une procédure de base en remplacement du string numérique de PB.
Merci pour ta contribution constructive.

Re: String numérique décimal

Publié : lun. 06/sept./2021 10:52
par MLD
Bonjour a tous.
J'ai pris le temps d'optimisé un peu le code. Si chiffre négatif, le signe - devra être inscrit en premier avant les chiffres. La virgules est transformé en point. Impossible d'inclure plusieurs points dans les chiffres.

Code : Tout sélectionner

;MLD

Enumeration
#Ma_fen:#stringD
EndEnumeration

Procedure String_NumericD(Gadget) 
If Len(GetGadgetText(Gadget)) <> 0 
 SendMessage_(GadgetID(Gadget), #EM_GETSEL, @Debut_Position, @Fin_position)     
  a$ = Mid(GetGadgetText(Gadget),Debut_position,1)
  ValeurASCII = Asc(a$)
  y = Debut_Position
  Texte.s = GetGadgetText(Gadget)
  x = Len(Texte)
  If Len(GetGadgetText(Gadget))> 1 And  ValeurASCII = 45:ValeurASCII = 0:EndIf ;evite de mettre le signe - dans les chiffres
  If ValeurASCII = 46 Or ValeurASCII = 45 Or ValeurASCII = 44
    If ValeurASCII = 44 
     Texte2.s = Left(Texte,y -1) + "." + Right(Texte,x-y):SetGadgetText(Gadget,Texte2);; modification d'une virgule en point
    EndIf
    If CountString(texte,".")>1:Texte2.s = Left(Texte,y-1) + "" + Right(Texte,x-y):SetGadgetText(Gadget,Texte2) :EndIf   
    SendMessage_(GadgetID(Gadget), #EM_SETSEL, x + 1, x + 1) 
  Else
    If ValeurASCII <48 Or ValeurASCII > 57  
     Texte2.s = Left(Texte,y -1) + Right(Texte,x-y)
     SetGadgetText(Gadget,Texte2)
     SendMessage_(GadgetID(Gadget), #EM_SETSEL, x-1, x-1)    
    EndIf
  EndIf
EndIf 
EndProcedure

OpenWindow(#Ma_fen,720,75,660,250,"Ma Fenêtre",#PB_Window_MinimizeGadget)
;Vos gadgets ici
StringGadget(#stringD,45,100,210,30,"",#ES_CENTER)
;
Repeat
  Event = WaitWindowEvent()
  Select Event
   Case #PB_Event_Gadget
    Select EventGadget()
      Case #stringD
        String_NumericD(#stringD)
   EndSelect
  EndSelect 
Until Event  = #PB_Event_CloseWindow
End


Re: String numérique décimal

Publié : lun. 06/sept./2021 12:19
par Micoute
Merci pour le partage, je l'ai modifié légèrement pour qu'il donne la valeur saisie.

Code : Tout sélectionner

;MLD modifié par Micoute

Enumeration
#Ma_fen:#stringD
EndEnumeration

Global Resultat.D

Procedure.D String_NumericD(Gadget) 
If Len(GetGadgetText(Gadget)) <> 0 
 SendMessage_(GadgetID(Gadget), #EM_GETSEL, @Debut_Position, @Fin_position)     
  a$ = Mid(GetGadgetText(Gadget),Debut_position,1)
  ValeurASCII = Asc(a$)
  y = Debut_Position
  Texte.s = GetGadgetText(Gadget)
  x = Len(Texte)
  If Len(GetGadgetText(Gadget))> 1 And  ValeurASCII = 45:ValeurASCII = 0:EndIf ;evite de mettre le signe - dans les chiffres
  If ValeurASCII = 46 Or ValeurASCII = 45 Or ValeurASCII = 44
    If ValeurASCII = 44 
     Texte2.s = Left(Texte,y -1) + "." + Right(Texte,x-y):SetGadgetText(Gadget,Texte2);; modification d'une virgule en point
    EndIf
    If CountString(texte,".")>1:Texte2.s = Left(Texte,y-1) + "" + Right(Texte,x-y):SetGadgetText(Gadget,Texte2) :EndIf   
    SendMessage_(GadgetID(Gadget), #EM_SETSEL, x + 1, x + 1) 
  Else
    If ValeurASCII <48 Or ValeurASCII > 57  
     Texte2.s = Left(Texte,y -1) + Right(Texte,x-y)
     SetGadgetText(Gadget,Texte2)
     SendMessage_(GadgetID(Gadget), #EM_SETSEL, x-1, x-1)    
    EndIf
  EndIf
EndIf
ProcedureReturn ValD(GetGadgetText(Gadget))
EndProcedure

OpenWindow(#Ma_fen,720,75,660,250,"Ma Fenêtre",#PB_Window_MinimizeGadget)
;Vos gadgets ici
StringGadget(#stringD,45,100,210,30,"",#ES_CENTER)
;
Repeat
  Event = WaitWindowEvent()
  Select Event
   Case #PB_Event_Gadget
    Select EventGadget()
      Case #stringD
        Resultat = String_NumericD(#stringD)
   EndSelect
  EndSelect 
Until Event  = #PB_Event_CloseWindow
End