NSFormatter的spellout
方法允许您将单词转换为数字。 NSString的stringByReplacingOccurrencesOfString
允许您将千字节等字符串转换为1000.您可以使用NSCharacterSet
从字符串中选择整数。但是,我正在努力将数字和字符串的混合转换成数字和字符串,例如about 2.4 million
或comes 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
}
}