Что лучший способ состоит в том, чтобы ввести числовые значения с десятичными точками?

51
задан CVertex 13 February 2011 в 00:24
поделиться

6 ответов

Более изящное решение, оказывается, также является самым простым.

Вам не нужен десятичный ключ разделителя

Почему? Поскольку можно просто вывести его из входа пользователя. Например, в американской локали, когда Вы, что войти в 1,23$, Вы запускаете путем ввода номеров 1-2-3 (в том порядке). В системе, поскольку каждый символ вводится, это было бы распознано как:

  • пользователь входит 1: 0,01$
  • пользователь входят 2: 0,12$
  • пользователь входят 3: 1,23$

Уведомление, как мы вывели десятичный разделитель на основе входа пользователя. Теперь, если бы пользователь хочет войти в 1,00$, они просто ввели бы номера 1-0-0.

Для Вашего кода для обработки валют различной локали, необходимо получить максимальные дробные цифры валюты. Это может быть сделано со следующим фрагментом кода:

NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
int currencyScale = [currencyFormatter maximumFractionDigits];

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

Этот подход к проблеме позволяет Вам использовать запас числовая входная клавиатура, обеспеченная Apple без головных болей пользовательских клавиатур, regex проверка, и т.д.

49
ответ дан shek 7 November 2019 в 09:55
поделиться

Я хотел сделать точно то же самое, кроме с валютами, а не прямыми десятичными значениями.

я закончил тем, что создал пользовательское представление, которое содержит UITextField и UILabel. Маркировка покрывает текстовое поле, но текстовое поле все еще получает касания. Я использую уведомление UITextFieldTextDidChange для наблюдения изменений в текстовом поле (и я использовал NSNumberFormatter для превращения получающегося числа в отформатированное значение валюты) обновить маркировку.

Для отключения лупы, которая позволяет пользователю менять местоположение точки вставки необходимо будет использовать пользовательский подкласс UITextField и переопределить touchesBegan:withEvent: и набор это, чтобы ничего не сделать.

Мое решение могло бы отличаться от того, в чем Вы нуждаетесь, потому что десятичная точка всегда фиксируется - я использую установку валюты системы для определения, сколькими там цифры должны быть после десятичной точки. Однако цифровая клавиатура не имеет десятичной точки на нем. И Вы не можете добавить кнопки к клавиатуре (который особенно ухудшает, потому что существует пустая кнопка в нижнем левом углу клавиатуры, которая идеально подошла бы для десятичной точки!), Таким образом, у меня нет решения для этого, к сожалению.

3
ответ дан Alex 7 November 2019 в 09:55
поделиться

В зависимости от определенного приложения, обеспечивая ползунок, из которого пользователь может выбрать положение, мог бы быть лучший выбор на iPhone. Тогда никакие цифры не должны быть введены вообще.

2
ответ дан Martin v. Löwis 7 November 2019 в 09:55
поделиться

Можно хотеть использовать ползунок (как предложил Martin против LГ¶wis) или UIPickerView с отдельным колесом для каждой из цифр.

2
ответ дан Jeroen Heijmans 7 November 2019 в 09:55
поделиться

Вот пример решения, предложенного в принятом ответе. Это не работает с другими валютами или чем-то еще - в моем случае мне нужна была поддержка только для долларов, независимо от региона / валюты, поэтому для меня это было нормально:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
    replacementString:(NSString *)string {

    double currentValue = [textField.text doubleValue];
    //Replace line above with this
    //double currentValue = [[textField text] substringFromIndex:1] doubleValue];
    double cents = round(currentValue * 100.0f);

    if ([string length]) {
        for (size_t i = 0; i < [string length]; i++) {
            unichar c = [string characterAtIndex:i];
            if (isnumber(c)) {
                cents *= 10;
                cents += c - '0'; 
            }            
        }
    } else {
        // back Space
        cents = floor(cents / 10);
    }

    textField.text = [NSString stringWithFormat:@"%.2f", cents / 100.0f];
    //Add this line
    //[textField setText:[NSString stringWithFormat:@"$%@",[textField text]]];
    return NO;
}

Раунды и минимумы важны а) из-за плавающего- точечное представление иногда теряет 0,00001 или что-то еще и б) строку формата, округляющую любую точность, которую мы удалили в части возврата.

12
ответ дан 7 November 2019 в 09:55
поделиться

Я построил собственный контроллер представления цифровой панели с десятичной точкой ... проверьте это:

http://sites.google .com / site / psychopupnet / iphone-sdk / tenkeypadcustom10-keypadwithdecimal

2
ответ дан 7 November 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: