diff --git a/lib/more_core_extensions/core_ext/string.rb b/lib/more_core_extensions/core_ext/string.rb index b877dff..472ffae 100644 --- a/lib/more_core_extensions/core_ext/string.rb +++ b/lib/more_core_extensions/core_ext/string.rb @@ -1,3 +1,4 @@ require 'more_core_extensions/core_ext/string/formats' require 'more_core_extensions/core_ext/string/hex_dump' require 'more_core_extensions/core_ext/string/iec60027_2' +require 'more_core_extensions/core_ext/string/decimal_suffix' diff --git a/lib/more_core_extensions/core_ext/string/decimal_suffix.rb b/lib/more_core_extensions/core_ext/string/decimal_suffix.rb new file mode 100644 index 0000000..df6ea02 --- /dev/null +++ b/lib/more_core_extensions/core_ext/string/decimal_suffix.rb @@ -0,0 +1,17 @@ +module MoreCoreExtensions + module DecimalSI + DECIMAL_SUFFIXES = {"d" => 1e-1, "c" => 1e-2, "m" => 1e-3, "μ" => 1e-6, "n" => 1e-9, "p" => 1e-12, "f" => 1e-15, + "a" => 1e-18, "h" => 1e2, "k" => 1e3, "M" => 1e6, "G" => 1e9, "T" => 1e12, "P" => 1e15, + "E" => 1e18}.freeze + def decimal_si_to_f + multiplier = DECIMAL_SUFFIXES[self[-1]] + if multiplier + Float(self[0..-2]) * multiplier + else + Float(self) + end + end + end +end + +String.send(:prepend, MoreCoreExtensions::DecimalSI) diff --git a/spec/core_ext/string/decimal_suffix_spec.rb b/spec/core_ext/string/decimal_suffix_spec.rb new file mode 100644 index 0000000..e394bfb --- /dev/null +++ b/spec/core_ext/string/decimal_suffix_spec.rb @@ -0,0 +1,21 @@ +describe String do + it '#decimal_si_to_f' do + expect("1f".decimal_si_to_f).to eq(0.000_000_000_000_001) + expect("1p".decimal_si_to_f).to eq(0.000_000_000_001) + expect("1n".decimal_si_to_f).to eq(0.000_000_001) + expect("1μ".decimal_si_to_f).to eq(0.000_001) + expect("1m".decimal_si_to_f).to eq(0.001) + expect("1c".decimal_si_to_f).to eq(0.01) + expect("1d".decimal_si_to_f).to eq(0.1) + expect("1".decimal_si_to_f).to eq(1.0) + expect("1k".decimal_si_to_f).to eq(1_000.0) + expect("1M".decimal_si_to_f).to eq(1_000_000.0) + expect("1G".decimal_si_to_f).to eq(1_000_000_000.0) + expect("1T".decimal_si_to_f).to eq(1_000_000_000_000.0) + expect("1P".decimal_si_to_f).to eq(1_000_000_000_000_000.0) + expect("1E".decimal_si_to_f).to eq(1_000_000_000_000_000_000.0) + + expect("1e9".decimal_si_to_f).to eq(1_000_000_000.0) + expect("1e-9".decimal_si_to_f).to eq(0.000_000_001) + end +end