Page 1 sur 2

TypeOf() avec un paramétre sans Data Type

Publié : ven. 11/sept./2015 16:02
par falsam
En JavaScript la fonction TypeOf() renvoie le datatype de la donnée figurant en paramètre.

Par exemple si je debug typeof("test") le résultat sera String. Notez que je ne passe pas une variable.

Vous pouvez voir ce que ça donne en cliquant sur ce lien.
:arrow: http://jsfiddle.net/falsam/xg3acvqs/

En PureBasic ce n'est pas possible. On doit passer obligatoirement un paramètre avec un datatype.

J'ai cherché une solution de contournement mais hélas .... rien.

Peut être que parmi vous quelqu'un a une idée à me proposer. D'avance merci.

Re: TypeOf() avec un paramétre sans Data Type

Publié : ven. 11/sept./2015 16:54
par falsam
Finalement j'ai trouvé en passant par une macro faisant appel à une fonction qui va retourner #PB_Integer ou #PB_Float ou #PB_String.

Mise à jour du 12 Septembre : Ajout #PB_Float

Code : Tout sélectionner

; GetTypeOf(Value)
; Contributor falsam 
;
; PB 4.31 -> 4.40
;

Procedure _GetTypeOf(numstr.s)
  Protected Result, Pattern.s = "^[-+]?[0-9]*\.?[0-9]+$"
  Protected RegEx = CreateRegularExpression(#PB_Any, Pattern)
  If RegEx
    Result = MatchRegularExpression(RegEx, numstr)
    FreeRegularExpression(RegEx)
    If result
      If CountString(numstr, ".") = 1
        ProcedureReturn #PB_Float
      Else
        ProcedureReturn #PB_Integer
      EndIf
    Else
      ProcedureReturn #PB_String
    EndIf
  EndIf
EndProcedure

Macro Quote
  ""
EndMacro

Macro GetTypeOf(Value=)
  _GetTypeOf(Quote + Value + Quote)
EndMacro

Debug GetTypeOf("test") ;String
Debug GetTypeOf("10")   ;Integer
Debug GetTypeOf("10.10");Float
Debug GetTypeOf(10)     ;Integer
Debug GetTypeof(10.10)  ;Float
Debug GetTypeof(-10.10) ;Float
Si vous avez mieux en plus court, bien évidement que je suis preneur.

Re: TypeOf() avec un paramétre sans Data Type

Publié : ven. 11/sept./2015 17:11
par Brayane
Jolie code Falsam, bien joué :wink:

Je pense qu'il est peut être possible d'améliorer mais c'est vraiment bien vue ça :wink:
Merci à toi au passage :)

Re: TypeOf() avec un paramétre sans Data Type

Publié : ven. 11/sept./2015 19:55
par Micoute
J'apprécie aussi beaucoup.

Re: TypeOf() avec un paramétre sans Data Type

Publié : ven. 11/sept./2015 20:04
par Ollivier
Falsam a écrit :Si vous avez mieux en plus court, bien évidement que je suis preneur.
enlève un '+ quote'

Le problème c'est vérifier ce que donne "10", s'il te file un entier, c'est que c'est loopé...

Re: TypeOf() avec un paramétre sans Data Type

Publié : ven. 11/sept./2015 21:06
par falsam
Ollivier a écrit :enlève un '+ quote'
Effectivement ça fonctionne aussi. Ce système de macro m'étonnera toujours.
Ollivier a écrit :Le problème c'est vérifier ce que donne "10", s'il te file un entier, c'est que c'est loopé...
Pas de loupé puisque la fonction retourne bien un string il me semble (Avec ou sans Quote supplémentaire.)

Re: TypeOf() avec un paramétre sans Data Type

Publié : ven. 11/sept./2015 21:58
par Ollivier
Quand j'ai vu les limitations de mix de type, j'ai préféré ignorer cette opération.

C'est pour cette même cause que tu as laissé quelque chose à droite.

En maîtrisant le bug (ou la limitation) tu t'es permis de l'abstraire.

5.22 LTS x86 Ok aussi.

Re: TypeOf() avec un paramétre sans Data Type

Publié : ven. 11/sept./2015 23:20
par falsam
Je suppose que tu as essayé non ? et ça te donne un integer

Re: TypeOf() avec un paramétre sans Data Type

Publié : ven. 11/sept./2015 23:23
par falsam
Spock a écrit :ben c'est pas trop normal , puisque c'est entre guillemets
Surement, mais moi ça me convient bien.

Re: TypeOf() avec un paramétre sans Data Type

Publié : sam. 12/sept./2015 0:11
par Ollivier
Il y a 5 tests à faire :

1) "zzz"
2) "10"
3) zzzi (variable entier)
4) zzzs (var chaîne)
5) 10

2 combinaisons de résultats (chaîne & entier) par test,
Ça fait 32 combinaisons,
soit 32 rings pour vous mettre sur la Gée.

