2012-11-14 34 views
5

我的目标很简单,我有一个文本框存储本地化的货币值($ 1,000.00例如),我需要得到该值从文本框为float回到上进行一些测试文本字段。转换货币字符串到浮在Objective-C

的代码是非常简单的,首先我格式化的NSNumber到localizedString像这样:

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

一切工作正常,但后来我却反其道而行之,从这个本地化的字符串得到的doubleValue:

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

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

的问题是,格式化只返回我的字符串的整数值,而不是小数,更糟的是,如果它是一个加拿大localizedstring(20 000,00 $),它只返回20

我一直在寻找了一段时间,并不能找到有关此问题的任何东西。解决方法是在格式化文本字段之前存储NSNumber,然后测试这个nsnumber,但我真的觉得它不漂亮。

+1

可以看到这个[从一个区域设置特定的字符串获得NSDecimalNumber] [1]关于 [1]:http://stackoverflow.com/questions/317311/obtaining-an-nsdecimalnumber-from-a-locale-specific-string –

回答

0

答案,由Giuseppe如指出的,是非常简单的,我抨击我的头靠在墙上的不去想它。

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

如果原始价格串包括货币符号(例如: @“$ 9.99”),那么zvtra的答案是正确的(使用NSNumberFormatter)。 – dornad

3

在斯威夫特,您可以通过区域同样设置为货币格式,然后得到双重做到这一点不强制区域设置标识符为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 
} 
0

轻微的增强zavtra的答案,它返回一个浮子和:

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