UIKeyboardTypeDecimalPad — изменить запятую на точку

#iphone #decimal

#iPhone #десятичная

Вопрос:

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

 myTextField.keyboardType=UIKeyboardTypeDecimalPad;
  

Как я могу изменить разделитель запятой на точку?

У меня финский язык. Десятичные дроби с запятой не работают в моем приложении.

 -(IBAction)calculate {
    float x = ([paino.text floatValue]) / ([pituus.text floatValue]) *10000;    
    label.text = [[NSString alloc] initWithFormat:@"%0.02f", x];
}
  

Комментарии:

1. Десятичный разделитель зависит от текущего языкового стандарта. На моем iPhone у меня немецкий язык и десятичная запятая, в симуляторе — американский язык и разделитель точек, так что, похоже, это работает. На вашем устройстве выбран другой язык (или симулятор — вы не сказали, где это происходит)?

2. Да, в симуляторе у меня есть язык США, и в качестве разделителя есть точка, и это работает. Но на устройстве стоит запятая, и это не работает. Я не знаю, как использовать запятую в качестве десятичного разделителя.

Ответ №1:

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

Для преобразования вы должны использовать NSNumberFormatter, подобный этому:

 NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
  

Вы можете настроить форматировщик по своему усмотрению, установив локаль (!), ограничения, форматирование, разделитель десятичных знаков / группировку, количество десятичных цифр и т.д. Затем вы просто используете его:

 float number = [nf numberFromString: field.text];
  

И это все! Теперь у вас есть номер, даже если текст содержит запятую, при условии, что вы разрешаете обоим: клавиатуре и программе форматирования, иметь одинаковый формат, одинаковый стиль — т. Е., вероятно, просто разрешаете повсеместно использовать текущую локаль.

Редактировать

это средство форматирования валюты, которое может конвертировать между строкой и числом для валют:

 NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
[nf setNumberStyle: NSNumberFormatterCurrencyStyle];
[nf setRoundingMode: NSNumberFormatterRoundHalfUp];
[nf setMaximumFractionDigits: 2]
  

это форматировщик процентных значений с 4 знаками после запятой:

 NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
[nf setNumberStyle: NSNumberFormatterPercentStyle];
[nf setRoundingMode: NSNumberFormatterRoundHalfUp];
[nf setMaximumFractionDigits: 4];
  

оба в текущей локали.

Как вы видите, вы можете определить стиль, цифры, порядок округления и многое другое, в зависимости от чисел, которые вы пытаетесь ввести. Для получения более подробной информации (вы действительно многое можете сделать с помощью NSNumberFormatter) вам следует прочитать документы Apple, описание всего этого выходит за рамки SO answer.

В вашем случае, при условии, что paino и pituus также являются UITextFields:

 -(IBAction)calculate {
    NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
    [nf setRoundingMode: NSNumberFormatterRoundHalfUp];
    [nf setMaximumFractionDigits: 2];

    float npaino = [[nf numberFromString: paino.text] floatValue];
    float npituus = [[nf numberFromString: pituus.text] floatValue];

    float x = npaino] / npituus *10000;    
    label.text = [nf stringFromNumber: [NSNumber numberWithFloat: x]];

    [nf release];
}
  

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

Комментарии:

1. Спасибо, Томаш, но я новичок в IOS SDK и Xcode, не могли бы вы предоставить дополнительную информацию. Я добавляю некоторый фрагмент своего кода, это простая функция calc, пытаюсь изучить из книги.

2. Спасибо, Томаш, за большую информацию, но у меня есть некоторые ошибки. Можете ли вы проверить скриншот — db.tt/gGOFNeT

3. да, верно, моя ошибка, для работы с NSNumberFormatter вы должны использовать экземпляры NSNumber, а не значения с плавающей запятой напрямую — посмотрите на отредактированный код. Теперь у меня здесь нет XCode для проведения теста, так что потерпите меня и посмотрите документы на случай ошибки — если вы используете XCode 4, вы можете отобразить справку в правой панели инспектора, нажав на ссылки там, вы попадете на страницу документа в XCode organizer. iOS API настолько огромен, что я все еще делаю это постоянно.

Ответ №2:

Так проще:
[[Текст вашего поля] stringByReplacingOccurrencesOfString:@»,» withString:@».»]
Это будет работать всеми способами и на всех языках.

В вашем коде это будет:

 -(IBAction)calculate {
    float fPaino = [[paino.text stringByReplacingOccurrencesOfString:@"," withString:@"."] floatValue];
    float x = fPaino / ([pituus.text floatValue]) *10000;    
    label.text = [[NSString alloc] initWithFormat:@"%0.02f", x];
}
  

Что-то еще: вам обязательно нужно «выделить» для результата? Поскольку label.text уже содержит ее сохранение / освобождение, вы можете просто создать [NSString stringWithFormat:@»%0.02f», x]

Комментарии:

1. Попытка ретроактивно модифицировать мои приложения была бы экономически неэффективной, но это достаточно хорошее решение, спасибо!