Что я делаю неправильно в текстовом поле. Закончил редактирование?? Форматирование валюты

Итак, часть кода выглядит так

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    NSNumber *currency = [NSNumber numberWithDouble:[self.SalesAmounttext.text doubleValue]]; 

  self.SalesAmounttext.text = [formatter stringFromNumber:currency];

}

Приведенный выше код означает, что если я введу 499 в текстовое поле, текст будет преобразован в 499,00 долларов США. Если я очистю ВСЕ текстовое поле и повторно введу другое число, скажем, 599, текст будет преобразован в 599,00 долларов США. Все это правильное и ожидаемое поведение.

Однако, если я случайно верну $599,00 только к $ или $5, а затем введу новое число, такое как 509, и покину текстовое поле, мой вывод текстового поля станет равным $0,00. Кто-нибудь знает, что я делаю неправильно?


person user3178926    schedule 11.03.2014    source источник


Ответы (2)


Проблема с:

[self.SalesAmounttext.text doubleValue]

Это дает допустимое значение только в том случае, если текст не имеет форматирования, символа валюты, символов группировки и точки для десятичного разделителя. Если это не все верно, он возвращает 0.

Вам нужно преобразовать существующий текст в double, используя средство форматирования валюты для анализа текста.

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    NSNumber *current = [formatter numberFromString:self.SalesAmounttext.text];
    if (!current) {
        NSNumberFormatter *formatter2 = [[NSNumberFormatter alloc] init];
        current = [formatter2 numberFromString:self.SalesAmounttext.text];
    }

    self.SalesAmounttext.text = [formatter stringFromNumber:current];
}

Вероятно, вам потребуется дополнительная проверка для работы с недопустимыми номерами.

person rmaddy    schedule 12.03.2014
comment
Я только что реализовал ваш код. Теперь все текстовое поле пусто каждый раз, когда я заканчиваю редактирование. - person user3178926; 12.03.2014
comment
Как я уже сказал, вам, вероятно, нужна дополнительная проверка. Скорее всего, если вы просто введете простое число, средство форматирования валюты не сработает. Я немного обновлю свой ответ. - person rmaddy; 12.03.2014
comment
Хорошо, я добавил еще один чек. Это должно обрабатывать значения, которые уже являются действительным значением валюты, а также просто введенные числа. - person rmaddy; 12.03.2014

Метод doubleValue вернет 0, если вы передадите в качестве первого символа что-либо, кроме действительного числа. Из документов:

"Значение с плавающей запятой текста получателя как двойное. Возвращает HUGE_VAL или –HUGE_VAL при переполнении, 0,0 при потере значимости. Возвращает 0,0, если получатель не начинается с допустимое текстовое представление числа с плавающей запятой».

Итак, вы можете сделать что-то вроде:

NSString *newString = [self.SalesAmounttext.text stringByReplacingOccurrencesOfString:@"$" withString:@""];

и передать newString форматировщику.

person JJC    schedule 12.03.2014
comment
Это сложнее, чем это. В зависимости от языкового стандарта пользователя результатом того, что вы предлагаете, может быть что-то вроде 5 000,50 или другого форматированного десятичного числа, которое метод doubleValue не может обработать. - person rmaddy; 12.03.2014