Как вставить групповую запятую в NSString как набрано? - PullRequest
2 голосов
/ 15 сентября 2011

Пользователь вводит числовую строку в 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:@""];

, но это не имеет значения.

Ответы [ 2 ]

1 голос
/ 20 октября 2012

Лучший способ сделать это - использовать 2 UIlabels.1 из меток используется для подачи вашего объекта NSNumberFormatter с помощью [NSString stringByAppendingString: digit];Другая метка фактически отображается.Хитрость заключается в том, чтобы установить метку, которая не отформатирована, на скрытую, а другую метку установить в качестве вывода для форматера чисел.Подавая скрытую метку в устройство форматирования чисел и выводя отображаемую надпись из средства форматирования чисел, для средства форматирования чисел следует установить стиль NSDecimalNumber.Если все настроить так, то при наборе текста будут отображаться автоматические запятые.

1 голос
/ 15 сентября 2011

РЕДАКТИРОВАТЬ: пользователь не может набрать uilabel.Вам нужно использовать либо поле uitext, либо uitextview.

Если вы хотите использовать поле uitext, сделайте что-то вроде этого ...

- (void) viewDidLoad {
[super viewDidLoad];
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}

- (void) textFieldDidChange:(UITextField *)textField {
    NSString *unformattedValue = [textField.text stringByReplacingOccurrencesOfString:@"," withString:@""];
    unformattedValue = [unformattedValue stringByReplacingOccurrencesOfString:@"." withString:@""];

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [formatter setGroupingSeparator:@","];
    [formatter setDecimalSeparator:@"."];

    NSNumber *amount = [NSNumber numberWithInteger:[unformattedValue intValue]];
    textField.text = [formatter stringFromNumber:amount];

    [formatter release];
}

Обратите внимание, что вы правильно указали NSNumberFormatterобъявлено вне метода textFieldDidChange.Обратите внимание, что этот код на самом деле для целого числа.При необходимости вы можете переключить intValue на floatValue.Этот код не проверен, это скорее общее руководство.

...