如何在NSString中插入分组逗号作为键入?

时间:2011-09-15 02:28:55

标签: ios insert nsstring uilabel nsnumberformatter

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

但这没什么区别。

2 个答案:

答案 0 :(得分: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。此代码未经测试,更像是一般指南。

答案 1 :(得分:1)

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