Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSNumberFormatter Currency Without Symbol?

Tags:

I am using NSNumberFormatter to get a currency value from a string and it works well.

I use this code to do so:

NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];     [nf setNumberStyle:NSNumberFormatterCurrencyStyle];     NSString *price = [nf stringFromNumber:[NSNumber numberWithFloat:[textField.text floatValue]]]; 

However, it always gives me a currency symbol at the start of the string. Rather than doing it manually form my given string, can I not somehow have the formatter not give the string any currency symbol?

like image 941
Josh Kahane Avatar asked Sep 20 '12 23:09

Josh Kahane


Video Answer


2 Answers

Yes, after you set the style, you can tweak specific aspects:

NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; [nf setNumberStyle:NSNumberFormatterCurrencyStyle]; [nf setCurrencySymbol:@""]; // <-- this NSDecimalNumber* number = [NSDecimalNumber decimalNumberWithString:[textField text]]; NSString *price = [nf stringFromNumber:number]; 

Just as some advice, you should probably use a number formatter to read the string value, especially if a user is entering it (as suggested by your code). In this case, if the user enters locale-specific formatting text, the generic -floatValue and -doubleValue type methods won't give you truncated numbers. Also, you should probably use -doubleValue to convert to a floating point number from user-entered text that's a currency. There's more information about this in the WWDC'12 developer session video on internationalization.

Edit: Used an NSDecimalNumber in the example code to represent the number the user enters. It's still not doing proper validation, but better than the original code. Thanks @Mark!

like image 128
Jason Coco Avatar answered Sep 18 '22 10:09

Jason Coco


With Swift 5, NumberFormatter has a property called currencySymbol. currencySymbol has the following declaration:

var currencySymbol: String! { get set } 

The string used by the receiver as a local currency symbol.

Therefore, if required for your formatting style, you can set this property to an empty String.


The following Playground sample code shows how to set your currency formatting style with an empty symbol:

import Foundation  let amount = 12000  let formatter = NumberFormatter() formatter.numberStyle = NumberFormatter.Style.currency formatter.currencySymbol = "" formatter.locale = Locale(identifier: "en_US") // set only if necessary  let result = formatter.string(for: amount) print(String(describing: result)) // prints: Optional("12,000.00") 
like image 24
Imanou Petit Avatar answered Sep 19 '22 10:09

Imanou Petit