2

用户在 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:@""];

但这没有什么区别。

4

2 回答 2

1

最好的方法是使用 2 个 UIlabels。1 个标签用于通过使用 [NSString stringByAppendingString:digit] 来提供您的 NSNumberFormatter 对象;实际显示的是另一个标签。诀窍是将未格式化的标签设置为隐藏,并将另一个标签设置为数字格式化程序的输出。通过将隐藏标签提供给数字格式化程序,并从数字格式化程序输出显示的标签,数字格式化程序应设置为 NSDecimalNumber 样式。以这种方式进行设置,显示的结果是键入时自动逗号。

于 2012-10-20T02:22:19.410 回答
1

编辑:用户不能输入 uilabel。您需要使用 uitextfield 或 uitextview。

如果您想使用 uitextfield,请执行以下操作...

- (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];
}

请注意,您应该在 textFieldDidChange 方法之外声明 NSNumberFormatter 是正确的。请注意,此代码实际上是一个整数。如果需要,您可能必须将 intValue 切换为 floatValue。此代码未经测试,它更像是一般指南。

于 2011-09-15T05:14:32.527 回答