2016-04-26 55 views
0

这是Swift 2.1。从字符串中提取货币

你将如何去提取一个字符串,看起来像“添加蛋(£2.00)”的金额?在这个例子中,我需要“2.00”部分。

难道要检查括号内的任何内容吗?还是有更有效的方法呢?即正则表达式或什么?

+0

你的字符串“加鸡蛋(£2.00)”应该总是在这种模式? 我的意思是,“添加(£)” – NSAnant

+0

现在,是的。但是,如果模式需要在未来发生变化,我想让事情更具活力,从而按照正则表达式思考。 – Polis

+0

为正则表达式,你需要一个修补程序来匹配。 – NSAnant

回答

0

有很多方法可以实现你想要的东西 - 这里有一个简单的例子,用正则表达式。

我使用(?<=\\()[^\\)]+找到()之间的任何东西,然后我用了几个范围,以提取值:一个是货币符号,另一个用于值。

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'

-1
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

+0

为什么投了票,它在工作,当你测试它时有什么问题? –

+0

那不是我:)今晚会试一试。 – Polis

1

'纯'快速解决方案,无需支架

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] 
*/ 
+0

谢谢你,这是伟大的,但我接受了reggex的答案,因为它更接近我的要求 – Polis