Если вы используете регулярное выражение, вы можете извлечь только строку с числовым выражением. Предполагая, что дополнительные слова находятся в начале (как вы сказали в комментарии), вы можете сделать следующее:
- Поиск числового выражения с использованием регулярного выражения, в этом случае выражение представляет собой число, за которым следует одно слово.
\d+(\.\d+)*\s+\w+
- Убедитесь, что выражение найдено
range.location != NSNotFound
- Извлечь совпадение в
String
Вы можете добавить всего три строки в ваш код, и он должен работать нормально, примерно так:
extension NSString {
public var asNum: NSNumber {
let stringValue = self
let range = stringValue.range(of: #"\d+(\.\d+)*\s+\w+"#,
options: .regularExpression)
guard range.location != NSNotFound else { return -1 }
let numberExpression = stringValue.substring(with: range)
let formatter = NumberFormatter()
formatter.isLenient = true
formatter.numberStyle = .spellOut
return formatter.number(from: numberExpression) ?? -1
}
}
Если мы следуем предложению @rmaaddy о возвращении необязательного значения вместо «магического числа» -1, то код выглядит следующим образом:
extension NSString {
public var asNum: NSNumber? {
let stringValue = self
let range = stringValue.range(of: #"\d+(\.\d+)*\s+\w+"#,
options: .regularExpression)
guard range.location != NSNotFound else { return nil }
let numberExpression = stringValue.substring(with: range)
let formatter = NumberFormatter()
formatter.isLenient = true
formatter.numberStyle = .spellOut
return formatter.number(from: numberExpression) ?? nil
}
}