2013-04-20 51 views
14

Ho provato a convertire una NSString come "12000.54" in "12.000,54". Ho scritto un'istanza NSNumberFormatter.NSNumberFormatter con separatore decimale virgola

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

Ma quando ho NSLog questo:

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

Esso stampa valore nullo. Se cambio la mia virgola con un punto funziona correttamente. Vorrei solo essere in grado di mettere quello che voglio per il mio campo separatori (virgola, punto, barra, ecc ...) e ho diversi output: 12/000,54 12.000,54 12.000,54 per esempio.

Sai come posso gestirlo?

+2

Forse ho trovato il problema . Devo usare un altro NSFormatter per rendere prima il mio numeroFromString.Ho votato per chiudere il mio post – Pierre

+2

Non chiuderlo, inserire la risposta da soli e verificarlo, altri avranno lo stesso problema in futuro. –

+0

Concorrere con @DavidH. La domanda è valida e completa con il codice e le informazioni necessarie. In realtà sto svalutando :-) – LSerni

risposta

20

Quindi la domanda è valida: Sto rispondendo io stesso :)

Ho un valore decimale leggere da SQLite (per esempio 12000 o 12.000,54) direttamente trasformato in NSString. Devo usare un separatore diverso ad un certo punto nel mio codice.

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 

Problema risolto.

+1

Puoi anche usare la proprietà 'doubleValue' di' NSString'. – Kevin

37

Si consiglia di non codificare il separatore per garantire il corretto comportamento del separatore in base alle impostazioni internazionali di iPhone. Il modo più semplice per questo è:

usando 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 

utilizzando SWIFT 3

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 

e non vorrei usare il var-name "numberFromString", perché è un metodo NSNumberFormatter. Buona fortuna!

+0

Risposta super, grazie – Mutawe

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

Questo problema consente di risolvere il problema di arrotondamento in caso di punti decimali.

6

La soluzione più semplice Recentemente ho trovato è:

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

funziona anche con interi:

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

verificata in Xcode 6 parco giochi. Ma i documenti dicono che questa funzione è sempre esistita.

+0

risposta semplice funziona ..! –

0

Per uso moneta ...

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 

Esempio utilizzo:

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

rendimenti ...

"$ 12,345.68" 

come ci si aspetterebbe