我在计算器显示中使用NSNumberFormatter但它不能正确解析NSStrings

时间:2012-08-12 16:03:21

标签: objective-c parsing nsnumber nsnumberformatter

我是初学者Objective-C程序员,我正在构建一个计算器作为我的第一个应用程序。我使用NSNumberFormatter格式化计算器的显示。它会正确地将NSNumber转换为NSString,但如果它们有逗号分隔符,则不会将NSString解析为NSNumber。这是代码:

- (IBAction)digitPressed:(NSButton *)sender {
    if (userIsEnteringANumber) {
        NSNumber *number = [formatter numberFromString:[self.calDisplay.stringValue stringByAppendingString:sender.title]];
        self.calDisplay.stringValue = [formatter stringFromNumber:number];
    }
    else {
        self.calDisplay.stringValue = sender.title;
        userIsEnteringANumber = YES;
    }
}

如果calDisplay.stringValue = @“2,569”,则按其他数字会将number设置为nil

3 个答案:

答案 0 :(得分:2)

实际上我只是在将字符串解析为数字之前删除逗号然后它必须工作。

 NSString *s = [self.calDisplay.stringValue 
                stringByReplacingOccurrencesOfString:@"," withString:@""];

离开你

- (IBAction)digitPressed:(NSButton *)sender {
   if (userIsEnteringANumber) {
       NSString *s = [self.calDisplay.stringValue stringByReplacingOccurrencesOfString:@"," withString:@""];
       NSNumber *number = [formatter numberFromString:[s stringByAppendingString:sender.title]];
       self.calDisplay.stringValue = [formatter stringFromNumber:number];
   } else {
       self.calDisplay.stringValue = sender.title;
       userIsEnteringANumber = YES;
   }
}

答案 1 :(得分:1)

我相信这就是:

你拥有的字符串是“2,569”。这是两千件事。这样可以正常工作,因为千位分隔符是逗号。

按下另一个按钮(例如1)后,您的字符串变为“2,5691”。这不是一个正确的数字,因为它有数千个分隔符(逗号)错误,因此为零数字。 “25,691”本来是正确的,但你有“2,5691”。

试试这个:

- (IBAction)digitPressed:(NSButton *)sender {
    if (userIsEnteringANumber) {
        double previous = [[self.calDisplay.stringValue] doubleValue];
        double pressed = [sender.title doubleValue];
        NSNumber *number = [NSNumber numberWithDouble:previous*10+pressed];
        self.calDisplay.stringValue = [formatter stringFromNumber:number];
    }
    else {
        self.calDisplay.stringValue = sender.title;
        userIsEnteringANumber = YES;
    }
}

答案 2 :(得分:0)

扩展bogdansrc的回答,指出格式化程序在这里没有错,解决这个(作业?)问题的一种方法是允许输入已经在显示中显示为双精度的字符串的数字如下:

- (IBAction)digitPressed:(NSButton *)sender {
    if (userIsEnteringANumber)
    {
        double previous = self.calDisplay.stringValue.doubleValue;
        NSString* pressed = sender.title;
        NSString* newNumber = [NSString stringWithFormat:@"%g%s", previous, pressed];
        self.calDisplay.stringValue = [formatter stringFromNumber:[newNumber doubleValue]];
    }
    else
    {
        self.calDisplay.stringValue = sender.title;
        userIsEnteringANumber = YES;
    }
}

当然,这不是真正理想的 MVC ,因为代码依赖于 V iew跟踪其 M odel ...并且这样做,很难能够仅从你提供的代码片段中知道如何在进入应该是小数十进制数的状态后按下4时从260转换到260.4。是否显示和跟踪的小数位是stringValue中的最后一个字符?如果是这样,上面会因为“。”而破裂。最后会迷路。如果没有,那么 M odel基本上部分地分布在 V iew中,部分处于分离状态,这甚至不太理想。