首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字符串中提取货币和价格值

从字符串中提取货币和价格值
EN

Stack Overflow用户
提问于 2015-08-21 20:07:39
回答 2查看 1.3K关注 0票数 1

我正试图找到一种从字符串中提取货币和价格价值的好方法。它应该适用于多种货币。零件…

  • 提取数字-可以是int值或十进制值。
  • 检测附近的货币符号,以将其与货币代码匹配。
  • 忽略了价格不是- e.g的数字,没有附加在货币指标上

示例

  • 苹果,2倍橘子和草莓,5欧元
  • 苹果,32个桔子和草莓,5.0欧元
  • 苹果,橘子,五欧元和草莓
  • 苹果、桔子和草莓,5欧元

结果

  • 价格编号: 5.0
  • 货币代码和符号:欧元(欧元)

另一个例子

  • “苹果,32个桔子和草莓5美元”→编号: 5.0,货币美元

对于不同的货币,有什么好的方法来解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2015-08-21 20:12:04

您可以为此使用正则表达式。我在框架中使用了以下内容:

代码语言:javascript
复制
class Regex {
  private let internalExpression: NSRegularExpression
  let pattern: String
  var groups:[String]? = nil

  init(_ pattern: String) {
    self.pattern = pattern
    let regex: NSRegularExpression?
    do {
      regex = try NSRegularExpression(pattern: pattern, options: .CaseInsensitive)
    } catch let error as NSError {
      fatalError("Invalid pattern '\(pattern)` (\(error))")
    }
    internalExpression = regex!
  }

  init(_ pattern: String, options: NSRegularExpressionOptions) {
    self.pattern = pattern
    let regex: NSRegularExpression?
    do {
      regex = try NSRegularExpression(pattern: pattern, options: options)
    } catch let error as NSError {
      fatalError("Invalid pattern '\(pattern)` (\(error))")
    }
    internalExpression = regex!
  }

  func test(input: String) -> Bool {
    let matches = self.internalExpression.matchesInString(input, options: [], range:NSMakeRange(0, input.characters.count)) as [NSTextCheckingResult]
    if matches.count == 0 { groups = nil; return false }
    if internalExpression.numberOfCaptureGroups > 0 {
      groups = [String]()
      let match = matches[0] as NSTextCheckingResult
      for index in 1..<match.numberOfRanges {
        let range = match.rangeAtIndex(index)
        if range.location == 9223372036854775807 { groups!.append("") }
        else { groups!.append((input as NSString).substringWithRange(range)) }
      }
    }
    return true
  }

  func match(index:Int) -> String? {
    return groups![index]
  }
}

然后你可以检查一下

代码语言:javascript
复制
let regexEuro = Regex("(\\d+(\\.\\d+)?) *€")
let regexDollar = Regex("\\$ *(\\d+(\\.\\d+)?)")
if regexEuro.test("This is 20 € ...") {
  print(regexEuro.match(0))
}
if regexDollar.test("This is $ 20.3 ...") {
  print(regexDollar.match(0))
}
票数 2
EN

Stack Overflow用户

发布于 2019-02-13 17:14:37

上述Thomas post的Regex框架更新为Swift 4

代码语言:javascript
复制
class Regex {
    private let regex: NSRegularExpression
    let pattern: String
    var groups: [String] = []
    init(_ pattern: String, options: NSRegularExpression.Options = []) throws {
        self.pattern = pattern
        regex = try NSRegularExpression(pattern: pattern, options: options)
    }
    func contains(string: String) -> Bool {
        groups = []
        let matches = regex.matches(in: string, options: [], range: NSMakeRange(0, string.utf16.count)) as [NSTextCheckingResult]
        guard !matches.isEmpty else {
            return false
        }
        if regex.numberOfCaptureGroups > 0,
        let firstMatch = matches.first {
            for index in 1..<firstMatch.numberOfRanges {
                let range = firstMatch.range(at: index)
                if range.location == .max {
                    groups.append("")
                } else {
                    groups.append((string as NSString).substring(with: range))
                }
            }
        }
        return true
    }
    func match(index: Int) -> String? {
        return groups[index]
    }
}
代码语言:javascript
复制
let regexEuro = try! Regex("(\\d+(\\.\\d+)?) *€")
let regexDollar = try! Regex("\\$ *(\\d+(\\.\\d+)?)")
if regexEuro.contains(string: "This costs 20€"),
    let value = regexEuro.match(index: 0) {
    print("Euro value:", value)  // "20\n"
}

if regexDollar.contains(string: "This costs $20.3"),
    let value = regexDollar.match(index: 0) {
    print("Dolar value:", value)  // "20.3\n"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32148507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档