diff --git a/CHANGELOG.md b/CHANGELOG.md index d2e638b..1cd27d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Note: This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.1.0] - 2026-01-23 +### Added +- Added `to_f` formatter, which converts a string to a float value. + ## [3.0.0] - 2025-11-25 ### Added - Added optional context_overrides argument for the following methods: diff --git a/Gemfile.lock b/Gemfile.lock index 738b734..c57c30e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - parameter_substitution (3.0.0) + parameter_substitution (3.1.0) activesupport (>= 6.0) builder (~> 3.2) invoca-utils (~> 0.3) diff --git a/lib/parameter_substitution/formatters/to_f.rb b/lib/parameter_substitution/formatters/to_f.rb new file mode 100644 index 0000000..c9309b6 --- /dev/null +++ b/lib/parameter_substitution/formatters/to_f.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class ParameterSubstitution::Formatters::ToF < ParameterSubstitution::Formatters::Base + def self.description + "Converts a string to a double-precision floating point number" + end + + def self.format(value) + Float(value).round(2) rescue nil + end +end \ No newline at end of file diff --git a/lib/parameter_substitution/version.rb b/lib/parameter_substitution/version.rb index 8ca92eb..b42d1e9 100644 --- a/lib/parameter_substitution/version.rb +++ b/lib/parameter_substitution/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true class ParameterSubstitution - VERSION = "3.0.0" + VERSION = "3.1.0" end diff --git a/spec/lib/parameter_substitution/formatters/to_f_spec.rb b/spec/lib/parameter_substitution/formatters/to_f_spec.rb new file mode 100644 index 0000000..9d117f1 --- /dev/null +++ b/spec/lib/parameter_substitution/formatters/to_f_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require_relative '../../../../lib/parameter_substitution/formatters/to_f' + +describe ParameterSubstitution::Formatters::ToF do + context "ToF formatter test" do + before do + @format_class = ParameterSubstitution::Formatters::ToF + end + + it "have a key" do + expect(@format_class.key).to eq("to_f") + end + + it "provide a description" do + expect(@format_class.description).to eq("Converts a string to a double-precision floating point number") + end + + it "converts valid string to float rounded to 2 decimal places" do + expect(@format_class.format("123.456")).to eq(123.46) + expect(@format_class.format("0.001")).to eq(0.00) + expect(@format_class.format("-9876.54321")).to eq(-9876.54) + expect(@format_class.format("123")).to eq(123.0) + expect(@format_class.format("123.4")).to eq(123.4) + end + + it "returns nil for nil or invalid strings" do + expect(@format_class.format(nil)).to eq(nil) + expect(@format_class.format("")).to eq(nil) + expect(@format_class.format("$123.4")).to eq(nil) + expect(@format_class.format("not_a_number")).to eq(nil) + end + end +end \ No newline at end of file