У меня есть строка, содержащая символы и значения с плавающей запятой в списке, например let string = "12.1gh34.5abc32.1". Я хочу удалить символы из строки, и результат будет показан в массиве со значениями с плавающей запятой. есть ли решение для этого.

-1
Kanwal Hanjra 18 Сен 2018 в 08:23

2 ответа

Лучший ответ

Разделите строку, используя буквы в качестве разделителя. Удалите из результата пустые строки. Сопоставьте оставшиеся числовые строки с действительными числами.

let string = "12.1gh34.5abc32.1"
let numbers = string.components(separatedBy: .letters)
                    .filter { !$0.isEmpty }
                    .compactMap { Double($0) }

Выход:

[12,1, 34,5, 32,1]

Если вы хотите иметь дело с чем-либо, кроме десятичной цифры или запятой, вы можете заменить .letters на:

CharacterSet(charactersIn: "0123456789.").inverted
3
rmaddy 18 Сен 2018 в 05:57

Вы можете использовать метод Collection split и установить для omittingEmptySubsequences значение true:

extension StringProtocol {
    func notContains(_ element: Element) -> Bool {
        return !contains(element)
    }
    var numbers: [SubSequence] {
        return split(maxSplits: Int.max, omittingEmptySubsequences: true, whereSeparator: "0123456789.".notContains)
    }
}

let text = "12.1gh 34.5abc 32.5"
let result = text.numbers                // ["12.1", "34.5", "32.5"]
let nums = result.flatMap(Double.init)   // [12.1, 34.5, 32.5]
0
Leo Dabus 18 Сен 2018 в 11:40