Reputation: 17160
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?
Upvotes: 23
Views: 15878
Reputation: 4002
Displays 9,999.99 without the currency & not as Optional.
let myDouble = 9999.99
let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true
currencyFormatter.numberStyle = .currency
currencyFormatter.currencySymbol = ""
// localize to your grouping and decimal separator
currencyFormatter.locale = Locale.current
// We'll force unwrap with the !, if you've got defined data you may need more error checking
let priceString = currencyFormatter.string(from: NSNumber(value: myDouble))!
print(priceString) // Displays 9,999.99 without the currency & not as Optional
Upvotes: 2
Reputation: 92409
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")
Upvotes: 10
Reputation: 7263
as for Swift Language
let mymoney = 12000
let formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
formatter.currencySymbol = ""
formatter.locale = NSLocale.currentLocale()
let resultString = formatter.stringFromNumber(mymoney)!
Upvotes: 2
Reputation: 78343
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!
Upvotes: 67