Пользователь вводит числовую строку в UILabel, и текст отображается как пользовательские типы.
NSString *input = [[sender titleLabel] text];
[display_ setText:[[display_ text] stringByAppendingString:input]];
Это отлично работает, и я форматирую отображение с помощью NSNumberFormatter, чтобы при вводе 1000000 оно преобразовывалосьдо 1 000 000 при нажатии другой кнопки.
Однако я хотел бы, чтобы эти групповые запятые отображались как пользовательские типы.Я могу понять, как вставлять вещи в строки, но как это делать, когда пользователь вводит текст, мне не понятно.Требуется ли изменяемая строка?
Может быть, каким-то образом контролировать длину строки, разделить ее на группы по три, а затем создать и отобразить новую строку с вставленными запятыми?Я мог бы, вероятно, сделать это, но это та часть, которая «напечатана», которая поставила меня в тупик.
Другая идея состоит в добавлении и отображении строки, затем считывании отображения в новую строку NSString, ее форматировании и отображении снова сразу.Итак, я попробовал это, и это почти работает:
if (userIsEntering)
{
NSNumberFormatter *fmtr = [[NSNumberFormatter alloc] init];
[fmtr setNumberStyle:NSNumberFormatterDecimalStyle];
[fmtr setGroupingSeparator:@","];
[fmtr setDecimalSeparator:@"."];
NSString *out = [[display_ text] stringByAppendingString:digit];
NSNumber *num = [fmtr numberFromString:out];
NSString* formattedResult = [fmtr stringFromNumber:num];
[display_ setText: [NSString stringWithFormat:@"%@", formattedResult]];
[fmtr release];
}
И, наряду с тем фактом, что форматтер создается и освобождается с каждой введенной цифрой, после 4 цифр он возвращает ноль.
ОБНОВЛЕНИЕ: я разобрался, как сделать это в лейбле (с некоторой помощью от @ Michael-Frederick).Он использует NSNotification.
Это прекрасно работает для недесятичных чисел, но когда я пытаюсь ввести десятичную точку, он игнорируется и удаляется.Если я не вызову этот метод, десятичная точка будет принята, и все будет работать хорошо.
Цифровая запись выглядит следующим образом (из кнопки):
NSString *digit = [[sender titleLabel] text];
if (userIsStillWorking_)
{
[display_ setText:[[display_ text] stringByAppendingString:digit]];
}
else
{
[display_ setText: digit];
userIsStillWorking_ = YES;
}
[[NSNotificationCenter defaultCenter] postNotificationName:@"updateDisplay" object:nil];
И метод updateDisplay, вызываемыйуведомление:
{
NSString *unformattedValue = [display_.text stringByReplacingOccurrencesOfString:
@"," withString:@""];
unformattedValue = [unformattedValue stringByReplacingOccurrencesOfString:
@"." withString:@""];
NSDecimalNumber *amount = [NSDecimalNumber decimalNumberWithString:unformattedValue];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setGroupingSeparator:@","];
[formatter setDecimalSeparator:@"."];
[display_ setText: [ formatter stringFromNumber:amount]];
[formatter release];
}
Я пытался закомментировать
unformattedValue = [unformattedValue stringByReplacingOccurrencesOfString:
@"." withString:@""];
, но это не имеет значения.