class Eng::Calc
Attributes
alter[RW]
error[RW]
Public Instance Methods
calc(formula)
click to toggle source
# File lib/eng_calc.rb, line 15 def calc(formula) return nil unless formula begin c = { value: "", unit: [], si_formula: "", error: [] } split_value_unit(formula.gsub("×","*").gsub("⋅","*").gsub("÷","/")).map do |e_formula| if e_formula[:unit].nil? c[:value] << e_formula[:value].to_f.to_s + "r" c[:si_formula] << e_formula[:value] elsif e_formula[:value] =~ /#{operator_reg(:ari)}/ c[:value] << e_formula[:value] c[:unit] << e_formula[:value] c[:si_formula] << " " + e_formula[:value] + " " else result = convert(e_formula) result[:value].to_f c[:value] << result[:value].to_f.rationalize.to_s + "r" c[:unit] << result[:unit].unshift("(").push(")") c[:error] << result[:error] unless result[:error].nil? || result[:error].empty? c[:si_formula] << result[:value].to_s + " " + result[:unit].join end end c_unit = calc_unit(c[:unit].flatten) { value: eval(c[:value]).to_f, unit: c_unit[:unit], error: (c[:error] << c_unit[:error]).flatten.compact, si_formula: c[:si_formula] } rescue StandardError, SyntaxError { value: "error", unit: "", error: [{ undifined: "undifined formula" }], si_formula: formula} end end
each_value(value: , si_unit: nil, kind: nil)
click to toggle source
# File lib/eng_calc.rb, line 50 def each_value(value: , si_unit: nil, kind: nil) value = value.to_f.rationalize kind = Unit.kind_by_si(si_unit) if si_unit return [{kind: false, result: false}] unless kind kind.inject([]) do |a,k| if Unit.variable[k] results = Unit.variable[k].map do |unit| { unit: unit[0], value: eval(liner_function(unit[1])).to_f } end else results = nil end a << { kind: k, result: results } end end