Swift-y способ разбора целочисленных строк с префиксом, таких как NSString - PullRequest
0 голосов
/ 14 октября 2019

Примите во внимание следующее:

Int("30 minutes") // nil
("30 minutes" as NSString).integerValue // 30

Какой более быстрый способ получить 30 от 30 minutes?

Учитывая, что это может быть 30mins или30\tminudos или 30 मिनट.

Метод NSString был удобен, потому что он вел себя подобно JavaScript - разбирался до первого нецелого символа.

Обновление Примечание: точно так же, какв функции JS parseInt, если в моей строке больше цифр, кроме строковых символов, например 30mins3, приведение к NSString возвращает только первый символ, например

("30mins3" as NSString).integerValue // 30

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Вы можете создать следующую функцию, которая находит первое нечисловое значение, а затем создает подстроку детали до этого символа и преобразует ее в целое число

extension String {
    func integerValue() -> Int? {
        if let index = self.firstIndex(where: {!$0.isNumber && $0.isASCII}) {
            return Int(self.prefix(upTo: index))
        }
        return nil
    }
}

или, альтернативно, использует prefix(while:)

extension String {
    func integerValue() -> Int? {
        return Int(self.prefix(while: {$0.isNumber && $0.isASCII})) 
    }
}

Пример

let strings = ["30 minutes", "30min3", "gfd"]
for str in strings {
    if let number = str.integerValue() {
        print(number)
    }
}

выходы

30
30

1 голос
/ 14 октября 2019

Вы можете попробовать этот код, чтобы получить все Int из вашей строки.

var str = "30mins"
let result = str.filter { ("0"..."9").contains($0)}
print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...