Преобразуйте большие смешанные числовые и текстовые числа в числа в Swift или Objective-C - PullRequest
0 голосов
/ 04 апреля 2019

Метод spellout NSFormatter позволяет преобразовать слово в число.stringByReplacingOccurrencesOfString NSString позволяет преобразовывать строки, такие как тысячи, в 1000. И вы можете выбирать целые числа из строк, используя NSCharacterSet.Однако я борюсь с тем, как преобразовать смесь чисел и строк, например, about 2.4 million или comes to 5 hundred в число.Проблема состоит в том, чтобы изолировать «2,4 миллиона» от «около» или другого текста.

Применение орфографии к «2,4 миллионам» дает 2400000. Однако применение этого значения к «примерно 2,4 миллионам» дает ошибку.

extension NSString {
    public var asNum: NSNumber {
       // let stringValue = String(value: self)
        let stringValue = self
        let formatter = NumberFormatter()
        formatter.isLenient = true
        formatter.numberStyle = .spellOut
        return formatter.number(from: stringValue as String) ?? -1
    }
}

Как выделить только те термины, которые являются частью действительного числа?

1 Ответ

1 голос
/ 04 апреля 2019

Если вы используете регулярное выражение, вы можете извлечь только строку с числовым выражением. Предполагая, что дополнительные слова находятся в начале (как вы сказали в комментарии), вы можете сделать следующее:

  • Поиск числового выражения с использованием регулярного выражения, в этом случае выражение представляет собой число, за которым следует одно слово. \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
    }
}
...