ons-numbers 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4bbbbb61c50526f46185a58cb58c3e8a496b15a3dd769de5e26b9f22ef225193
4
+ data.tar.gz: d6a5ca3b510c5a142549a7b37d16ff6ea9e2afa73b0966b7dfc118a7fdb83af9
5
+ SHA512:
6
+ metadata.gz: c481ef0423bd833e09aee1c8bb84de5fa4bb7078211c82df9443ea47d79019222b5830e65c2a65b319e0f855f0af569a3d78fb56025e2da83266ef625272523b
7
+ data.tar.gz: a73d32bf1f28924607320255c9fc334255f0678d4167f55f8a31227c860ecac4c048572728923d5e1b121f391eff48efb6a94ef463497b563f24dcf6acc968f4
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # ONS Numbers RubyGem
2
+ A utility class for formatting numbers in common ways. Note that this gem targets Ruby 3.0 and above.
3
+
4
+ ## Installation
5
+
6
+ ```
7
+ gem install ons-numbers
8
+ ```
9
+
10
+ ## Examples
11
+
12
+ ```ruby
13
+ require 'ons-numbers'
14
+
15
+ Numbers.currency(1234.56) # => "£1,234.56"
16
+ Numbers.grouped(1234567) # => "1,234,567"
17
+ Numbers.percentage(75, 100) # => "75.0%"
18
+ ```
19
+
20
+ ## Testing
21
+
22
+ ```
23
+ rake test
24
+ ```
25
+
26
+ ## Licence
27
+ This library is licensed under the MIT licence. Full licence text is available in [LICENCE](LICENCE).
28
+
29
+ ## Copyright
30
+ Copyright (C) 2022 Crown Copyright (Office for National Statistics)
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Class to format numbers in common ways.
4
+ class Numbers
5
+ class << self
6
+ # Returns the passed number formatted as GBP currency e.g. £1,234.56.
7
+ #
8
+ # Params:
9
+ # - number: The number to format.
10
+ def currency(number)
11
+ return '£0' if number.nil?
12
+
13
+ "£#{grouped(format('%.2f', number))}"
14
+ end
15
+
16
+ # Returns the passed number formatted in groups of 1000 e.g 1,000,000. Note that any numbers
17
+ # after the decimal point are preserved unformatted.
18
+ #
19
+ # Params:
20
+ # - number: The number to format.
21
+ #
22
+ # An Argument error is raised if number is nil.
23
+ def grouped(number)
24
+ raise ArgumentError.new('number cannot be nil') if number.nil?
25
+
26
+ whole, decimal = number.to_s.split('.')
27
+ count_groups = whole.to_s.chars.to_a.reverse.each_slice(3)
28
+ whole_with_commas = count_groups.map(&:join).join(',').reverse
29
+ [whole_with_commas, decimal].compact.join('.')
30
+ end
31
+
32
+ # Returns the passed number formatted as a percentage of the passed total.
33
+ #
34
+ # Params:
35
+ # - number: The number which is a percentage of the total.
36
+ # - total: The total.
37
+ #
38
+ # An Argument error is raised if number or total are nil.
39
+ def percentage(number, total)
40
+ raise ArgumentError.new('number cannot be nil') if number.nil?
41
+ raise ArgumentError.new('total cannot be nil') if total.nil?
42
+
43
+ "#{((number.to_f / total.to_f) * 100).round(2)}%"
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ONSNumbers
4
+ module Version
5
+ MAJOR = 1
6
+ MINOR = 0
7
+ TINY = 0
8
+ end
9
+ VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].compact * '.'
10
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ons-numbers/numbers'
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ons-numbers
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - John Topley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-04-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '13.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '13.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.17'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.17'
55
+ description: 'A utility class for formatting numbers in common ways.
56
+
57
+ '
58
+ email:
59
+ - john.topley@ons.gov.uk
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - README.md
65
+ - lib/ons-numbers.rb
66
+ - lib/ons-numbers/numbers.rb
67
+ - lib/ons-numbers/version.rb
68
+ homepage: https://github.com/ONSdigital/ons-numbers
69
+ licenses:
70
+ - MIT
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 3.0.0
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubygems_version: 3.3.3
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: A number formatting library.
91
+ test_files: []