NSNumberFormatter with comma decimal separator

I tried to convert an NSString like “12000.54” into “12.000,54”. I wrote an NSNumberFormatter instance.

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setGroupingSeparator:@"."];
[formatter setDecimalSeparator:@","];

But when I NSLog this :

  • Keyboard hide and show again right after UIActionSheet dismiss in iOS 7, SDK 7
  • Cordova whitelist iOS 10 SSL error: Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made
  • Memory leak when filtering with Core image
  • Use a button on a UICollectionViewCell to display data from an array
  • Dropbox Core API - 1021 error before upload - only in iOS 5 and below
  • Writing a NSArray to file
  • NSLog(@"%@",[formatter stringFromNumber:[formatter numberFromString:value]]);
    

    It prints null value. If I change my comma with a point it’s working correctly. I just would like to be able to put what I want for my separators field (comma, point, slash, etc …) and I have different outputs : 12/000,54 12.000.54 12,000,54 for example.

    Do you know how I can handle this ?

    4 Solutions Collect From Internet About “NSNumberFormatter with comma decimal separator”

    I would recommend not hardcoding the separator to ensure the right separator behavior based on the iPhone locale setting. The easiest way to to this is:

    using objective-c

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc]init];
    numberFormatter.locale = [NSLocale currentLocale];// this ensures the right separator behavior
    numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
    numberFormatter.usesGroupingSeparator = YES;
    
    // example for writing the number object into a label
    cell.finalValueLabel.text = [NSString StringWithFormat:@"%@", [numberFormatter stringForObjectValue:numberFromString]]; // your var name is not well chosen
    

    using SWIFT 3

     let formatter = NumberFormatter()
     formatter.locale = NSLocale.current // this ensures the right separator behavior
     formatter.numberStyle = NumberFormatter.Style.decimal
     formatter.usesGroupingSeparator = true
    
     // example for writing the number object into a label
     // your variable "numberFromString" needs to be a NSNumber object
     finalValueLabel.text = formatter.string(from: numberFromString)! // your var name is not well chosen
    

    and I would not use the var-name “numberFromString” because it is an NSNumberFormatter method.
    Good luck!

    So the question is valid : I’m answering it myself 🙂

    I have a decimal value read from sqlite (e.g 12000 or 12000.54) directly transformed into NSString.
    I have to use different separator at some point in my code.

    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
    [formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [formatter setGroupingSeparator:@""];
    [formatter setDecimalSeparator:@"."];
    
    // Decimal values read from any db are always written with no grouping separator and a comma for decimal.
    
    NSNumber *numberFromString = [formatter numberFromString:@"12000.54"]];
    
    [formatter setGroupingSeparator:@" "]; // Whatever you want here
    [formatter setDecimalSeparator:@","]; // Whatever you want here
    
    NSString *finalValue = [formatter stringFromNumber:numberFromString];
    
    NSLog(@"%@",finalValue); // Print 12 000,54
    

    Problem solved.

    The simplest solution I recently found is:

    NSString *localizedString = [NSString localizedStringWithFormat:@"%@", @1234567];
    

    Also works with ints:

    NSString *localizedString = [NSString localizedStringWithFormat:@"%d", 1234567];
    

    Verified in Xcode 6 playground. But docs say this function has always existed.

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    numberFormatter.usesGroupingSeparator = YES;
    [numberFormatter setMaximumFractionDigits:2];
    [numberFormatter setMinimumFractionDigits:2];
    NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.00];`
    

    This wll fix your rounding up problem if you are dealing with decimal points.