【问题标题】:Convert large mixed numerical and text numbers into numbers in Swift or Objective-C在 Swift 或 Objective-C 中将大的混合数字和文本数字转换为数字
【发布时间】:2019-08-25 14:57:29
【问题描述】:

NSFormatter 的spellout 方法可让您将单词转换为数字。 NSString 的stringByReplacingOccurrencesOfString 可让您将千位等字符串转换为1000。您可以使用NSCharacterSet 从字符串中挑选整数。但是,我正在努力解决如何将数字和字符串的混合,例如 about 2.4 millioncomes to 5 hundred 转换为数字。问题是将“240 万”从“关于”或其他文本中分离出来。

将拼写应用于“240 万”会产生 2400000。但是,将其应用于“大约 240 万”会产生错误。

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 之类的幻数。将返回值设为可选,并为无效数字返回 nil
  • 您希望忽略的多余单词是否总是在文本的开头?您可以尝试将字符串解析为数字。如果失败,请删除第一个单词并重试。继续删除下一个引导词,直到它起作用或文本用完为止。
  • 是的,它们通常在开头。会试一试

标签: swift nsstring nscharacterset nsformatter


【解决方案1】:

如果您使用正则表达式,您可以只提取带有数字表达式的字符串。假设多余的单词在开头(正如您在评论中所说),您可以执行以下操作:

  • 使用正则表达式搜索数字表达式,在这种情况下,表达式是一个数字后跟一个单词。 \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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多