2010-11-21 33 views
0

Mon application utilise des valeurs monétaires, et je voudrais représenter ces valeurs dans la devise et les formats que l'utilisateur a définis sur son iPhone. Cependant, lors des tests, je semble avoir des problèmes avec le format EURO allemand.Bug avec iPhone Monnaie pour le format Euro avec NSDecimalNumber utilisant NSLocale?

J'ai une méthode qui retourne un nombre décimal (pour stocker dans les données de base) de la chaîne au format monétaire. La chaîne a été formatée par une autre méthode (similaire) en utilisant NSlocale.

J'ai testé avec des paramètres régionaux UK, US, japonais et allemands, jusqu'à présent, seule l'Allemagne a causé des problèmes.

Voici le code, la chaîne étant passé est par exemple: 2,56 €

+ (NSDecimalNumber*)TLCurrencyFormatFromString:(NSString*)strNumber { 


NSNumberFormatter *fmtrCurrencyFromStr = nil; 

fmtrCurrencyFromStr = [[NSNumberFormatter alloc] init]; 
[fmtrCurrencyFromStr setFormatterBehavior:NSNumberFormatterBehavior10_4]; 
[fmtrCurrencyFromStr setLocale:[NSLocale currentLocale]]; 
[fmtrCurrencyFromStr setNumberStyle:NSNumberFormatterCurrencyStyle]; 
[fmtrCurrencyFromStr setGeneratesDecimalNumbers:YES]; 


NSLog(@"Currency Separator: %@", [fmtrCurrencyFromStr decimalSeparator]); //prints a comma 
NSLog(@"Currency Code: %@", [fmtrCurrencyFromStr currencyCode]); //prints EUR 

int currencyScale = [fmtrCurrencyFromStr maximumFractionDigits]; 

NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:currencyScale raiseOnExactness:FALSE raiseOnOverflow:TRUE raiseOnUnderflow:TRUE raiseOnDivideByZero:TRUE]; 

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]]; 

NSLog(@"Currency Number = %@", [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior]); 

return [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior]; 

}

La variable 'currencyNumber' est imprimé comme: -18446912453607470532000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

alors que dans tous les les autres locales, il imprimerait 2.56 pour stocker dans les données de base en tant que NSDecimalNumber.

Répondre

2

Définition de la propriété:

[fmtrCurrencyFromStr setLenient:YES]; 

résout le problème pour la France, l'Allemagne, la Norvège, Royaume-Uni, États-Unis, le Japon, etc ... Je Nambia ne peux pas dire qu'il fixe pour tous parce que havre de paix I » J'ai tout testé, mais de tous ceux que j'ai testés jusqu'ici, ça a marché.

0

Je pense que votre problème est avec la ligne

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]]; 

Essayez de le remplacer par la ligne la plupart du temps équivalent

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber]; 

Vous avez défini generatesDecimalNumbers, donc les deux sont à peu près équivalent sauf pour un cas ennuyeux: nul.

L'envoi d'un message à zéro est garanti de ne rien faire et renvoie 0 pour la plupart des types standard (entiers (sauf les entiers 64 bits sur les anciens 32 bits), virgule flottante, types de pointeurs); il "retourne" de la mémoire non initialisée si la méthode retourne une structure. NSDecimal est une structure.

(La raison sous-jacente est essentiellement que l'exécution ne connaît pas la taille de la structure, donc ne sait pas combien de mémoire à zéro, donc vous obtenez la mémoire "non initialisée" à la place. faire en sorte que v.frame sans v est non nul)

EDIT:. Bien sûr, vous autre problème est pourquoi NSNumberFormatter n'est pas le prix correctement analyse pas. C'est un dur. Je vais essayer de dépouiller le symbole monétaire.

0

J'ai vérifié que sur iOS 4.3 en utilisant le drapeau [formatter setLenient: YES] travaillé pour moi aussi bien en utilisant des euros. Sans ce drapeau, le formateur ne renvoie pas les valeurs correctes pour les Euros.