#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. Попытка ретроактивно модифицировать мои приложения была бы экономически неэффективной, но это достаточно хорошее решение, спасибо!