2016-04-26 5 views
0

これはSwift 2.1です。文字列からの通貨の抽出

「卵を追加(£2.00)」のような文字列から量を抽出するにはどうすればよいですか?この例では、「2.00」部分が必要です。

括弧で囲まれたものを探しているのは難しいですか?それとももっと効果的な方法がありますか?私。正規表現か何か?

+0

あなたの文字列がなければならない、常にこのパターンでは "卵(£2.00)を追加していませんか"? "add (£)" – NSAnant

+0

今のところはyesです。しかし、パターンが将来変更される必要がある場合に備えて、私は物事をよりダイナミックに保ちたいので、正規表現の線に沿って考えてください。正規表現のために – Polis

+0

、あなたは一致する修正pattenが必要です。 – NSAnant

答えて

0

印刷します - ここに正規表現との単純な例です。

私はその後、私は値を抽出する範囲のカップルを使用し、()の間に何かを見つけるために(?<=\\()[^\\)]+を使用しています:通貨記号の1、値のために別のものを。

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' です

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) 
    } 
} 

コール文字列の方法は、安全に、オプションの結果をアンラップ

-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

ありがとう、これは素晴らしいですが、それは私の要件に近いので、私は正規表現の答えを受け入れました – Polis