2012-11-14 71 views
5

Mục tiêu của tôi là đơn giản, tôi có một trường text lưu trữ một giá trị tiền tệ địa phương (ví dụ $ 1,000.00) và tôi cần lấy lại giá trị đó từ trường văn bản như một phao để thực hiện một số kiểm tra textfield.Chuyển đổi chuỗi tiền tệ thành float trong Objective-C

Mã này là thực sự đơn giản, đầu tiên tôi định dạng NSNumber đến một localizedString như vậy:

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

Tất cả mọi thứ hoạt động tốt, nhưng sau đó tôi làm ngược lại để có được những doubleValue từ chuỗi này cục bộ:

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

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

vấn đề là các định dạng chỉ trả về giá trị số nguyên của chuỗi của tôi và không phải là số thập phân, tồi tệ hơn, nếu nó là một localizedstring canadian (20 000,00 $) nó chỉ trả về 20.

Tôi đã tìm kiếm một thời gian và không thể tìm thấy bất kỳ điều gì về hành vi này. Cách giải quyết tất nhiên là lưu trữ NSNumber ngay trước khi định dạng nó thành textfield và sau đó thử nghiệm số nsnumber này, nhưng tôi thực sự không thấy nó đẹp.

+1

Bạn có thể thấy điều này [Lấy một NSDecimalNumber từ một chuỗi cụ thể locale] [1] về [1]: http://stackoverflow.com/questions/317311/obtaining-an-nsdecimalnumber-from-a-locale-specific-string –

Trả lời

0

Câu trả lời, như được chỉ dẫn bởi Giuseppe, rất đơn giản và tôi đang đập đầu vào tường để không nghĩ về nó.

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

Nếu chuỗi giá gốc của bạn bao gồm một dấu hiệu tiền tệ (ví dụ: @ "$ 9,99"), sau đó câu trả lời của zvtra là chính xác (Sử dụng NSNumberFormatter). – dornad

3

Trong Swift, bạn có thể làm điều này bằng cách tương tự như thiết lập miền địa phương sang định dạng của đồng tiền, và sau đó nhận được gấp đôi:

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

Một cải tiến nhỏ để trả lời zavtra rằng trả về một phao và không buộc các định miền địa phương được 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 
} 
Các vấn đề liên quan