Limit a double to two decimal places [duplicate]

Solution 1:

You made simple mistake. This will work:

[NSString stringWithFormat: @"%.2lf", total]

Solution 2:

Use NSNumberFormatter. See the Data Formatting Programming Guide's chapter on Number Formatters.

Solution 3:

The easiest way is to probably roll your own. I've had to do this in C before since there's no way to get the behavior you want with printf formatting.

It doesn't appear to be much easier in Objective-C either. I'd give this a try:

NSString *ftotal = [NSString stringWithFormat: @"%.2f", total];
while ([ftotal hasSuffix:@"0"]) {
    ftotal = [ftotal subStringToIndex [ftotal length]-1];
}
if ([ftotal hasSuffix:@"."]) {
    ftotal = [ftotal subStringToIndex [ftotal length]-1];
}

or this (possibly faster) variant:

NSString *ftotal = [NSString stringWithFormat: @"%.2f", total];
if ([ftotal hasSuffix:@".00"]) {
    ftotal = [ftotal subStringToIndex [ftotal length]-3];
} else {
    if ([ftotal hasSuffix:@"0"]) {
        ftotal = [ftotal subStringToIndex [ftotal length]-1];
    }
}

The stringWithFormat guarantees there will always be a ".nn" at the end (where n is a digit character). The while and if simply strip off trailing zeros and the trailing decimal if it was an integer.

Obviously, you may want to put it in a function or class so you can get at it from anywhere without having to duplicate the code all over the place.

Solution 4:

I'm not familiar with objective C, but this isn't possible with standard printf-style formatting.

Using %g would sort-of work, but for large or small numbers it would use scientific notation (eg 9.6e+6, 4.2e-7) rather than decimal notation.

The equivalent question was asked for C/C++ here, and in that case the answer is to use %f and then strip any trailing 0's from the string. Not exactly elegant.