SoulverCore 是流行的记事本计算器 Soulver 使用的自然语言数学引擎。
SoulverCore 的主要设计目标是:
在考虑将 SoulverCore 用于您的项目时,请注意以下事项:
在 Xcode 中,转到“File(文件)”>“Swift Packages(Swift 包)”>“Add Package Dependency(添加包依赖项)”,然后粘贴此存储库的 URL (https://github.com/soulverteam/SoulverCore)。
克隆此存储库,并将 SoulverCore.xcframework
拖到 Mac 或 iOS 目标的“General(通用)”设置的“Frameworks, Libraries, and Embedded Content(框架、库和嵌入式内容)”部分。
要计算单个表达式的结果,请使用 Calculator
对象
import SoulverCore
let calculator = Calculator(customization: .standard)
let result = calculator.calculate("123 + 456")
print("The answer is \(result.stringValue)") // prints 579
SoulverCore 可以执行各种计算,包括单位转换、日期和日历数学、速率计算、百分比短语函数、时区转换等等。 它还会巧妙地忽略“无意义”的词语
calculator.calculate("$10 for lunch + 15% tip") // $11.50
calculator.calculate("65 kg in pounds") // 143.3 lb
calculator.calculate("40 as % of 90") // 44.44%
calculator.calculate("$150 is 25% on what") // $120
calculator.calculate("$25/hour * 14 hours of work") // $350.00
calculator.calculate("January 30 2020 + 3 months 2 weeks 5 days") // May 19, 2020
calculator.calculate("9:35am in New York to Japan") // 10:35 pm
calculator.calculate("$25k over 10 years at 7.5%") // $51,525.79 (compound interest)
使用 VariableList
设置表达式中单词或短语的值
let variableList = VariableList(variables:
[
Variable(name: "a", value: "123"),
Variable(name: "b", value: "456"),
]
)
calculator.calculate("a + b", with: variableList) // 579
SoulverCore 遵循系统区域设置的小数点分隔符和千位分隔符。 或者,您可以将标准 EngineCustomization 转换为另一个区域设置
let europeanLocale = Locale(identifier: "en_DE")
let localizedCustomization = EngineCustomization.standard.convertTo(locale: europeanLocale)
let calculator = Calculator(customization: localizedCustomization)
/// In Germany a comma is used as a decimal separator
calculator.calculate("1,2 + 3,4") // 4,6
使用 FormattingPreferences
自定义结果的格式(包括多少位小数,是否应插入千位分隔符等)。
var formattingPreferences = FormattingPreferences()
formattingPreferences.dp = 2 // decimal places
calculator.formattingPreferences = formattingPreferences
calculator.calculate("π") // 3.14
.standard
EngineCustomization
使用硬编码的汇率,适用于 190 种真实世界和加密货币。 您可以(并且应该)通过将 EngineCustomization
上的 currencyRateProvider
设置为符合 CurrencyRateProvider
的对象,为 SoulverCore 提供最新的汇率。
SoulverCore 包含一个 CurrencyRateProvider
,您可以使用它从 欧洲中央银行 获取 33 种流行的法定货币的汇率。
/// This is a currency rate provider that fetches 33 popular fiat currencies from the European Central Bank, no API key required
let ecbCurrencyRateProvider = ECBCurrencyRateProvider()
/// Create a customization with this rate provider
var customizationWithLiveCurrencyRates = EngineCustomization.standard
customizationWithLiveCurrencyRates.currencyRateProvider = ecbCurrencyRateProvider
/// Create a calculator that uses this customization
let calculator = Calculator(customization: customizationWithLiveCurrencyRates)
/// Update to the latest rates...
ecbCurrencyRateProvider.updateRates { success in
if success {
// The standard customization will now have access to the latest currency rates
let result = calculator.calculate("10 USD in EUR")
print(result.stringValue)
}
}
您可以创建自己的符合 CurrencyRateProvider
的对象,以提供您支持的货币代码的汇率。 CurrencyRateProvider
协议具有一个单一方法,该方法返回 1.0 美元可以购买给定货币的数量
func rateFor(request: CurrencyRateRequest) -> Decimal? {
let currencyCode = request.currencyCode // EUR, GBP, BTC, etc
/// - Return an up-to-date rate in the form of how much 1 USD can purchase of the requested currency (i.e 1 USD = x EUR?)
/// - If your rates are in terms of how much USD the requested currency can purchase (i.e 1 EUR = x USD?), remember to take the inverse by dividing 1 by your rate
return <# Currency Rate #>
}
汇率仅在评估时从 CurrencyRateProvider
请求,因此当您的货币汇率数据源更新时,您无需使用新的 EngineCustomization
重新创建 Calculator
。 但是,您必须重新评估您的行或表达式:如果需要,将从您的提供商处获取任何使用的货币的最新汇率。
您可以将自定义单位添加到 Calculator
上的初始化程序所需的 EngineCustomization
对象
/// A good omakase EngineCustomization (the same used by Soulver.app)
var customization: EngineCustomization = .standard
/// Set an array of custom units defined in terms of an existing unit in SoulverCore
customization.customUnits = [
CustomUnit(name: "parrots", definition: 15, equivalentUnit: .centimeters),
CustomUnit(name: "python", definition: 570, equivalentUnit: .centimeters)
]
/// Create a Calculator using this customization
let calculator = Calculator(customization: customization)
/// python and parrots are now recognized as units
calculator.calculate("1 python in parrots") // 38 parrots
SoulverCore 中函数的语法是灵活的。 我们支持传统的 C 风格的“func(x)”函数、Swift 风格的“calculate(withParameter: x)”函数,甚至像“calculate x”这样的自然短语。
您可以将自定义函数对象添加到 Calculator
上的初始化程序所需的 EngineCustomization
。 这是一个自定义函数的示例,该函数从给定数字中减去 1
/// Get the default Engine Customization
var customization: EngineCustomization = .standard
/// A prototype expression is an example of what the user will type to invoke your function
/// - For example, the following function will trigger for any phrase with the form 'number before x', where x is some number
customization.customFunctions = [CustomFunction(prototypeExpression: "number before 9", handler: { parameters in
guard let parameterDecimalValue = parameters[0].decimalValue else {
return EvaluationResult.none
}
return .decimal(parameterDecimalValue - 1.0)
})]
let calculator = Calculator(customization: customization)
let result = calculator.calculate("number before 35")
print(result.stringValue) // prints '34'
变量声明是后跟等号和值的任何短语(即“total expenses = 123”)。
变量声明默认情况下处于关闭状态,但可以在 EngineCustomization
上启用,并在 Calculator
和 LineCollection
上使用。
/// Get the default Engine Customization
var customization: EngineCustomization = .standard
/// Add the variable declarations feature
customization.featureFlags.variableDeclarations = true
/// Use this customization with a new Calculator object
let calculator = Calculator(customization: customization)
_ = calculator.calculate("discount = 10%")
let result = calculator.calculate("$45k - discount") // $40,500.00
SoulverCore 在不到半毫秒的时间内评估计算 ⚡️! 因此,虽然 SoulverCore 类是线程安全的,但它非常快,通常不需要在应用程序的主线程之外执行单个计算。
除了英语,SoulverCore 还完全本地化为德语、俄语、法语、西班牙语和简体中文。
这些不同语言环境的各种数字和日期格式也得到完全支持。
另请注意,非英语语言是累加的,这意味着,例如,德国用户将能够同时使用英语和德语语法。
您可以在 此处 浏览 SoulverCore 的完整文档。
或者,与 Xcode 或 Dash 兼容的 DocC 档案 也可从 下载。
从字符串进行自然语言日期解析
SoulverCore 包含一个强大的自然语言日期解析引擎,它比 Foundation 的 DataDetector
更通用。
请参阅 NaturalLanguageDateParsing 了解 SoulverCore 如何帮助您从字符串中解析自然语言日期,并且可以用于向您的计划或日历应用程序添加自然语言日期输入字段(类似于 Things 和 Fantastical 中找到的功能)。
从字符串中提取数据
请参阅 SoulverStringParsing 了解 SoulverCore 如何帮助您以类型安全的方式从字符串中解析数据。 它使用自然且令人难忘的语法,对于许多任务而言,它比正则表达式更易于使用。
向 NSTextView 或 UITextView 添加计算功能
请参阅 SoulverTextKit 项目,了解如何将 SoulverCore 数学引擎集成到标准 macOS 或 iOS 文本视图中。
您可以在个人或私人项目中使用 SoulverCore。 如果您希望在公开可用或商业项目中使用 SoulverCore,请 给我们发送电子邮件。
我们根据您的用户群规模提供各种选项,包括免费许可(带有署名)。