forked from faker-ruby/faker
/
number.rb
97 lines (76 loc) · 2.14 KB
/
number.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# frozen_string_literal: true
module Faker
class Number < Base
class << self
extend Gem::Deprecate
def number(digits = 10)
return if digits < 1
return 0 if digits == 1
# Ensure the first digit is not zero
([non_zero_digit] + generate(digits - 1)).join.to_i
end
def decimal(l_digits = 5, r_digits = 2)
l_d = number(l_digits).to_s
r_d = if r_digits == 1
0
else
# Ensure the last digit is not zero
# so it does not get truncated on converting to float
generate(r_digits - 1).join + non_zero_digit.to_s
end
"#{l_d}.#{r_d}".to_f
end
def non_zero_digit
rand(1..9)
end
def digit
rand(10)
end
def hexadecimal(digits = 6)
hex = ''
digits.times { hex += rand(15).to_s(16) }
hex
end
def normal(mean = 1, standard_deviation = 1)
theta = 2 * Math::PI * rand
rho = Math.sqrt(-2 * Math.log(1 - rand))
scale = standard_deviation * rho
mean + scale * Math.cos(theta)
end
def between(from = 1.00, to = 5000.00)
Faker::Base.rand_in_range(from, to)
end
def within(range = 1.00..5000.00)
between(range.min, range.max)
end
def positive(from = 1.00, to = 5000.00)
random_number = between(from, to)
greater_than_zero(random_number)
end
def negative(from = -5000.00, to = -1.00)
random_number = between(from, to)
less_than_zero(random_number)
end
private
def generate(count)
return [] if count.zero?
Array.new(count) { digit }
end
def greater_than_zero(number)
should_be(number, :>)
end
def less_than_zero(number)
should_be(number, :<)
end
def should_be(number, method_to_compare)
if number.send(method_to_compare, 0)
number
else
number * -1
end
end
deprecate :decimal_part, nil, 2019, 06
deprecate :leading_zero_number, nil, 2019, 06
end
end
end