用户在 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 位数字之后它返回 null。
更新:我想出了如何在标签中做到这一点(在@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:@""];
但这没有什么区别。