これはSwift 2.1です。文字列からの通貨の抽出
「卵を追加(£2.00)」のような文字列から量を抽出するにはどうすればよいですか?この例では、「2.00」部分が必要です。
括弧で囲まれたものを探しているのは難しいですか?それとももっと効果的な方法がありますか?私。正規表現か何か?
これはSwift 2.1です。文字列からの通貨の抽出
「卵を追加(£2.00)」のような文字列から量を抽出するにはどうすればよいですか?この例では、「2.00」部分が必要です。
括弧で囲まれたものを探しているのは難しいですか?それとももっと効果的な方法がありますか?私。正規表現か何か?
印刷します - ここに正規表現との単純な例です。
私はその後、私は値を抽出する範囲のカップルを使用し、(
と)
の間に何かを見つけるために(?<=\\()[^\\)]+
を使用しています:通貨記号の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)
}
}
コール文字列の方法は、安全に、オプションの結果をアンラップ
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]
*/
ありがとう、これは素晴らしいですが、それは私の要件に近いので、私は正規表現の答えを受け入れました – Polis
あなたの文字列がなければならない、常にこのパターンでは "卵(£2.00)を追加していませんか"? "add(£)" –
NSAnant
今のところはyesです。しかし、パターンが将来変更される必要がある場合に備えて、私は物事をよりダイナミックに保ちたいので、正規表現の線に沿って考えてください。正規表現のために – Polis
、あなたは一致する修正pattenが必要です。 – NSAnant