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 -

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
fini les . et , multiples les signes - intempestifs
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