从字符串中提取货币
这是Swift 2.1。从字符串中提取货币
你将如何去提取一个字符串,看起来像“添加蛋(£2.00)”的金额?在这个例子中,我需要“2.00”部分。
难道要检查括号内的任何内容吗?还是有更有效的方法呢?即正则表达式或什么?
有很多方法可以实现你想要的东西 - 这里有一个简单的例子,用正则表达式。
我使用(?<=\\()[^\\)]+
找到(
和)
之间的任何东西,然后我用了几个范围,以提取值:一个是货币符号,另一个用于值。
extension String {
func extractValueBetweenParenthesis() -> (currency: String?, value: String?) {
if let range = self.rangeOfString("(?<=\\()[^\\)]+", options: .RegularExpressionSearch) {
let cr = range.startIndex..<range.startIndex.advancedBy(1)
let vr = range.startIndex.advancedBy(1)..<range.endIndex
return (currency: self.substringWithRange(cr), value: self.substringWithRange(vr))
}
return (nil, nil)
}
}
呼叫上的字符串的方法然后安全地解开该可选的结果:
let str = "add egg (£2.00)"
let result = str.extractValueBetweenParenthesis()
if let currency = result.currency, value = result.value {
print("Currency is '\(currency)' and value is '\(value)'")
}
打印:
货币是 '£' 和值是 '2.00'
var myString = "add egg (£2.00)"
myString = myString.stringByReplacingOccurrencesOfString("", withString: "")
let components = myString.componentsSeparatedByString("add egg (£")
let finalString = components[1].stringByReplacingOccurrencesOfString(")", withString: "")
print(finalString)
//这将打印2.00
为什么投了票,它在工作,当你测试它时有什么问题? –
那不是我:)今晚会试一试。 – Polis
'纯'快速解决方案,无需支架
let str = ["add egg £ 2.00",
"the price is $12.00 per unit",
"send €10.22 to somebody",
"invalid $(12)"]
func value(str: String, currency: String)->Double {
var chars = str.characters
let currs = currency.characters
while !currs.contains(chars.popFirst() ?? " ") {}
let arr = chars.split(" ")
guard let value = arr.first,
let d = Double(String(value)) else { return Double.NaN }
return d
}
let values = str.flatMap { value($0, currency: "£$€") }
print(values)
/*
[2.0, 12.0, 10.220000000000001, nan]
*/
如果你真的需要有括号,没有问题......
let str = ["add egg (£2.00)",
"the price is ($12.00) per unit",
"send (€10.22) to somebody",
"invalid ($-12)"]
func value(str: String, currency: String)->Double {
var chars = str.characters
let currs = currency.characters
while !currs.contains(chars.popFirst() ?? " ") {}
let arr = chars.split(")")
guard let value = arr.first,
let d = Double(String(value)) else { return Double.NaN }
return d
}
let values = str.flatMap { value($0, currency: "£$€") }
print(values)
/*
[2.0, 12.0, 10.220000000000001, -12.0]
*/
谢谢你,这是伟大的,但我接受了reggex的答案,因为它更接近我的要求 – Polis
你的字符串“加鸡蛋(£2.00)”应该总是在这种模式? 我的意思是,“添加(£)” –
NSAnant
现在,是的。但是,如果模式需要在未来发生变化,我想让事情更具活力,从而按照正则表达式思考。 – Polis
为正则表达式,你需要一个修补程序来匹配。 – NSAnant