【问题标题】:NSNumberFormatter Currency Without Symbol?NSNumberFormatter 没有符号的货币?
【发布时间】:2012-09-20 23:36:20
【问题描述】:

我正在使用 NSNumberFormatter 从字符串中获取货币值,并且效果很好。

我使用此代码来执行此操作:

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

但是,它总是在字符串的开头给我一个货币符号。与其手动形成我给定的字符串,我可以不让格式化程序不给字符串任何货币符号吗?

【问题讨论】:

  • 请注意,它并不总是在开始 - 对于欧元价格,您将获得类似 12.34 欧元的价格

标签: iphone objective-c ipad currency nsnumberformatter


【解决方案1】:

是的,设置样式后,您可以调整特定方面:

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

【讨论】:

  • 为了钱,您可能希望使用 NSDecimalNumber 而不是 double,这样您就不会遇到舍入问题
  • @Mark 是的,我同意,我实际上要编辑原始代码来做到这一点。
【解决方案2】:

在 Swift 5 中,NumberFormatter 有一个名为 currencySymbol 的属性。 currencySymbol 有以下声明:

var currencySymbol: String! { get set }

接收方用作本地货币符号的字符串。

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


以下 Playground 示例代码显示了如何使用空符号设置货币格式样式:

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

【讨论】:

    【解决方案3】:

    至于 Swift 语言

    let mymoney = 12000
    
    let formatter = NSNumberFormatter()
    formatter.numberStyle = .CurrencyStyle
    formatter.currencySymbol = ""
    formatter.locale = NSLocale.currentLocale()
    
    let resultString = formatter.stringFromNumber(mymoney)!
    

    【讨论】:

      【解决方案4】:

      对@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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多