Rounding numbers in Objective-C
Objective CCocoaMacosFormattingRoundingObjective C Problem Overview
I'm trying to do some number rounding and conversion to a string to enhance the output in an Objective-C program.
I have a float value that I'd like to round to the nearest .5 and then use it to set the text on a label.
For example:
1.4 would be a string of: 1.5
1.2 would be a string of: 1
0.2 would be a string of: 0
I've spent a while looking on Google for an answer but, being a noob with Objective-C, I'm not sure what to search for! So, I'd really appreciate a pointer in the right direction!
Thanks, Ash
Objective C Solutions
Solution 1 - Objective C
Thanks for the pointers everyone, I've managed to come up with a solution:
float roundedValue = round(2.0f * number) / 2.0f;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:1];
[formatter setRoundingMode: NSNumberFormatterRoundDown];
NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:roundedValue]];
[formatter release];
The above works for the test cases I threw at it, but if anyone knows a better way to do this I'd be interested to hear it!
Solution 2 - Objective C
float floatVal = 1.23456;
Rounding
int roundedVal = lroundf(floatVal);
NSLog(@"%d",roundedVal);
Rounding Up
int roundedUpVal = ceil(floatVal);
NSLog(@"%d",roundedUpVal);
Rounding Down
int roundedDownVal = floor(floatVal);
NSLog(@"%d",roundedDownVal);
Solution 3 - Objective C
NSString *numberString = [NSString stringWithFormat:@"%f", round(2.0f * number) / 2.0f];
Solution 4 - Objective C
Use lroundf() to round a float to integer and then convert the integer to a string.
Solution 5 - Objective C
NSString *numberString = [NSString stringWithFormat:@"%d",lroundf(number)];
Solution 6 - Objective C
I'd recommend looking into using [NSNumberFormatter][1].
[1]: http://developer.apple.com/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfNumberFormatting10_4.html#//apple_ref/doc/uid/TP40002368 "NSNumberFormatter"
Solution 7 - Objective C
a simple way:
float theFloat = 1.23456;
int rounded = roundf(theFloat); NSLog(@"%d",rounded);
int roundedUp = ceil(theFloat); NSLog(@"%d",roundedUp);
int roundedDown = floor(theFloat); NSLog(@"%d",roundedDown);
// Note: int can be replaced by float
Solution 8 - Objective C
NSString *intNumberString = [NSString stringWithFormat:@"%d", (int)floatNumber];
Solution 9 - Objective C
Following Technique worked for me in a financial application.
NSString *dd=[NSString stringWithFormat:@"%0.2f",monthlyPaymentCalculated];
monthlyPaymentCalculated=[dd doubleValue];
self.monthlyPaymentCritical=monthlyPaymentCalculated;
what is did is first is rounded it with %0.2f and stored it in NSString then i simply converted it again into double and result was good for my calculation.
Solution 10 - Objective C
With these functions you can round to any value.. If you use p=2, you get even numbers.
float RoundTo(float x, float p)
{
float y = 1/p;
return int((x+(1/(y+y)))*y)/y;
}
float RoundUp(float x, float p)
{
float y = 1/p;
return int((x+(1/y))*y)/y;
}
float RoundDown(float x, float p)
{
float y = 1/p;
return int(x*y)/y;
}
Solution 11 - Objective C
I needed to be able to round to a specific digit (not necessarily to whole integers). I made a NSNumber
category (based off Ash's answer) and added the following method to it:
- (NSString *)stringByRounding:(NSNumberFormatterRoundingMode)roundingMode
toPositionRightOfDecimal:(NSUInteger)position
{
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:position];
[formatter setRoundingMode:roundingMode];
NSString *numberString = [formatter stringFromNumber:self];
return numberString;
}
Which allows me to use it like so:
[aNumber stringByRounding:NSNumberFormatterRoundUp toPositionRightOfDecimal:2];
I can use it to round to integers by passing in 0
as the second parameter:
[aNumber stringByRounding:NSNumberFormatterRoundPlain toPositionRightOfDecimal:0];