2014-01-12 3 views
1

У меня есть UITextField на моем приложении, которое получает только числовой ввод от пользователя. Этот числовой ввод представляет собой валюту и имеет значение по умолчанию 0,00.Формат UITextField для валюты

Я хотел бы создать что-то вроде маски для форматирования UITextField, поскольку пользователь вводит числа. Например:

9 становится $ 0,09 99 становится $ 0.99 999 становится $ 999,99

ниже код отлично работает, но, как я использую целое и поплавок значения приложения в конечном итоге будет отображаться неправильно значения оцениваются в определенной точке. Например:

999999999 100000000 становится

Это происходит потому, что Flot и целое число, не являются достаточно точными и NSDEcimalNumber должны быть использованы. Дело в том, что я не могу понять, как заменить мои целые числа и значения float на NSDecimalNumber.

Может кто-нибудь может дать мне руку, чтобы решить эту проблему? Я потратил некоторое время на поиск в Интернете решения, но не нашел, что соответствует моим потребностям и множеству людей с той же проблемой.

Heres код:

-(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

Вы имеете большую проблему. Вы считаете, что валюта вводится в 100-х процентах от стоимости валюты, такой как центы. Люди в Японии не будут счастливы, так как японская йена - это всего лишь целая иена, например. Вы должны допросить форматирование чисел после установки его в стиле валюты и посмотреть, сколько десятичных знаков оно настроено для. – rmaddy

+0

Вы правы, rmaddy. Обратный журнал продолжает расти = D – Carlos

+3

Лично я считаю, что лучше просто позволить пользователю вводить необработанное число без обработки «по мере продвижения». Не форматируйте необработанное число, пока пользователь не покинет текстовое поле. Как пользователь, я бы предпочел ввести десятичный разделитель, когда на самом деле хочу десятичное число. Если я наберу «9», то я имею в виду девять долларов, а не девять центов. Если я хочу девять центов, тогда я хочу напечатать '.09'. Пусть формат почтовой обработки равен '$ 0.09' или что-то еще после того, как я наберу. Не заставляйте меня вводить «900», чтобы получить девять долларов. Но это всего лишь одно мнение. – 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 поможет вам с правильным форматированием. Пожалуйста, прочитайте страницу яблок для NSDecimalNumber и NSNumberFormatter. NSNumberFormatter содержит раздел «Настройка формата валюты». Я не пробовал, но это может помочь вам.

Позвольте мне знать, если это помогает .. :)

+0

Спасибо, Рашад! Это сработало prety fine, чтобы преобразовать значения из строки в NSDecimalNumber, даже для валют. Но теперь я получаю «NSDecimalNumberOverflowException», потому что я делаю это: result = [decimalValue decimalNumberByMultiplyingBy: base]; и result = [decimalValue decimalNumberByDividingBy: base] ;. – Carlos

+0

@ carlos >> Вы решили проблему? Я просматривал свои ответы. Поэтому я просто спросил. :) – Rashad

+0

Я решил немного изменить ситуацию и просто позволю пользователю ввести необработанное число. Но я не нашел решения для ошибки NSDecimalNumberOverflowException =/ – Carlos

2

UITextFieldDelegate Внедрение и добавьте следующие методы:

Swift:

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 = "" 
     } 
} 
Смежные вопросы