Vu, comme c'est parti, là, déjà, vous avez squatté chacun un ring, soit une combinaison, presque une demi-page.

J'estime donc, en proportion, ce sujet à 16 pages, si l'on ne vous bride pas. Alors je vais ptêt faire l'hôpital qui se fout de la charité, mais trouver une solution de conciliation: focalisons sur la technique.

Une question simple : faut-il 32 macros pour obtenir toutes les solutions de fonctionnement de ce procédé?
Si oui, lesquelles?

Pour vous donner une idée, moi, il me faut une semaine pour trouver ça actuellement en usant du Net.

Autant le faire soi-même, mais là je n'ai pas le temps, il est 1 h du mat. Et je n'aurai pas le temps après.

Donc, penchez-vous sur ça: quelles formes peuvent-elles avoir ces macros? Sont-elles possibles?

En tout cas, bon week.

(PS: Je n'ai pas pensé au dollar '$' qui est une extension de la combinaison 4.)

Re: TypeOf() avec un paramétre sans Data Type

Publié : sam. 12/sept./2015 0:46
par falsam
@Ollivier: Ma problématique de base était juste de savoir si le résultat est String ou Integer en n'ayant que ce type d'exemple

Code : Tout sélectionner

GetTypeOf("Mon application") ;String of course
GetTypeOf(10) ;Integer
GetTypeOf(-10);Integer
GetTypeOf(10.10);Integer
GetTypeOf(-10.10);Integer
GetTypeOf("10") ;Integer
Tes tests 3 et 4 sont hors propos car tu me demandes de tester des variables hors ce n'est pas l'objet de la question initiale de ce topic. L'instruction TypeOf() est dans ce cas plus approprié.
Ollivier a écrit :Pour vous donner une idée, moi, il me faut une semaine pour trouver ça actuellement en usant du Net.
Tu te poses trop de question et tu compliques inutilement une question qui à la base était simple mais peut être mal lu vu l'heure tardive :wink:

Re: TypeOf() avec un paramétre sans Data Type

Publié : sam. 12/sept./2015 11:50
par falsam
Mise à jour : L'instruction Debug n'avait rien à faire dans la macro GetTypeOf(). Code mise à jour.

Re: TypeOf() avec un paramétre sans Data Type

Publié : sam. 12/sept./2015 14:34
par Brayane
Salut,

Code : Tout sélectionner

Debug GetTypeOf("test") ;String
Debug GetTypeOf("10")   ;Integer -> Integer ???????, pas plutôt String ?
Debug GetTypeOf(10)     ;Integer
Debug GetTypeof(10.10)  ;Integer
Debug GetTypeof(-10.10) ;Integer

Abc$ = "Azer"
Def = 123

Debug GetTypeOf(Abc$) ;String
Debug GetTypeOf(Def)  ;Integer

Debug GetTypeOf("Azer" + Str(32) + "Edf") ;String

Jfk$ = "147.258"
Debug GetTypeOf(Str(10 + 25 * 45 / 85 + Val(Jfk$))) ; -> Integer ???????, pas plutôt String ?
; Debug GetTypeOf(10 + 25 * 45 / 85 + Val(Jfk$)) ; Ici fonctionne pas

Re: TypeOf() avec un paramétre sans Data Type

Publié : sam. 12/sept./2015 14:50
par Ollivier
Suite à MàJ:

Code : Tout sélectionner

Debug GetTypeOf("test") ;String (a)
Debug GetTypeOf("10") ;Integer (b)
Debug GetTypeOf(10) ;Integer (c)
Debug GetTypeof(10.10) ;Integer (d)
Debug GetTypeof(-10.10) ;Integer (e)
Lignes (d) et (e) non conformes.
Suggestion a écrit : expression : (a)
number : (b) (c) (d) (e)

Re: TypeOf() avec un paramétre sans Data Type

Publié : sam. 12/sept./2015 14:52
par falsam
Brayane a écrit :Debug GetTypeOf(Str(10 + 25 * 45 / 85 + Val(Jfk$))) ; -> Integer ???????, pas plutôt String ?
Non le contenu est bien un integer bien que encadré par des apostrophes. Voir mon exemple Debug GetTypeOf("10") qui retourne lui aussi un integer.
Brayane a écrit :; Debug GetTypeOf(10 + 25 * 45 / 85 + Val(Jfk$)) ; Ici fonctionne pas
Ben non ça ne fonctionne pas.

Je l'ai signalé dans mon premier message, j'ai cherche une solution de contournement pour répondre à une demande simple. Cette solution de contournement s'apparente pour moi à une rustine en espérant qu'un jour la fonction native TypeOf() répondra à ma question initiale.

Désolé que cette solution ne s'adapte pas forcément à ta demande de calcul.

:idea: Je me sert de ce code pour évaluer des choses simples comme un string (Exemple GetTypeOf("test") )et non pas un integer déguisé en string (Exemple GetTypeOf("10") ) et pour évaluer des simple integer (Exemple GetTypeOf(10) )