今天「暢想資源」就來向大家推薦一款功能強大的數學表達式解析器「DDMathParser」,這一函式庫可以直接將類似 5^(2/(1+2))
類的數學表達式計算出結果,這一開源函式庫的使用可比自帶的 formula.expression.expressionValueWithObject
方便多了
安裝
將以下內容加入你的「Podfile」中即可:(Swift的話同樣也不要忘記 use_frameworks!
這一重要的一行)
1 |
pod 'DDMathParser', '~> 2.0' |
使用
首先要記得先 import
這一函式庫:(注意是「MathParser」)
1 |
import MathParser |
然後試試看算最簡單的一條算式:(記得使用 do { } catch { }
以進行錯誤處理)
1 2 3 4 5 6 7 |
do { let value = try "1 + 2".evaluate() print("Result: \(value)") // "Result: 3.0" } catch let error as NSError { print("Error: \(error.localizedDescription)") } |
如果想要用類似 M
等的變量呢?很簡單:
1 2 3 4 5 6 7 |
do { let value = try "$M + 2".evaluate(["M": 40]) print("Result: \(value)") // "Result: 42.0" } catch let error as NSError { print("Error: \(error.localizedDescription)") } |
而如果你想要計算三角函數的話,則需要自己稍微定義一下是度度量(degree)還是弧度量(radian):
1 2 3 4 5 6 7 8 9 10 11 12 |
do { var evaluator = Evaluator() evaluator.angleMeasurementMode = .Degrees // Or ".Radians" let expression = try Expression(string: "sin(5)") let value = try evaluator.evaluate(expression) print("Result: \(value)") // "Result: 0.0871557427476582" } catch let error as NSError { print("Error: \(error.localizedDescription)") } |
另外如果你的輸入是由用戶進行的話,一定一定一定要記得妥善處理錯誤:
1 2 3 4 5 6 7 |
do { let value = try "1nd.2/23".evaluate() print("Result: \(value)") } catch let error as NSError { print("Error: \(error.localizedDescription)") // "Error: The operation couldn’t be completed. (MathParser.EvaluationError error 0.)" } |
1 2 3 4 5 6 7 |
do { let value = try "1/0".evaluate() print("Result: \(value)") } catch let error as NSError { print("Error: \(error.localizedDescription)") // "Error: The operation couldn’t be completed. (MathParser.EvaluationError error 2.)" } |
大家也可以前往該項目的Github主頁及Wiki查看更多使用方法:
歷史上的今天
2013年:神人論壇回覆(4條評論)