From c24a2ed0488e2c3b71749d548d6954b843f50268 Mon Sep 17 00:00:00 2001 From: Andrey Molchanov Date: Tue, 13 Dec 2016 23:32:30 +0300 Subject: [PATCH] Add precision option to to_words (#134) --- .travis.yml | 3 +-- CHANGELOG.md | 4 +++- README.rdoc | 9 +++++++++ lib/numbers_and_words/wrappers/float.rb | 16 ++++++++++++++-- .../float/fixture_examples/ru.yml | 13 +++++++++++++ 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1cc23937..e9d90588 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ rvm: - 2.2 - 2.3 - - jruby-9.0.5.0 - - rbx + - jruby-9.1.6.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index eab47c04..e8b8d32a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ -## 0.11.6 (Next) +## 0.10.6 (Next) +### Features * Your contribution here. + * Add option `precision` to `to_words`. \[[#134](https://github.com/kslazarev/numbers_and_words/issues/134)\] \([@neodelf](https://github.com/neodelf)\) \(assignee: [@neodelf](https://github.com/neodelf)\) ### Bugs * Fix README typo for 231 in French. \(assignee: [@poilon](https://github.com/poilon)\) diff --git a/README.rdoc b/README.rdoc index 5ab7d260..992e5d68 100644 --- a/README.rdoc +++ b/README.rdoc @@ -241,6 +241,15 @@ I18n kütüphanesi ile sayıları yazıya çevirir. I18n.with_locale(:hu) { 21.to_words ordinal: true } => "huszonegyedik" +== Other options / Другие опции + +* precision + + You may pass argument :precision that added zeros to the end of float number: + + I18n.with_locale(:ru) { 0.1.to_words precision: 3 } + => ноль целых и десять сотых + == Requirements / Требования / Configuration Requise * 1.9.3 <= Ruby (compatible with/совместимость с/compatible avec Ruby 1.9, JRuby and/и/et Rubinius); diff --git a/lib/numbers_and_words/wrappers/float.rb b/lib/numbers_and_words/wrappers/float.rb index 73eee541..cbe80a63 100644 --- a/lib/numbers_and_words/wrappers/float.rb +++ b/lib/numbers_and_words/wrappers/float.rb @@ -1,6 +1,8 @@ module NumbersAndWords module Wrappers class Float + ZERO_SYMBOL = '0' + attr_accessor :number def initialize number @@ -8,6 +10,7 @@ def initialize number end def to_words options = {} + @options = options words = [] words << integral_part_with(options) words << fractional_part_with(options) unless fractional_part_is_nil? @@ -16,6 +19,8 @@ def to_words options = {} private + attr_accessor :options + def parts number.to_s.split '.' end @@ -25,7 +30,9 @@ def integral_part end def fractional_part - parts.last + part = parts.last + part += ZERO_SYMBOL*(precision - part.length) if precision + part end def integral_part_with options @@ -41,12 +48,17 @@ def integral_options end def fractional_options - {:fractional => {:length => fractional_part.length}} + length = precision || fractional_part.length + {:fractional => {:length => length}} end def fractional_part_is_nil? 0 == fractional_part.to_i end + + def precision + options.fetch(:precision, nil) + end end end end diff --git a/spec/numbers_and_words/float/fixture_examples/ru.yml b/spec/numbers_and_words/float/fixture_examples/ru.yml index d9d60ec2..3e3c68b8 100644 --- a/spec/numbers_and_words/float/fixture_examples/ru.yml +++ b/spec/numbers_and_words/float/fixture_examples/ru.yml @@ -15,3 +15,16 @@ to_words: 21.77: двадцать одна целая и семьдесят семь сотых 111.999: сто одиннадцать целых и девятьсот девяносто девять тысячных 4242.7463: четыре тысячи двести сорок двe целых и семь тысяч четыреста шестьдесят три десяти тысячных + fractions_with_precision: + options: + :precision: 2 + 0.1: ноль целых и десять сотых + options: + :precision: 3 + 0.1: ноль целых и одна тысяча десять десяти тысячных + 0.11: ноль целых и одна тысяча сто десяти тысячных + options: + :precision: 4 + 0.1: ноль целых и одна тысяча десяти тысячных + 0.11: ноль целых и одна тысяча сто десяти тысячных + 0.101: ноль целых и одна тысяча десять десяти тысячных