2012-09-20 80 views
17

我正在使用NSNumberFormatter从字符串中获取货币值,它工作正常。NSNumberFormatter没有符号的货币?

我使用此代码这样做:

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

然而,它总是让我在字符串的开头货币符号。而不是手动形成我给定的字符串,我不能以某种方式让格式化程序不给字符串任何货币符号?

任何帮助表示赞赏,谢谢。

+0

记住,它不会永远是在开始 - 对于欧元的价格,你会碰到这样的12,34€ – ATV

回答

57

是的,你设置样式后,你可以调整具体方面:

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

+0

为了钱你可能想使用NSDecimalNumber而不是两倍,所以你没有舍入问题 – Mark

+0

@Mark是的,我同意,我实际上将编辑原始代码来做到这一点。 –

0

为雨燕语言

let mymoney = 12000 

let formatter = NSNumberFormatter() 
formatter.numberStyle = .CurrencyStyle 
formatter.currencySymbol = "" 
formatter.locale = NSLocale.currentLocale() 

let resultString = formatter.stringFromNumber(mymoney)! 
2

与SWIFT 3,NumberFormatter有一个名为currencySymbol属性。 currencySymbol具有以下声明:

var currencySymbol: String! { get set } 

使用由接收器作为本地货币符号的字符串。

因此,如果您的格式化样式需要,您可以将此属性设置为空的String


下面的游乐场代码显示了如何用一个空符号设置你的货币格式风格:

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")