【问题标题】:Is there a simple way to format currency into string in iOS?有没有一种简单的方法可以在 iOS 中将货币格式化为字符串?
【发布时间】:2011-07-03 13:51:06
【问题描述】:

我需要一种将 NSNumber 中的价格格式化为如下字符串的方法: “0.99 美元”,而不是“0.99 美元”。

我的游戏使用自定义字体,它们无法包含所有可用的 App Store 货币(如 GBP)的符号。所以我认为最好回滚到货币的字符串表示。

所使用的方法对于 App Store 支持的任何货币都应该是绝对可以的。

【问题讨论】:

    标签: iphone objective-c ios app-store currency


    【解决方案1】:

    如果您希望它本地化(即价格正确一侧的货币),这有点麻烦。

    NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"1.99"];
    NSLocale *priceLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"] autorelease]; // get the locale from your SKProduct
    
    NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
    [currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    [currencyFormatter setLocale:priceLocale];
    NSString *currencyString = [currencyFormatter internationalCurrencySymbol]; // EUR, GBP, USD...
    NSString *format = [currencyFormatter positiveFormat];
    format = [format stringByReplacingOccurrencesOfString:@"¤" withString:currencyString];
        // ¤ is a placeholder for the currency symbol
    [currencyFormatter setPositiveFormat:format];
    
    NSString *formattedCurrency = [currencyFormatter stringFromNumber:price];
    

    必须使用从 SKProduct 获得的语言环境。不要使用 [NSLocale currentLocale]!

    【讨论】:

    • 我知道,但我想自动执行,所以 $ -> USD,£-> GBP 等等。我可以这样做还是也被禁止?
    • 代码就是这样做的。它将货币符号替换为 3 个字母的货币代码。
    • 这可能是我读过的关于 NSNumberFormatter 的最佳说明。谢谢!我特别感谢您加入 setPositiveFormat。我一直在寻找 setFormat 并找不到它,直到现在我几乎放弃了这个:)
    • 你可以使用 [currencyFormatter setCurrencyCode:@"EUR"];并且€符号将出现。
    • '¤' 是generic currency symbol。在设计 ascii 时,没有足够的空间来包含所有货币符号,所以只有少数几个能做到:美元 $、日元 ¥、英镑。工程师们觉得他们应该包括一个代表“货币”的符号。他们决定用一枚金币(你能看到它发光吗?)
    【解决方案2】:

    – productsRequest:didReceiveResponse: 方法返回SKProducts 的列表。

    每个产品都包含一个属性priceLocale,其中包含当前用户的产品本地货币。

    您可以使用以下示例代码 (apple's) 对其进行格式化:

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    [numberFormatter setLocale:product.priceLocale];
    NSString *formattedString = [numberFormatter stringFromNumber:product.price];
    

    祝你好运!

    【讨论】:

      【解决方案3】:

      Swift 示例:

      var currencyFormatter = NSNumberFormatter()
      currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
      currencyFormatter.locale = priceLocale //SKProduct->priceLocale
      var currencyString = currencyFormatter.internationalCurrencySymbol
      var format = currencyFormatter.positiveFormat
      format = format.stringByReplacingOccurrencesOfString("¤", withString: currencyString)
      currencyFormatter.positiveFormat = format
      
      var formattedCurrency = currencyFormatter.stringFromNumber(price) //SKProduct->price
      
      println("formattedCurrency: \(formattedCurrency)")//formattedCurrency: 0,89 EUR
      

      【讨论】:

        【解决方案4】:

        我在这里找到了很好的例子http://bendodson.com/weblog/2014/12/10/skproduct-localized-price-in-swift/

        import StoreKit
        
        extension SKProduct {
        
            @objc func localizedPrice() -> String {
                let formatter = NSNumberFormatter()
                formatter.numberStyle = .CurrencyStyle
                formatter.locale = self.priceLocale
                return formatter.stringFromNumber(self.price)!
            }
        }
        

        【讨论】:

        • 真的很棒。
        【解决方案5】:

        以这种方式使用格式化程序,或者您也可以自定义它

        NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
        [numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
        

        或者像这样

        [formatter setFormat:@"USD ###.00"];
        

        我认为您可以检查该国家/地区的货币并将其存储在字符串中并将其提供给格式化程序。

        【讨论】:

          【解决方案6】:

          实现此目的的最简单方法是使用NSNumberFormatter 类根据需要格式化 NSNumber 值。

          虽然方法不胜枚举,但它提供了多种输出格式化功能,包括应该特别感兴趣的 setInternationalCurrencySymbol: 方法。

          【讨论】:

            【解决方案7】:

            SKProduct price 是一个 NSDecimalNumber 对象,因此您可以这样做的一种方法是扩展 NSDecimalNumber 类。这是我的 Swift 代码:

            extension NSDecimalNumber {
                func asCurrency(locale:NSLocale) -> String? {
                    var numberFormatter = NSNumberFormatter()
                    numberFormatter.formatterBehavior = NSNumberFormatterBehavior.Behavior10_4
                    numberFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
                    numberFormatter.locale = locale
                    return numberFormatter.stringFromNumber(self)
                }
            }
            

            在 Objective-C 中它看起来像这样:

            @interface NSDecimalNumber (CurrencyExtension)
            
            - (NSString*) asCurrency: (NSLocale *)locale;
            
            @end
            
            @implementation NSDecimalNumber (DellExtensions)
            
            - (NSString*) asCurrency: (NSLocale *)locale {
                NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
                [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
                [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
                [numberFormatter setLocale:product.priceLocale];
                return [numberFormatter stringFromNumber:product.price];
            }
            
            @end
            

            【讨论】:

              猜你喜欢
              • 2012-01-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-17
              • 1970-01-01
              • 2010-12-05
              • 1970-01-01
              相关资源
              最近更新 更多