ios - Swift - 对美元值数组进行排序

标签 ios arrays sorting swift substring

我有一系列格式如下的交易:

“$2.25 饮料 A”

“5 美元饮料 B”

“10 美元饮料 C”

等等

我想按金额对它们进行排序。

    deals.sort {
        var first = $0.deal as String
        var second = $1.deal as String

        var myArr1 = first.componentsSeparatedByString(" ")
        var myArr2 = second.componentsSeparatedByString(" ")

        var formatter = NSNumberFormatter()
        formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle

        if let price1 = formatter.numberFromString(myArr1[0]) as NSNumber! {
            if let price2 = formatter.numberFromString(myArr2[0]) as NSNumber!{
                return first < second
            }
        }
        return false
    }

这对于 4.25 美元和任何一位数字的值都可以正常工作。如果我尝试 10.25 美元之类的东西,它不会正确排序。

这是我用来测试代码的 playground

import UIKit


var deals: [(deal:String, bar:String)] = []

deals.append(deal: "$0.95" as String, bar: "bar" as String)
deals.append(deal: "$2.95" as String, bar: "bar" as String)
deals.append(deal: "$11.95" as String, bar: "bar" as String)
deals.append(deal: "$3.95" as String, bar: "bar" as String)


deals.sort {
    var first = $0.deal as String
    var second = $1.deal as String

    var myArr1 = first.componentsSeparatedByString(" ")
    var myArr2 = second.componentsSeparatedByString(" ")

    var formatter = NSNumberFormatter()
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle

    if let price1 = formatter.numberFromString(myArr1[0]) as NSNumber! {
        if let price2 = formatter.numberFromString(myArr2[0]) as NSNumber!{
            return first < second
        }
    } 
    return false
}

for deal in deals{
    print("\(deal.deal)\n")
}

最佳答案

编辑:我知道你已经接受了一个答案,但是 FWIW,根据你自己的问题编辑,我在下面更新了我的答案,向你展示你的 Playground 代码是如何改变的让我最初的建议奏效。

deals.sort{
    let myArr1 = $0.deal.componentsSeparatedByString(" ")
    let myArr2 = $1.deal.componentsSeparatedByString(" ")
    let formatter = NSNumberFormatter()
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle

    if let price1 = formatter.numberFromString(myArr1[0]) {
        if let price2 = formatter.numberFromString(myArr2[0]) {
            return price1.floatValue < price2.floatValue
        }
    }
    return false
}

另一个建议是,如果您有一个 Deal 类,并且具有返回交易的浮点值的特定属性,您可以做得更简单,如下所示:

var dealValue: Float {
    get {
        let myArr = self.deal.componentsSeparatedByString(" ")
        let formatter = NSNumberFormatter()
        formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
        if let price = formatter.numberFromString(myArr[0]) {
            return price.floatValue
        } else {
            return 0
        }
    }
}

那么您之前的代码将简单地变成:

deals.sort { $0.dealValue < $1.dealValue }

关于ios - Swift - 对美元值数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28555804/

相关文章:

ruby - 如何按字母顺序对字符串的字符进行排序?

ios - 如何从第三个 viewController 返回到第一个 viewController

arrays - 在填字游戏中找到单词的点

javascript - 在数组中查找 indexOf 值

PHP 从数组中获取最大值

c - 排序程序查询

php - iOs 推送通知与 PHP 5.2 或更低版本兼容

objective-c - iOS : I can't find my file?

iphone - 使用 AFNetworking 发布请求

c - 使用 GSList 作为 GHashTable 值的不同方法