lib/asciimath2unitsml/conv.rb in asciimath2unitsml-0.2.0 vs lib/asciimath2unitsml/conv.rb in asciimath2unitsml-0.2.1
- old
+ new
@@ -33,10 +33,14 @@
end
@parser = parser
@multiplier = multiplier(options[:multiplier] || "\u00b7")
end
+ def float_to_display(f)
+ ret = f.to_f.round(1).to_s.sub(/\.0$/, "")
+ end
+
def prefix(units)
units.map { |u| u[:prefix] }.reject { |u| u.nil? }.uniq.map do |p|
<<~END
<Prefix xmlns='#{UNITSML_NS}' prefixBase='#{@prefixes[p].base}'
prefixPower='#{@prefixes[p].power}' xml:id='#{@prefixes[p].id}'>
@@ -59,31 +63,33 @@
END
end
def units2dimensions(units)
norm = decompose_units(units)
- return if norm.any? { |u| u[:unit] == "unknown" || u[:prefix] == "unknown" }
+ return if norm.any? { |u| u[:unit] == "unknown" || u[:prefix] == "unknown" || u[:unit].nil? }
norm.map do |u|
{ dimension: U2D[u[:unit]][:dimension],
unit: u[:unit],
exponent: u[:exponent] || 1,
symbol: U2D[u[:unit]][:symbol] }
end.sort { |a, b| U2D[a[:unit]][:order] <=> U2D[b[:unit]][:order] }
end
def dimension1(u)
- %(<#{u[:dimension]} symbol="#{u[:symbol]}" powerNumerator="#{u[:exponent]}"/>)
+ %(<#{u[:dimension]} symbol="#{u[:symbol]}" powerNumerator="#{float_to_display(u[:exponent])}"/>)
end
def dim_id(dims)
return nil if dims.nil? || dims.empty?
dimhash = dims.each_with_object({}) { |h, m| m[h[:dimension]] = h }
dimsvector = %w(Length Mass Time ElectricCurrent ThermodynamicTemperature
AmountOfSubstance LuminousIntensity PlaneAngle)
.map { |h| dimhash.dig(h, :exponent) }.join(":")
id = @dimensions_id&.values&.select { |d| d.vector == dimsvector }&.first&.id and return id.to_s
- "D_" + dims.map { |d| U2D[d[:unit]][:symbol] + (d[:exponent] == 1 ? "" : d[:exponent].to_s) }.join("")
+ "D_" + dims.map do |d|
+ U2D[d[:unit]][:symbol] + (d[:exponent] == 1 ? "" : float_to_display(d[:exponent]))
+ end.join("")
end
def decompose_units(units)
gather_units(units_only(units).map { |u| decompose_unit(u) }.flatten)
end
@@ -92,37 +98,38 @@
units.sort { |a, b| a[:unit] <=> b[:unit] }.each_with_object([]) do |k, m|
if m.empty? || m[-1][:unit] != k[:unit] then m << k
else
m[-1] = { prefix: combine_prefixes(@prefixes[m[-1][:prefix]], @prefixes[k[:prefix]]),
unit: m[-1][:unit],
- exponent: (k[:exponent]&.to_i || 1) + (m[-1][:exponent]&.to_i || 1) }
+ exponent: (k[:exponent]&.to_f || 1) + (m[-1][:exponent]&.to_f || 1) }
end
end
end
# treat g not kg as base unit: we have stripped the prefix k in parsing
# reduce units down to basic units
def decompose_unit(u)
- if u[:unit] == "g" then u
+ if u[:unit].nil? then u
+ elsif u[:unit] == "g" then u
elsif @units[u[:unit]].system_type == "SI_base" then u
elsif !@units[u[:unit]].si_derived_bases
{ prefix: u[:prefix], unit: "unknown", exponent: u[:exponent] }
else
@units[u[:unit]].si_derived_bases.each_with_object([]) do |k, m|
m << { prefix: !k[:prefix].nil? && !k[:prefix].empty? ?
combine_prefixes(@prefixes_id[k[:prefix]], @prefixes[u[:prefix]]) : u[:prefix],
unit: @units_id[k[:id]].symbolid,
- exponent: (k[:power]&.to_i || 1) * (u[:exponent]&.to_i || 1) }
+ exponent: (k[:power]&.to_i || 1) * (u[:exponent]&.to_f || 1) }
end
end
end
def combine_prefixes(p1, p2)
return nil if p1.nil? && p2.nil?
return p1.symbolid if p2.nil?
return p2.symbolid if p1.nil?
return "unknown" if p1.base != p2.base
- @prefixes.each do |p|
+ @prefixes.each do |_, p|
return p.symbolid if p.base == p1.base && p.power == p1.power + p2.power
end
"unknown"
end