我正在使用NSNumberFormatter从字符串中获取货币值,而且效果很好。
我使用此代码执行此操作:
NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
[nf setNumberStyle:NSNumberFormatterCurrencyStyle];
NSString *price = [nf stringFromNumber:[NSNumber numberWithFloat:[textField.text floatValue]]];
但是,它总是在字符串的开头给我一个货币符号。而不是手动形成我给定的字符串,我不能让格式化程序不给字符串任何货币符号吗?
答案 0 :(得分:60)
是的,在设置样式后,您可以调整特定方面:
NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
[nf setNumberStyle:NSNumberFormatterCurrencyStyle];
[nf setCurrencySymbol:@""]; // <-- this
NSDecimalNumber* number = [NSDecimalNumber decimalNumberWithString:[textField text]];
NSString *price = [nf stringFromNumber:number];
正如一些建议一样,您应该使用数字格式化程序来读取字符串值,尤其是在用户输入它时(如代码所示)。在这种情况下,如果用户输入特定于语言环境的格式设置文本,则通用-floatValue
和-doubleValue
类型方法不会为您提供截断的数字。此外,您应该使用-doubleValue
从用户输入的文本(即货币)转换为浮点数。关于国际化的WWDC'12开发者会议视频中有关于此的更多信息。
编辑:在示例代码中使用NSDecimalNumber
来表示用户输入的数字。它仍然没有进行适当的验证,但比原始代码更好。谢谢@Mark!
答案 1 :(得分:5)
使用Swift 4.2,NumberFormatter
有一个名为currencySymbol
的属性。 currencySymbol
有以下声明:
var currencySymbol: String! { get set }
接收方用作本地货币符号的字符串。
因此,如果格式化样式需要,您可以将此属性设置为空String
。
以下Playground代码显示如何使用空符号设置货币格式样式:
import Foundation
let amount = 12000
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencySymbol = ""
formatter.locale = Locale(identifier: "en_US") // set only if necessary
let result = formatter.string(for: amount)
//let result = formatter.string(from: NSNumber(value: amount)) // also works
print(String(describing: result)) // prints: Optional("12,000.00")
答案 2 :(得分:1)
至于Swift语言
let mymoney = 12000
let formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
formatter.currencySymbol = ""
formatter.locale = NSLocale.currentLocale()
let resultString = formatter.stringFromNumber(mymoney)!
答案 3 :(得分:0)
对@Imanou Petit答案进行一些调整。
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