J'ai trouvé une solution, et dans le but de cette question, je vais fournir une réponse complète pour ceux qui ont ce problème dans le futur. J'ai d'abord créé une nouvelle classe d'assistance appelée NumberFormatting et créé deux méthodes.
//
// NumberFormatting.h
// Created by Noah Hendrix on 12/26/09.
//
#import <Foundation/Foundation.h>
@interface NumberFormatting : NSObject {
}
-(NSString *)stringToCurrency:(NSString *)aString;
-(NSString *)decimalToIntString:(NSDecimalNumber *)aDecimal;
@end
et est ici le fichier de mise en œuvre:
//
// NumberFormatting.m
// Created by Noah Hendrix on 12/26/09.
//
#import "NumberFormatting.h"
@implementation NumberFormatting
-(NSString *)stringToCurrency:(NSString *)aString {
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setGeneratesDecimalNumbers:YES];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
if ([aString length] == 0)
aString = @"0";
//convert the integer value of the price to a decimal number i.e. 123 = 1.23
//[currencyFormatter maximumFractionDigits] gives number of decimal places we need to have
//multiply by -1 so the decimal moves inward
//we are only dealing with positive values so the number is not negative
NSDecimalNumber *value = [NSDecimalNumber decimalNumberWithMantissa:[aString integerValue]
exponent:(-1 * [currencyFormatter maximumFractionDigits])
isNegative:NO];
return [currencyFormatter stringFromNumber:value];
}
-(NSString *)decimalToIntString:(NSDecimalNumber *)aDecimal {
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setGeneratesDecimalNumbers:YES];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
if (aDecimal == nil)
aDecimal = [NSDecimalNumber zero];
NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithMantissa:[aDecimal integerValue]
exponent:([currencyFormatter maximumFractionDigits])
isNegative:NO];
return [price stringValue];
}
@end
La première méthode, stringToCurrency, prendra un nombre entier (passé à partir d'un champ de texte dans ce cas) et le convertir en une valeur décimale en utilisant déplacer le point décimal en fonction des paramètres régionaux des utilisateurs. Il renvoie ensuite une représentation de chaîne formatée en tant que devise à l'aide de NSNumberFormatter.
La deuxième méthode fait l'inverse, il prend une valeur comme 1.23 et le convertit en 123 en utilisant une méthode similaire.
Voici un exemple de la façon dont je l'ai utilisé
...
self.accountBalanceCell.textField.text = [[NumberFormatting alloc] decimalToIntString:account.accountBalance];
...
[self.accountBalanceCell.textField addTarget:self
action:@selector(updateBalance:)
forControlEvents:UIControlEventEditingChanged];
Ici nous définissons la valeur du champ de texte à la valeur décimale de la banque de données, puis nous avons fixé un observateur à surveiller les changements au texte champ et exécutez la méthode updateBalance
- (void)updateBalance:(id)sender {
UILabel *balanceLabel = (UILabel *)[accountBalanceCell.contentView viewWithTag:1000];
NSString *value = ((UITextField *)sender).text;
balanceLabel.text = [[NumberFormatting alloc] stringToCurrency:value];
}
qui prend simplement la valeur textfield et l'exécuter par la méthode de stringToCurrency décrit ci-dessus.
Pour moi, cela semble hackish alors s'il vous plaît prendre le temps de regarder et de le nettoyer si vous êtes intéressé à l'utiliser. Aussi je remarque pour les grandes valeurs que ça casse.
J'ai examiné, mais il faudra 123 et le convertir en 123,00 $ quand l'idée est de Convertissez-le en $ 1.23 –
Peut-être pourriez-vous lire la longueur de la chaîne et, en tenant compte des paramètres régionaux, la convertir en 1,23 - formaté comme 1,23 $ - au lieu de 123,00, formaté comme $ 123.00. –
Par exemple, vous pouvez appeler '-currencyDecimalSeparator' et' -currencyGroupingSeparator' sur le NSNumberFormatter pour savoir comment gérer la mise en forme. –