Conversion de chaine en double - Pb de séparateur

LeChatNoirLeChatNoir Membre, Modérateur
06:53 modifié dans API AppKit #1
Slt,
Je charge des taux de change à  partir d'un fichier.
Ces taux sont récupérer dans un premier temps dans une NSString et sont du style 1.23 ou 2.32.
Mais y a certaines devises dont le taux dépasse 999. Et là , on a une chaine du style 1,236.23 ou la virgule est le séparateur de milliers.

Quand je fais un floatValue, ca me vire tout ce qui est derrière la virgule... Pourtant dans les prefs par défaut, la virgule est bien le séparateur de milliers...
J'ai regardé NSScanner et NSFormater mais j'ai l'impression que ça va pas m'aider...

Y a til une solution imple ou faut il faire péter cette virgule à  la mimine ?

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur
    06:53 modifié #2
    Bon finalement, j'ai fait une fonction pourrie qui me permet de virer ces virgules indésirables :

    -(NSString *)recupererChaine:(NSString *)source epurerDuPremier:(char)caracteresrencontre
    {
    NSRange range=source stringByTrimmingCharactersInSet:[NSCharacterSet <br /> whitespaceCharacterSet rangeOfString:@,];

    if (range.location==NSNotFound)
    {return source;}
    //Sinon, on a trouvé, donc on vire
    return source substringToIndex:range.location] stringByAppendingString:<br /> [source substringFromIndex:range.location+1;
    }


    Mais il doit y avoir mieux non ?
    Qqu'un a-t-il la solution ?
  • mpergandmpergand Membre
    décembre 2004 modifié #3
    salut,

    en java je sais faire:
    <br /> try {<br />		 Number number = <br />		 NumberFormat.getNumberInstance(Locale.US).parse(&quot;1,234.56&quot;);<br />		 <br />		 System.out.println(number.floatValue()); // 1234.56<br />           <br />  } catch (ParseException e) {}<br />
    


    l'équivalent en carbon pourrait être ça:
    CFNumberFormatterGetValueFromString

    [edit]
    une piste en cocoa NSNumberFormatter mais j'suis pas sûr :(

    Good luck ;D

    ouais super les nouveaux smileys <3 <br />
    ;D :o :kicking:
  • BruBru Membre
    décembre 2004 modifié #4
    Moi, j'utiliserai plutôt un NSDecimalNumber pour récupérer la valeur d'une chaà®ne représentant une valeur décimale.

    .
  • Eddy58Eddy58 Membre
    décembre 2004 modifié #5

    une piste en cocoa NSNumberFormatter mais j'suis pas sûr

    Les objets de classe NSFormatter sont fait pour interagir avec des NSCell ou NSControl, donc je pense pas que ça puisse être utilisable dans son cas...


    Moi, j'utiliserai plutôt un NSDecimalNumber pour récupérer la valeur d'une chaà®ne représentant une valeur décimale.

    Le problème est qu'ici la conversion de la NSString en NSDecimalNumber risque de donner quelque chose d'inadapté, avec la virgule et le point en même temps dans la string, mais en effet ca vaut le coup d'être essayé. :)

    Sinon il y a NSCharacterSet et NSMutableCharacterSet, qui permettent d'autres types d'opérations sur les strings.... :o
  • mpergandmpergand Membre
    06:53 modifié #6
    Moi, j'utiliserai plutôt un NSDecimalNumber pour récupérer la valeur d'une chaà®ne représentant une valeur décimale.


    bien vu !

    euh, y a un os ?

    The following strings are unacceptable:
    "2,500.6" :-\\
    "2500 3/5"
    "2.5006x10e3"
  • Eddy58Eddy58 Membre
    06:53 modifié #7
    dans 1102100466:

    The following strings are unacceptable:
    "2,500.6" :-\\
    "2500 3/5"
    "2.5006x10e3"

    Oui c'est bien ce que je pensais, pour arriver à  ses fins dans un tel cas, on ne peut guere utiliser de formatter ou de convertisseurs, il faut modifier la string en elle meme en la scannant, je pense que la méthode "pourrie" ;) que LeChatNoir s'est faites est très correcte... :) 8)
  • BruBru Membre
    06:53 modifié #8
    Bon, puisque que NSDecimalNumber n'accepte pas le séparateur des milliers, alors utilisons le NSNumberFormatter qui lui peut le gérer :

    <br />{<br />    NSString *entree, *erreur;<br />    NSNumberFormatter *format;<br />    id resultat_obj;<br />    BOOL ok;<br />    double resultat_num;<br /><br />    entree=@&quot;123,456.789&quot;;<br /><br />    // création et initialisation du NSFormatter<br />    format=[[[NSNumberFormatter alloc] init] autorelease];<br />    [format setAllowsFloats:YES];<br />    [format setDecimalSeparator:@&quot;.&quot;];<br />    [format setThousandSeparator:@&quot;,&quot;];<br />    [format setHasThousandSeparators:YES];<br /><br />    // conversion de la NSString contenant le nombre en objet de type NSValue<br />    // (ici sans doute un NSNumber ou NSDecimaNumber car y&#39;a un setAllowsFloats:YES)<br />    ok=[format getObjectValue:&amp;resultat_obj forString:entree errorDescription:&amp;erreur];<br /><br />    // enfin récupération du résultat ou d&#39;une erreur si la conversion est impossible.<br />    if (ok)<br />    {<br />        resultat_num=[resultat_obj doubleValue];<br />        NSLog(@&quot;resultat : %f&quot;, resultat_num);<br />    }<br />    else NSLog(@&quot;erreur %@&quot;, erreur);<br />}<br />
    


    .
  • BruBru Membre
    06:53 modifié #9
    dans 1102100143:

    Les objets de classe NSFormatter sont fait pour interagir avec des NSCell ou NSControl, donc je pense pas que ça puisse être utilisable dans son cas...


    Quoi, les NSFormatter réservés pour les NSCells ?

    Non, tu peux utiliser cette classe pour tout ce que tu veux dès l'instant où tu utilises correctement les méthodes de cette classe.

    Ici, c'est finalement la meilleure solution (bien vu mpergand !).

    Un formatter fait 2 choses :
    - utilise une NSString pour créer un object conforme à  ce que représente la chaà®ne.
    - utilise un objet pour créer une NSString qui est la représentation visuelle du contenu de l'objet.

    Ici, il faut utiliser la première méthode...

    .
  • mpergandmpergand Membre
    06:53 modifié #10
    bru

    trop sympa de bosser pour nous, même le week end :)
  • Eddy58Eddy58 Membre
    06:53 modifié #11
    Oui trop cool :)
    On en apprend tout les jours ! :adios!: :rose!:
Connectez-vous ou Inscrivez-vous pour répondre.