Search code examples
cocoansnumberformatter

Use NSNumberFormatter for multiple calculations


I am new to this, I set up my calculations as per the code below, but I think there must be a way to just have one NSNumberFormatter?

With the method below, sometimes I get weird results, maybe because some calculations are using the results from the other ones, any help much appreciated.

Thanks you.

double VolumePerMtrLitres = ((3.141592654/4 * ([textField1.text doubleValue]/1000) * ([textField1.text doubleValue]/1000)) - (3.141592654/4 * ([textField2.text doubleValue]/1000) * ([textField2.text doubleValue]/1000))) * [textField5.text doubleValue] * 1000;

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:0];
NSString *numberAsString = [formatter stringFromNumber: [NSNumber numberWithDouble:VolumePerMtrLitres]];
volumePerMeterLitreAnswer.text = [NSString stringWithFormat:@"%@ ltr.", numberAsString];




double LubricationPumpCapacity = [textField6.text doubleValue] / 1000 * [volumePerMeterLitreAnswer.text doubleValue];

NSNumberFormatter *formatter2 = [[NSNumberFormatter alloc] init];
[formatter2 setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter2 setMaximumFractionDigits:0];
NSString *numberAsString2 = [formatter2 stringFromNumber: [NSNumber numberWithDouble:LubricationPumpCapacity]];
pumpSpeedAnswer.text = [NSString stringWithFormat:@"%@ litre per min.", numberAsString2];




double VolumePerPipeLitre = [volumePerMeterLitreAnswer.text doubleValue] * [textField3.text doubleValue];

NSNumberFormatter *formatter3 = [[NSNumberFormatter alloc] init];
[formatter3 setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter3 setMaximumFractionDigits:0];
NSString *numberAsString3 = [formatter3 stringFromNumber: [NSNumber numberWithDouble:VolumePerPipeLitre]];
volumePerPipeLitreAnswer.text = [NSString stringWithFormat:@"%@ ltr.", numberAsString3];




double VolumeForDriveLitres = [volumePerMeterLitreAnswer.text doubleValue] * [textField4.text doubleValue];

NSNumberFormatter *formatter4 = [[NSNumberFormatter alloc] init];
[formatter4 setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter4 setMaximumFractionDigits:0];
NSString *numberAsString4 = [formatter4 stringFromNumber: [NSNumber numberWithDouble:VolumeForDriveLitres]];
volumeForDriveLitreAnswer.text = [NSString stringWithFormat:@"%@ ltr.", numberAsString4];

Solution

  • Your code can be simplified to:

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [formatter setMaximumFractionDigits:0];
    
    double text1 = [textField1.text doubleValue];
    double text2 = [textField2.text doubleValue];
    double text3 = [textField3.text doubleValue];
    double text4 = [textField4.text doubleValue];
    double text5 = [textField5.text doubleValue];
    double text6 = [textField6.text doubleValue];
    
    double VolumePerMtrLitres = ((M_PI_4 * (text1 / 1000) * (text1 / 1000)) - (M_PI_4 * (text2 / 1000) * (text2 / 1000))) * text5 * 1000;
    NSString *numberAsString = [formatter stringFromNumber:@(VolumePerMtrLitres)];
    volumePerMeterLitreAnswer.text = [NSString stringWithFormat:@"%@ ltr.", numberAsString];
    
    double LubricationPumpCapacity = text5 / 1000 * [volumePerMeterLitreAnswer.text doubleValue];
    NSString *numberAsString2 = [formatter stringFromNumber:@(LubricationPumpCapacity)];
    pumpSpeedAnswer.text = [NSString stringWithFormat:@"%@ litre per min.", numberAsString2];
    
    double VolumePerPipeLitre = [volumePerMeterLitreAnswer.text doubleValue] * text3;
    NSString *numberAsString3 = [formatter stringFromNumber:@(VolumePerPipeLitre)];
    volumePerPipeLitreAnswer.text = [NSString stringWithFormat:@"%@ ltr.", numberAsString3];
    
    double VolumeForDriveLitres = [volumePerMeterLitreAnswer.text doubleValue] * text4;
    NSString *numberAsString4 = [formatter stringFromNumber:@(VolumeForDriveLitres)];
    volumeForDriveLitreAnswer.text = [NSString stringWithFormat:@"%@ ltr.", numberAsString4];
    

    Notice the user of M_PI_4 to replace your 3.14159 / 4. Also notice the use of the @(someVariable) syntax instead of using [NSNumber numberWithXXX:someNumber].