在Swift或Objective-C中将大型混合数字和文本数字转换为数字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Swift或Objective-C中将大型混合数字和文本数字转换为数字相关的知识,希望对你有一定的参考价值。

NSFormatter的spellout方法允许您将单词转换为数字。 NSString的stringByReplacingOccurrencesOfString允许您将千字节等字符串转换为1000.您可以使用NSCharacterSet从字符串中选择整数。但是,我正在努力将数字和字符串的混合转换成数字和字符串,例如about 2.4 millioncomes to 5 hundred。问题是将“240万”与“约”或其他文本隔离开来。

将spellout应用于“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
    }
}

如何仅隔离有效数字中的条款?

答案

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

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

以上是关于在Swift或Objective-C中将大型混合数字和文本数字转换为数字的主要内容,如果未能解决你的问题,请参考以下文章

《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言

《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言

《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言

Swift与Objective-C和Cocoa混合编程的基本设置!

在 Swift 中将用户输入限制为有效的十进制数

将 Objective-C 委托方法与 swift 文件混合