Tu cherches à faire quoi au juste, à prendre une chaine qui est une expression mathématique et à calcluer son résultat ? Si c'est le cas j'ai peu qu'il faille un parseur de fonction mathématique (encore pour 1+1 ça va mais si tu demandes des expressions plus complexes avec des parenthèses, du cos et du sin, etc... en général c'est tout un projet)
Il n'y a pas à ma connaissance (mais je peux me trompoer, attention, faut p'tet chercher) de truc tout fait dans Cocoa pour prendre une chaà®ne et calculer son "résultat" mathématiquement parlant, pour le récupérer. Par contre tu peux passer par une NSTask et lancer l'utilitaire en ligne de commande "bc" qui fait très bien ça. Par exemple la commande "echo 1+1 | bc" va te retourner "2"
Merci pour vos réponses. J'ai essayé la classe qui se trouve dans la IB palette de ja. Ca marche bien mais pour des opérations simples. Comme j'ai besoin de faire des choses plus compliquées, je vais soit utiliser le bc de Aligator dans une NSTask, soit une idée que je viens d'avoir: j'utiise dans mon projet le framework Webkit et ce framework a une méthode pour évaluer du javascript.
Alors, le code chez moi marche, mais il ya un pb de linking dans la version sur OC (résolu). Donc si tu veux essayer, je tiens juste à te dire que mon truc est assez lent (surement plus que ce que t'as mis Aligator) mais qu'il marche bien.
Si tu veux la bonne version, demande-moi, je vais pas enbeter hoksitan parce que j'ai fait une betise
T'as bien soupconné Fouf. Sinon, j'ai regardé dans les headers pour voir les différentes méthodes. J'ai l'impression que la classe qui m'intéresse est GMathFormatter;, or justement il n'y a pas de méthode définie dedans. Si c'est bien la classe qui m'intéresse et si tu as une version avec la doc, ça m'arrangerait bien que tu me l'envoie.
Heu elf, quitte à passer par un NSTask pour lancer un utilitaire en ligne de commande, pourquoi prendre un utilitaire comme "Evaluator" (que je ne connais pas, j'ai pas de Mac sous la main là pour télécharger et regarder mais bon) que tu auras à mettre dans ton Bundle, au lieu d'utiliser directement "bc" fourni avec OSX ?
Quand on ne connais pas, on tape "man bc" dans le terminal :P
MATH LIBRARY If bc is invoked with the -l option, a math library is preloaded and the default scale is set to 20. The math functions will calculate their results to the scale set at the time of their call. The math library defines the following functions:
s (x) The sine of x, x is in radians.
c (x) The cosine of x, x is in radians.
a (x) The arctangent of x, arctangent returns radians.
l (x) The natural logarithm of x.
e (x) The exponential function of raising e to the value x.
j (n,x) The bessel function of integer order n of x.
Merci Chaha pour ton scale=0. Par contre, je n'arrive pas à changer ce scale en cours de route. J'ai l'impression qu'on ne peut le définir qu'en début d'expression sans possibilité de le changer. Par exemple, si je veux la partie entière de 6/5 puis que je divise le résultat par 2, j'espère obtenir 0.5 et pas 0. J'ai essayé ça : "scale=0;a=6/5;scale=8;a/2" mais apparemment le scale reste bloqué à 0. J'ai peut-être mal lu la doc mais je ne vois pas comment faire.
Réponses
regarde le projet "Busy Palette" dans les exemples d'IB ; il contient un formatteur qui fait ce que tu cherches.
Si c'est le cas j'ai peu qu'il faille un parseur de fonction mathématique (encore pour 1+1 ça va mais si tu demandes des expressions plus complexes avec des parenthèses, du cos et du sin, etc... en général c'est tout un projet)
Il n'y a pas à ma connaissance (mais je peux me trompoer, attention, faut p'tet chercher) de truc tout fait dans Cocoa pour prendre une chaà®ne et calculer son "résultat" mathématiquement parlant, pour le récupérer.
Par contre tu peux passer par une NSTask et lancer l'utilitaire en ligne de commande "bc" qui fait très bien ça.
Par exemple la commande "echo 1+1 | bc" va te retourner "2"
Comme j'ai besoin de faire des choses plus compliquées, je vais soit utiliser le bc de Aligator dans une NSTask, soit une idée que je viens d'avoir: j'utiise dans mon projet le framework Webkit et ce framework a une méthode pour évaluer du javascript.
http://www.objective-cocoa.org/index.php?p=ressource_detail&id=13.
Alors, le code chez moi marche, mais il ya un pb de linking dans la version sur OC (résolu). Donc si tu veux essayer, je tiens juste à te dire que mon truc est assez lent (surement plus que ce que t'as mis Aligator) mais qu'il marche bien.
Si tu veux la bonne version, demande-moi, je vais pas enbeter hoksitan parce que j'ai fait une betise
Sinon, j'ai regardé dans les headers pour voir les différentes méthodes. J'ai l'impression que la classe qui m'intéresse est GMathFormatter;, or justement il n'y a pas de méthode définie dedans. Si c'est bien la classe qui m'intéresse et si tu as une version avec la doc, ça m'arrangerait bien que tu me l'envoie.
C'était aussi fouf qui avait la solution d'ailleur!
http://www.objective-cocoa.org/forum/index.php?topic=1016.0
Télécharge le fichier lié et ajoute le à ton projet (après l'avoir dézippé)!
Ajoute les variables d'instances:
Initialisation
Pour donner l'opération (ou operation est la NSString qui contient ton opération):
Pour récupérer le résultat il faut implémenter cette méthode:
En gros, voilà comment faire!
[Fichier joint supprimé par l'administrateur]
Il manque quand même la possibilité d'avoir la partie entière d'un nombre décimal. Je croyais que ce genre d'opération de base y serait mais non.
En fait, si, ça y est en jouant sur la variable "scale".
>scale=0
>1.234/1
1
>1.678/1
1
ça donne la partie entière. Et pour arrondir, on rajoute simplement 0.5
>(1.678+.5)/1
2
Mais pour les nombres négatifs, faut faire gaffe.
+
Chacha
je ne connais pas :X
Par exemple, si je veux la partie entière de 6/5 puis que je divise le résultat par 2, j'espère obtenir 0.5 et pas 0.
J'ai essayé ça : "scale=0;a=6/5;scale=8;a/2" mais apparemment le scale reste bloqué à 0.
J'ai peut-être mal lu la doc mais je ne vois pas comment faire.
Tu peux te définir une fonction qui rendra la partie entière dans bc : Et ensuite faire des calculs avec :
[tt]scale=10; ent(6/5)/2;[/tt]