2015-10-05 42 views
0

我在返回的grades,一个(私有实例)NSDecimalNumbers的NSMutableArray的所有元素的总和类编写方法正确值valueForKeyPath总和不返回

grades = [[NSMutableArray alloc] init]; 

我收到一个字符串格式化像 “(长度) - (值)(值)...”
(实施例:"3 - 90.5 85.2 89.6"
这是我的填充阵列

-(void) setGrades: (NSString *) list{ 
    NSArray *arr = [list componentsSeparatedByString:@" "]; 

    int i = 2; //start from 2 to ignore length and '-' 
    for (; i<[arr count]; i++) 
    { 
     NSString *temp = [arr objectAtIndex:i]; 
     [grades addObject: [NSDecimalNumber decimalNumberWithString: temp]]; 
    } 
} 

总和方法

-(double) getSum{ 
    double sum = [[grades valueForKeyPath:@"@sum.doubleValue"]doubleValue]; 
    return sum; 
} 

返回的东西完全不正确。例如,通过上面的示例数据,它返回0。或者,如果我删除最后一个值(因此它将是"2 - 90.5 85.2"),它将返回-1717986918。在填充数组或其他方式时出现错误?我如何解决它?

+0

你确定'grades'是空的,你开始将对象添加到它之前? – Aderstedt

+0

是的,我在添加对象之前检查它是否为空,它仍然返回0。 –

+0

为什么你使用'NSDecimalNumber'转换它们,使用'[NSNumber numberWithInteger:[temp integerValue]]',而你的值的另一个问题是,它将'-'视为值,而你用空间分割它们。 –

回答

1

在你

-(void) setGrades: (NSString *) list{ 
NSArray *arr = [list componentsSeparatedByString:@" "]; 

int i = 2; //start from 2 to ignore length and '-' 
for (; i<[arr count]; i++) 
{ 
    NSString *temp = [arr objectAtIndex:i]; 
    [grades addObject: [NSDecimalNumber decimalNumberWithString: temp]]; 
} 

}

不要把它转换成NSDecimalNumber和字符串格式将它添加到阵列的这种方法。并确保您已将内存分配给等级阵列。

grades = [[NSMutableArray alloc]init]; 

然后在这个方法后来

-(double) getSum{ 
    double sum = [[grades valueForKeyPath:@"@sum.doubleValue"]doubleValue]; 
    return sum; 
} 

做这样的事情:

-(double) getSum{ 

double sum = 0; 
for(int i = 0; i< grades.count; i++){ 
    sum += [[NSString stringWithFormat:@"%@",[grades objectAtIndex:i]]doubleValue]; 
} 
return sum; 

}

希望这会帮助你。

0

更好地选择一种类型并坚持下去。

NSDecimal:

[grades addObject:[NSDecimalNumber decimalNumberWithString: temp]]; 

NSDecimalNumber *sum = [grades valueForKeyPath:@"@sum.self"]; 

双:

[grades addObject:[NSNumber numberWithDouble:[temp doubleValue]]]; 

double sum = [[grades valueForKeyPath:@"@sum.self"] doubleValue]; 

的NSString:

[grades addObject:temp]; 

NSString *sum = [grades valueForKeyPath:@"@sum.self"];