2014-01-12 111 views
1

我有一個UITextField在我的應用程序只接收來自用戶的數字輸入。此數字輸入表示貨幣並且具有默認值0.00。爲貨幣格式UITextField

我想創建一個類似於掩碼的東西來格式化用戶輸入數字時的UITextField。例如:

9成爲$ 0.09 99變成$ 0.99 999變成$ 999,99

下面的代碼的偉大工程,但我使用的整數和浮點值的應用程序最終會顯示錯誤重視某一點。例如:

999999999變得億

這是因爲海軍報和整數都不夠精確和NSDEcimalNumber應該使用。關鍵是我無法弄清楚如何將我的整數和浮點值替換爲NSDecimalNumber。

有沒有人可以幫我解決這個問題?我花了一些時間在網絡上尋找解決方案,但沒有找到適合我需求的問題,還有大量問題相同的人。

繼承人的代碼:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
if (textField.tag == 1){ 
    NSString *cleanCentString = [[textField.text componentsSeparatedByCharactersInSet: [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""]; 
    NSInteger centValue= cleanCentString.integerValue; 

    if (string.length > 0) 
    { 
     centValue = centValue * 10 + string.integerValue; 
    } 
    else 
    { 
     centValue = centValue/10; 
    } 

    NSNumber *formatedValue; 
    formatedValue = [[NSNumber alloc] initWithFloat:(float)centValue/100.0f]; 
    NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init]; 
    [_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
    textField.text = [_currencyFormatter stringFromNumber:formatedValue]; 
    return NO; 
} 

if (textField.tag == 2){ 
    // Nothing for now 
} 

return YES; 
} 
+0

你有一個更大的問題。您假定貨幣以美元等貨幣值的百分之一輸入。例如,日本人不會感到高興,因爲日元只有整個日元。在將數字格式化程序設置爲貨幣形式並查看其設置的小數位數後,您應該詢問數字格式化程序。 – rmaddy

+0

你說得對,rmaddy。後退日誌不斷增加= D – Carlos

+3

就個人而言,我認爲最好讓用戶鍵入一個原始數字,而不是「格式隨時」處理。不要格式化原始數字,直到用戶離開文本字段。作爲一個用戶,當我真的需要小數時,我寧願輸入小數點分隔符。如果我輸入「9」,那麼我的意思是九美元,而不是九美分。如果我想要九分錢,那麼我想輸入'.09'。讓後處理格式爲'0.09'或完成輸入後的任何內容。不要讓我輸入'900'來獲得9美元。但這只是一個意見。 – rmaddy

回答

0

您可以轉換整數或雙/浮點值的字符串由以下幾點:

NSString *str = [@(myInt) stringValue]; 
NSString *str1 = [[NSNumber numberWithFloat:myFloat] stringValue]; 

之後,你可以通過多種方式字符串轉換爲NSDecimalNumber。像:

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"]; 
NSLog(@"%@", number); 
NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:@"100.1" locale:NSLocale.currentLocale]; 
NSLog(@"%@",num); 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setLocale:[NSLocale currentLocale]]; 
NSLog(@"%@", [formatter stringFromNumber:number]); 

NSNumberFormatter將幫助你正確的格式。請閱讀蘋果頁面NSDecimalNumberNSNumberFormatter。 NSNumberFormatter包含一個名爲「配置貨幣格式」的部分。我沒有嘗試,但它似乎可以幫助你。

讓我知道如果這能幫助.. :)

+0

謝謝,拉沙德!這工作良好罰款將值從字符串轉換爲NSDecimalNumber,即使是貨幣。但現在我得到'NSDecimalNumberOverflowException',因爲我這樣做:result = [decimalValue decimalNumberByMultiplyingBy:base];和結果= [decimalValue decimalNumberByDividingBy:base] ;. – Carlos

+0

@carlos >>你解決了這個問題嗎?我正在通過我的答案。所以我只是問。 :) – Rashad

+0

我決定改變一些事情,只是讓用戶鍵入一個原始數字。但是我沒有找到'NSDecimalNumberOverflowException錯誤=/ – Carlos

2

實施UITextFieldDelegate,並添加下一個方法:

斯威夫特:

let currencySign = "$" 

// Adds $ before the text, e.g. "1" -> "$1" and allows "." and "," 
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 
    { 
    var value = textField.text 

    var newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string) 
    var components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890,.").invertedSet) 

    var decimalString = "".join(components) as NSString 
    var length = decimalString.length 

    if length > 0 { 
     value = "\(currencySign)\(decimalString)" 
    } 
    else { 
     value = "" 
    } 
    textField.text = value 
} 

// Formats final value using current locale, e.g. "130,50" -> "$130", "120.70" -> "$120.70", "5" -> "$5.00" 
func textFieldDidEndEditing(textField: UITextField) { 
     var value = textField.text 
     var components = value.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890,.").invertedSet) 
     var decimalString = "".join(components) as NSString 

     let number = NSDecimalNumber(string: decimalString, locale:NSLocale.currentLocale()) 

     var formatter = NSNumberFormatter() 
     formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle 
     formatter.locale = NSLocale.currentLocale() 

     if let formatedValue = formatter.stringFromNumber(number) { 
      textField.text = formatedValue 
     } 
     else { 
      textField.text = "" 
     } 
}