2016-04-26 10 views
0

Dies ist Swift 2.1.Extrahieren Währung von String

Wie würden Sie eine Menge aus einer Zeichenfolge extrahieren, die aussieht wie "add ei (£ 2.00)"? In diesem Beispiel würde ich den Abschnitt "2.00" benötigen.

Wäre es ein harter Check, um herauszufinden, was zwischen den Klammern eingeschlossen ist? Oder gibt es einen effektiveren Weg? I.e. Regex oder etwas?

+0

Ihre Zeichenfolge sollte immer in diesem Muster "Ei (£ 2.00) hinzufügen"? Ich meine, "add )" – NSAnant

+0

Für jetzt, ja. Aber ich möchte die Dinge dynamischer halten, für den Fall, dass sich das Muster in der Zukunft ändern muss, und dabei entlang der Regex-Linie denken. – Polis

+0

für Regex, Sie benötigen einen festen Patten zu entsprechen. – NSAnant

Antwort

0

ist Es gibt viele Möglichkeiten zu erreichen, was Sie wollen - hier ist ein einfaches Beispiel mit einem regulären Ausdruck.

Ich verwende (?<=\\()[^\\)]+ etwas zwischen ( und ) zu finden, dann verwende ich ein paar Bereiche, die Werte zu extrahieren: eine für das Währungssymbol, ein anderer für den Wert.

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

Rufen Sie die Methode auf einem String dann auspacken sicher die optionalen Ergebnisse:

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

Drucke:

Währung '£' und Wert '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) 

// Diese druckt 2.00

+0

Warum abgelehnt, es funktioniert, was ist falsch daran, wenn Sie es getestet haben? –

+0

das war ich nicht :) Wird es heute Abend versuchen. – Polis

1

'pure' Schnelle Lösung, keine Klammern erforderlich

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

, wenn Sie wirklich die Klammern dort benötigen, kein Problem ...

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

danke das ist großartig, aber ich habe die reggex Antwort akzeptiert, da es näher an meinen Anforderungen ist – Polis