In Ruby, you can get the first digit of an integer in the following ways:
#Using Integer#digits
You can use the Integer#digits
method in the following way to get the first digit of an integer:
- Convert integer to absolute form;
- Use
Integer#digits
to convert the integer to a reversed array of digits (i.e. last digit appearing first and first digit appearing last in the resulting array); - Access the last index of the array (which would have the first digit);
- Add back the minus sign if the number was originally negative.
For example, you can implement this like so:
def first_digit(num)
digit = num.abs.digits[-1]
digit *= num.negative? ? -1 : 1
end
print first_digit(0) #=> 0
print first_digit(1234) #=> 1
print first_digit(-1234) #=> -1
#Using Regular Expression
You can use regular expression in the following way to get the first digit of an integer:
- Convert integer to string and use
String#slice(regexp)
method with the\d
(or[0-9]
) pattern to get the first digit; - Convert numeric string back to integer;
- Add back the minus sign if the number was originally negative.
For example, you can implement this like so:
def first_digit(num)
digit = num.to_s[/\d/].to_i
digit *= num.negative? ? -1 : 1
end
print first_digit(0) #=> 0
print first_digit(1234) #=> 1
print first_digit(-1234) #=> -1
#Using Floored Division
You can use floored division (i.e. floor(x/y)
) to get the first digit of an integer in the following steps:
- Convert integer to absolute form to get length of the integer;
- Get the quotient (which will be the first digit of the integer) — this is calculated as
floor(int / 10 ** (intLength - 1))
; - Convert the quotient (which would be a float) to integer;
- Add back the minus sign if the number was originally negative.
For example, you can implement this like so:
def first_digit(num)
len = num.abs.to_s.length
divisor = 10 ** (len - 1)
digit = num.abs.fdiv(divisor).to_i
digit *= num.negative? ? -1 : 1
end
print first_digit(0) #=> 0
print first_digit(1234) #=> 1
print first_digit(-1234) #=> -1
This works in the following way:
# num = -1234
# len = 4
# divisor = 10 ^ (4 - 1) = 1000
# digit = floor(1234 / 1000)
# digit = floor(1.234)
# digit = 1
# digit = 1 * -1
# digit = -1
You can also use the Numeric#divmod
method to achieve the same (instead of using Numeric#fdiv
), for example, in the following way:
def first_digit(num)
len = num.abs.to_s.length
divisor = 10 ** (len - 1)
digit, _ = num.abs.divmod(divisor)
digit *= num.negative? ? -1 : 1
end
print first_digit(0) #=> 0
print first_digit(1234) #=> 1
print first_digit(-1234) #=> -1
Numeric#divmod
returns an array with the quotient and the modulus, with the result already converted to integer.
#Using String#slice
You can use the String#slice
method to get the first digit of an integer in the following steps:
- Convert integer to absolute form;
- Convert the absolute value to string and get the first character;
- Convert sliced numeric character back to integer;
- Add back the minus sign if the number was originally negative.
For example, you can implement this like so:
def first_digit(num)
digit = num.abs.to_s[0].to_i
digit *= num.negative? ? -1 : 1
end
print first_digit(0) #=> 0
print first_digit(1234) #=> 1
print first_digit(-1234) #=> -1
This is equivalent to using the String#slice
method, for example, like so:
def first_digit(num)
digit = num.abs.to_s.slice(0).to_i
digit *= num.negative? ? -1 : 1
end
print first_digit(0) #=> 0
print first_digit(1234) #=> 1
print first_digit(-1234) #=> -1
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.