web-dev-qa-db-fra.com

NSNumberFormatter avec séparateur décimal virgule

J'ai essayé de convertir une NSString comme "12000.54" en "12.000,54". J'ai écrit une instance NSNumberFormatter.

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setGroupingSeparator:@"."];
[formatter setDecimalSeparator:@","];

Mais quand je NSLog ceci:

NSLog(@"%@",[formatter stringFromNumber:[formatter numberFromString:value]]);

Il imprime une valeur nulle. Si je change ma virgule avec un point, cela fonctionne correctement. Je voudrais juste pouvoir mettre ce que je veux pour mon champ séparateurs (virgule, point, barre oblique, etc ...) et j'ai différentes sorties: 12/000,54 12.000.54 12.000,54 par exemple.

Savez-vous comment je peux gérer cela?

19
Pierre

La question est donc valable: j'y réponds moi-même :)

J'ai une valeur décimale lue depuis sqlite (par exemple 12000 ou 12000.54) directement transformée en NSString. Je dois utiliser un séparateur différent à un moment donné dans mon code.

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setGroupingSeparator:@""];
[formatter setDecimalSeparator:@"."];

// Decimal values read from any db are always written with no grouping separator and a comma for decimal.

NSNumber *numberFromString = [formatter numberFromString:@"12000.54"]];

[formatter setGroupingSeparator:@" "]; // Whatever you want here
[formatter setDecimalSeparator:@","]; // Whatever you want here

NSString *finalValue = [formatter stringFromNumber:numberFromString];

NSLog(@"%@",finalValue); // Print 12 000,54

Problème résolu.

26
Pierre

Je recommanderais de ne pas coder en dur le séparateur pour garantir le bon comportement du séparateur en fonction des paramètres régionaux de l'iPhone. La façon la plus simple d'y parvenir est:

en utilisant objective-c

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc]init];
numberFormatter.locale = [NSLocale currentLocale];// this ensures the right separator behavior
numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
numberFormatter.usesGroupingSeparator = YES;

// example for writing the number object into a label
cell.finalValueLabel.text = [NSString StringWithFormat:@"%@", [numberFormatter stringForObjectValue:numberFromString]]; // your var name is not well chosen

en utilisant Swift

 let formatter = NumberFormatter()
 formatter.locale = NSLocale.current // this ensures the right separator behavior
 formatter.numberStyle = NumberFormatter.Style.decimal
 formatter.usesGroupingSeparator = true

 // example for writing the number object into a label
 // your variable "numberFromString" needs to be a NSNumber object
 finalValueLabel.text = formatter.string(from: numberFromString)! // your var name is not well chosen

et je n'utiliserais pas le nom de variable "numberFromString" car c'est une méthode NSNumberFormatter. Bonne chance!

42
JFS

La solution la plus simple que j'ai récemment trouvée est:

NSString *localizedString = [NSString localizedStringWithFormat:@"%@", @1234567];

Fonctionne également avec les ints:

NSString *localizedString = [NSString localizedStringWithFormat:@"%d", 1234567];

Vérifié dans l'aire de jeux Xcode 6. Mais les documents disent que cette fonction a toujours existé.

6
mxcl
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
numberFormatter.usesGroupingSeparator = YES;
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumFractionDigits:2];
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.00];`

Cela résoudra votre problème d'arrondi si vous avez affaire à des décimales.

3
Rinku

Pour l'utilisation des devises ...

let numberFormatter = NumberFormatter()

// Produces symbol (i.e. "$ " for en_US_POSIX) and decimal formatting
numberFormatter.numberStyle = .currency

// Produces commas; i.e. "1,234"
numberFormatter.usesGroupingSeparator = true
numberFormatter.groupingSize = 3

Exemple d'utilisation:

let value: Double = 12345.6789
numberFormatter.string(from: value as NSNumber)

rendements ...

"$ 12,345.68"

comme on pourrait s'y attendre

3
Brandon Zacharie