String numérique décimal

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

String numérique décimal

Message 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
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: String numérique décimal

Message par Micoute »

Très bon, j'adore, merci d'avoir partagé.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: String numérique décimal

Message 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 !
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: String numérique décimal

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: String numérique décimal

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: String numérique décimal

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: String numérique décimal

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
case
Messages : 1528
Inscription : lun. 10/sept./2007 11:13

Re: String numérique décimal

Message 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


ImageImage
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: String numérique décimal

Message 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.
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: String numérique décimal

Message 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

Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: String numérique décimal

Message 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
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre