2012-11-14 23 views
5

Il mio obiettivo è semplice, ho un campo di testo che memorizza un valore di valuta localizzato ($ 1.000,00 per esempio) e ho bisogno di recuperare quel valore dal campo di testo come un float per eseguire qualche test su il campo di testo.Converti stringa di valuta in float in Objective-C

il codice è molto semplice, per prima cosa formattare il NSNumber ad un LocalizedString come così:

NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init]; 
formatter.locale = [NSLocale currentLocale]; 
formatter.numberStyle = NSNumberFormatterCurrencyStyle; 
textfield.text = [formatter stringFromNumber:number]; 

Tutto funziona bene, ma poi faccio il contrario per ottenere il doubleValue da questa stringa localizzata:

NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init]; 
formatter.locale = [NSLocale currentLocale]; 
formatter.numberStyle = NSNumberFormatterCurrencyStyle; //also tested with NSNumberFormatterDecimalStyle 

double d = [formatter numberFromString:textfield.text].doubleValue; 

il problema è che il formattatore restituisce solo il valore intero della mia stringa e non i decimali, peggio, se si tratta di un LocalizedString canadese (20 000,00 $) restituisce solo 20.

Ho cercato per un po 'di tempo e non riesco a trovare nulla su questo comportamento. La soluzione è, naturalmente, la memorizzazione del NSNumber prima di formarlo nel campo di testo e quindi testare questo nsumero, ma in realtà non lo trovo carino.

+1

Si può vedere questo [Ottenere un NSDecimalNumber da una stringa specifica locale] [1] su [1]: http://stackoverflow.com/questions/317311/obtaining-an-nsdecimalnumber-from-a-locale-specific-string –

risposta

0

La risposta, come indicato da Giuseppe, è davvero semplice e sto sbattendo la testa contro il muro per non pensarci.

double d = [NSDecimalNumber decimalNumberWithString:textfield.text locale:[NSLocale currentLocale]].doubleValue; 
+0

Se la stringa prezzo originale include un segno di valuta (ad esempio: @ "$ 9,99"), quindi la risposta di zvtra è corretta (utilizzando NSNumberFormatter). – dornad

3

In Swift, è possibile farlo impostando allo stesso modo il locale al formato della moneta, e quindi ottenere il doppio:

var locale = NSLocale.currentLocale() 
    var formatter = NSNumberFormatter() 
    formatter.locale = NSLocale(localeIdentifier: "en_US") 
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle 

    var moneyDouble = formatter.numberFromString(textField.text)?.doubleValue 
0

Un leggero miglioramento per la risposta di zavtra che restituisce un galleggiante e non forzare l'identificatore delle impostazioni di essere en_US (Swift 2):

func floatFromTextFieldText() -> Float { 
    let formatter = NSNumberFormatter() 
    formatter.locale = NSLocale.currentLocale() 
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle 
    guard let amount = self.text else { return 0.0 } 
    return formatter.numberFromString(amount)!.floatValue 
}