货币符号和值之间的间距:iOS swift 3

时间:2017-06-05 06:24:37

标签: ios swift swift3 number-formatting

我正在使用IAP的应用程序。我需要根据位置显示价格。我已经做到了这一点。现在我可以根据位置显示价格。

但是,我需要货币符号和值之间的间距。 即,我需要9.99美元(目前它显示9.99美元)。

仅供参考:我从itunes获得价格(使用变量来获取从iTunes获得的价格并在文本视图中显示它)。

我跟着这个没有成功:NSNumberFormatter paddingPosition doesn't work

我也提到过这个,但它不起作用: Swift 3 and NumberFormatter (.currency) == ¤?

有什么建议吗?

我这样做:

var index: Int = 0 {
    didSet {

        var monthlyValue = String()

        if prefs.value(forKey: "monthly") != nil {

            monthlyValue = prefs.value(forKey: "monthly") as! String


        }

        let subcharges : Array<String>   = ["Free but limited just to get started","or \(monthlyValue) Billed Monthly",""]

        let yearlypermonth = Int()

        var mycurrency1 = String()

        if prefs.value(forKey: "yearly") != nil {

            let yearlyvalue = prefs.value(forKey: "yearly") as! String

            print("wallet view yearlyvalue: \(yearlyvalue)")

            let firstProduct  = StoreManager.shared.productsFromStore[0]

            if let mycurrency = firstProduct.priceLocale.currencySymbol {

                print("mycurrency: \(mycurrency)")

                mycurrency1 = mycurrency
                prefs.set(mycurrency, forKey: "mycurrency")

            }

            let formatter = NumberFormatter()
            formatter.numberStyle = .currency
//                formatter.paddingPosition = .afterPrefix
//
//                //formatter.locale = Locale(identifier: "en_US")
//                formatter.paddingCharacter = " "
//                formatter.formatWidth = 7


            let number1 = formatter.number(from: yearlyvalue)

            print("wallet view number1: \(number1)")

            let secondProd = StoreManager.shared.productsFromStore[1]

            let numberFormatter = NumberFormatter()
//                numberFormatter.paddingPosition = .afterPrefix
//                numberFormatter.paddingCharacter = " "
//                numberFormatter.formatWidth = 7
            // Get its price from iTunes Connect
            numberFormatter.locale = secondProd.priceLocale
            let price2Str = numberFormatter.string(from: secondProd.price)

            let currencynumbers2 =  secondProd.price.doubleValue / 12

            monthonValueforaYear = String(format: "%.2f", currencynumbers2)

            print("walletview VC monthonValueforaYear: \(monthonValueforaYear)")

            //prefs.set(price2Str, forKey: "yearly")
            prefs.set(monthonValueforaYear, forKey: "monthonValueforaYear")

        }
        var charges : Array<String> = ["\(mycurrency1) 0/m","\(mycurrency1 + monthonValueforaYear)/m","Coming Soon"]

        print("wallet view charges: \(charges)")

        self.Headingtitle.text    = Headingarray[index]
        self.planchargelabel.text  = charges[index]
        self.subchargelabel.text = subcharges[index]

有趣的是,对于subchargelabel值,我得到一点间距

在我尝试运行应用时,注释部分已取消注释。只是你知道吗

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

尝试格式化您需要的字符串,如下所示。

let priceWithSpace: String? = firstProduct.priceLocale.currencySymbol + " " +   product.price 

答案 1 :(得分:0)

只是放置符号,空格和数量不是一个好主意。它的顺序可能因地区或货币而异。以下方法将为您提供答案。

func customFormattedAmountString(amount: Int) -> String? {
    let formatter = NumberFormatter()
    formatter.numberStyle = .currency
    formatter.locale = Locale.current

    if let amountString = formatter.string(from: NSNumber(value: amount)) {
        // check if it has default space like EUR
        let hasSpace = amountString.rangeOfCharacter(from: .whitespaces) != nil

        if let indexOfSymbol = amountString.characters.index(of: Character(formatter.currencySymbol)) {
            if amountString.startIndex == indexOfSymbol {
                formatter.paddingPosition = .afterPrefix
            } else {
                formatter.paddingPosition = .beforeSuffix
            }
        }
        if !hasSpace {
            formatter.formatWidth = amountString.characters.count + 1
            formatter.paddingCharacter = " "
        }
    } else {
        print("Error while making amount string from given amount: \(amount)")
        return nil
    }

    if let finalAmountString = formatter.string(from: NSNumber(value: amount)) {
        return finalAmountString
    } else {
        return nil
    }
}

使用如下,

if let formattedAmount = customFormattedAmountString(amount: 5000000) {
    print(formattedAmount)
}

这将打印出美元,

$ 5,000,000.00

和欧元,

5.000.000,00 €

因为你想在货币符号和金额之间留出空格。如果您只是追加第一个答案的字符串,那么您将得到“€5.000.000,00”,而不是所需的字符 - “5.000.000,00€”。

答案 2 :(得分:0)

将formatWidth属性和paddingPosition设置为afterPrefix

var formatCurrency:  String {
    let formatter = NumberFormatter()
    formatter.usesGroupingSeparator = true
    formatter.numberStyle = .currency
    formatter.locale = Locale.current
    formatter.paddingPosition = .afterPrefix
    formatter.formatWidth = 6
    return formatter.string(for: self) ?? "N/A"   
}