2009-08-27 8 views
4

Je vais avoir du mal avecComment créer un environnement local personnalisé avec une valeur NSDecimalSeparator personnalisée?

+ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString locale:(NSDictionary *)locale 

Parce que je veux fournir des valeurs de très haute précision par programmation de ne pas avoir des erreurs à virgule flottante au départ, la pomme me donne la seule option de compter sur un lieu bancal.

Ainsi, la documentation dit assez chiffré:

Paramètres: ... locale Un dictionnaire qui définit les paramètres régionaux (en particulier le NSDecimalSeparator) à utiliser pour interpréter le nombre dans NumericString.

Discussion Le paramètre locale détermine si le NSDecimalSeparator est une période (comme il est utilisé, par exemple, en aux États-Unis) ou une virgule (comme utilisé, par exemple, en France).

bien, après avoir cherché NSDecimalSeparator dans les documents, rien trouvé. Recherche sur le net, a constaté que cette chose est "obsolète". Donc, actuellement, je fais quelque chose de dangereux comme ceci:

NSLocale *usLoc = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:str locale:usLoc]; 

Alors je me demande: S'ils ont vraiment besoin de ce lieu bancal pour quelque chose de crucial comme celui-ci (j'ajouter des chaînes par programmation, aucune entrée d'utilisateur), je ne pourrais pas créer en quelque sorte un propre lieu? Ce paramètre nécessite un NSDictionary, donc l'idée:

Puis-je créer un NSMutableDictionary à partir de ce dictionnaire local qui vient pour -initWithLocaleIdentifier: @ "en_US", puis éditer ce%? & §! Champ NSDecimalSeparator?

Et une autre chose qui soulève mes maux de tête: Pourquoi le paramètre demande un NSDictionary, où je dois passer un objet NSLocale? Ou mon code est-il faux? (non testé, puisque mon application est actuellement complètement foirée ;-))

+0

aucune réponse à cette question? J'ai une question similaire sur la création du NSDictionary qui doit tenir et NSLocale – Meltemi

Répondre

5

Il ne semble pas y avoir un moyen d'ajouter/modifier les valeurs dans une instance de NSLocale; vous ne pouvez obtenir que les paramètres régionaux logiques de l'utilisateur (currentLocale et autoupdatingCurrentLocale), les paramètres régionaux du système sans aucune modification apportée par l'utilisateur dans ses préférences système (systemLocale) ou tout autre paramètre régional nommé que le système connaît (initWithLocaleIdentifier).

NSLocale répond au message objectForKey:, qui est le même message que NSDictionary utilise; C'est pourquoi vous pouvez utiliser un NSLocale même si la méthode appelle un NSDictionary. Puisque NSDecimalNumber ne va probablement regarder qu'une seule valeur, NSDecimalSeparator, j'ai le sentiment que vous pourriez vous en tirer en créant un objet NSDictionary avec cette clé et le passer comme le paramètre locale, mais cela pourrait se casser dans le futur, puisque NSDecimalNumber attend un pleine instance NSLocale et pourrait être changé pour vérifier d'autres clés.

Vous créez ces chaînes par programme, non? Vous pouvez donc contrôler le séparateur décimal que vous utilisez.Ma recommandation serait d'utiliser ., et obtenir en_US:

NSLocale *us = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 

Le séparateur décimal est sûr d'être . chaque fois.

Questions connexes