Question

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];
Était-ce utile?

La 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].

Autres conseils

For those interested, because my above calculations were formatted to include a comma after the values reached one thousand (which I wanted), I was getting weird results due to some calculations using the results from other calculations (already formatted with a comma) The only way I could get it to work correctly was to "not" use results from other calculations and instead do all calculations separately, this meant repeating the same calculation several times but it works perfect now. ;) Here is the code I ended up using, thanks to maddy for his help.

double machineOD = [textField1.text doubleValue];
double pipeOD = [textField2.text doubleValue];
double pipeLength = [textField3.text doubleValue];
double driveLength = [textField4.text doubleValue];
double muckUpFactor = [textField5.text doubleValue];
double jackingSpeed = [textField6.text doubleValue];

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:0];

double VolumePerMtrLitres = ((M_PI_4 * (machineOD / 1000) * (machineOD / 1000)) - (M_PI_4 * (pipeOD / 1000) * (pipeOD / 1000))) * muckUpFactor * 1000;
NSString *numberAsString = [formatter stringFromNumber:@(VolumePerMtrLitres)];
volumePerMeterLitreAnswer.text = [NSString stringWithFormat:@"%@ ltr.", numberAsString];

double LubricationPumpCapacity = jackingSpeed / 1000 * ((M_PI_4 * (machineOD / 1000) * (machineOD / 1000)) - (M_PI_4 * (pipeOD / 1000) * (pipeOD / 1000))) * muckUpFactor * 1000;
NSString *numberAsString2 = [formatter stringFromNumber:@(LubricationPumpCapacity)];
pumpSpeedAnswer.text = [NSString stringWithFormat:@"%@ ltr per min.", numberAsString2];

double VolumePerPipeLitre = ((M_PI_4 * (machineOD / 1000) * (machineOD / 1000)) - (M_PI_4 * (pipeOD / 1000) * (pipeOD / 1000))) * muckUpFactor * 1000 * pipeLength;
NSString *numberAsString3 = [formatter stringFromNumber:@(VolumePerPipeLitre)];
volumePerPipeLitreAnswer.text = [NSString stringWithFormat:@"%@ ltr.", numberAsString3];

double VolumeForDriveLitres = ((M_PI_4 * (machineOD / 1000) * (machineOD / 1000)) - (M_PI_4 * (pipeOD / 1000) * (pipeOD / 1000))) * muckUpFactor * 1000 * driveLength;
NSString *numberAsString4 = [formatter stringFromNumber:@(VolumeForDriveLitres)];
volumeForDriveLitreAnswer.text = [NSString stringWithFormat:@"%@ ltr.", numberAsString4];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top