views:

1855

answers:

3

I'm using the following piece of Objective-C code to format a NSNumber, and it works fine most of the time, but it doesn't quite do what I want when the NSNumber object holds an integer (no fractional part).

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(80.0f, 90.0f, 225.0f, 40.0f)];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setFormat:@"###.##"];
int bytes = 1024 * 1024;
NSNumber *total = [NSNumber numberWithFloat:([self.totalFileSize floatValue] / bytes)];
label.text = [NSString stringWithFormat:@"0.00 MB of %@ MB", [formatter stringFromNumber:total]];

So for instance, if self.totalFileSize holds 55.2300, it will display "55.23" as it should on my UILabel. But if that same variable holds 55, it will simply display "55" on the label.

What I really want is for this code to always include the 2 decimal places in the output.

How can I achieve that?

A: 

I believe what you are looking for is: "%.2f"

Worst case scenario, you can split the value, check if there is anything after the decimal. If there isn't add the 00 by hand?

Garrett
I believe what you meant you believe what he is looking for is: "%.2f" ;)
schnaader
Using that won't do what you think it will, as passing a NSNumber object to NSLog will result in it calling [obj description], which returns a string. In any case, I'm trying to avoid hacks like the "append 00 if it's not there". I'm sure NSNumberFormatter has a feature to do what I want here.
jpm
A: 

You might be better off with localizedStringWithFormat, like so...

[UILabel alloc] initWithFrame:CGRectMake(80.0f, 90.0f, 225.0f, 40.0f)];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
int bytes = 1024 * 1024;
label.text = [NSString localizedStringWithFormat:@"0.00 MB of %.2f MB", ([self.totalFileSize floatValue] / bytes)];

And of course, bytes could be a const unsigned, and clearColor tends to be a performance hog, but those are issues for another thread.

Brandon Fosdick
+3  A: 

Your format string should have a "0" for each decimal place you want to always exist.

[formatter setFormat:@"###.00"];

for "55.23" and ".23" and ".20"

[formatter setFormat:@"##0.00"];

for "55.23" and "0.23" and "0.20"

See Number Format String Syntax (Mac OS X Versions 10.0 to 10.3)

Or you can use a 10.4 formatter with - setMinimumFractionDigits: and - setMaximumFractionDigits: with both set to 2.

Nathan Kinsinger
Thanks, that works great!
jpm