将大型混合数字和文本数字转换为 Swift 或 Objective-C 中的数字
Convert large mixed numerical and text numbers into numbers in Swift or Objective-C
NSFormatter 的 spellout
方法可让您将单词转换为数字。 NSString 的 stringByReplacingOccurrencesOfString
允许您将诸如千的字符串转换为 1000。并且您可以使用 NSCharacterSet
从字符串中选择整数。但是,我正在努力研究如何将数字和字符串的混合形式(例如 about 2.4 million
或 comes to 5 hundred
转换为数字。问题是将“240 万”与 'about' 或其他文本隔离。
将拼写应用于“240 万”会产生 2400000。但是,将其应用于 "about 2.4 million" 会出错。
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 的建议返回可选值而不是 "magic number" -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
}
}
NSFormatter 的 spellout
方法可让您将单词转换为数字。 NSString 的 stringByReplacingOccurrencesOfString
允许您将诸如千的字符串转换为 1000。并且您可以使用 NSCharacterSet
从字符串中选择整数。但是,我正在努力研究如何将数字和字符串的混合形式(例如 about 2.4 million
或 comes to 5 hundred
转换为数字。问题是将“240 万”与 'about' 或其他文本隔离。
将拼写应用于“240 万”会产生 2400000。但是,将其应用于 "about 2.4 million" 会出错。
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 的建议返回可选值而不是 "magic number" -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
}
}