如何从Integer获取最右边的数字 - Ruby

时间:2014-11-26 05:10:05

标签: ruby integer digit

我正在制作一个程序,要求我读入并验证一个数字,但这样做我需要取一个两位数的整数(例如我们说18)并将其加1 + 8。现在我让它在我进行条件检查的地方工作,如果它大于10并减去,但在我看来这是一种丑陋的解决方案,并且想知道是否有更清洁的方法吗?

6 个答案:

答案 0 :(得分:10)

您可以使用modulo operator n % 10。例如:

18 % 10
# => 8 
9 % 10
# => 9 
0 % 10
# => 0

修改

Ruby 2.4有一个Integer#digits方法。所以你可以做到

123.digits.first
# => 3

整数#digits方法将从单位的位置开始给出数字作为数组。如果您想处理负数,请使用Integer#abs

123.digits
# =>[3, 2, 1]

答案 1 :(得分:1)

要添加数字中的所有数字,您可以使用以下内容:

18.to_s.chars.map(&:to_i).reduce(:+)

它将数字转换为字符串,将其拆分为数字,将每个数字转换为整数并将它们全部加在一起。

使用任意长度的数字。

答案 2 :(得分:0)

我就是这样做的:

any_number = 1234

# Ensure your input is at most a two digit number (might not be needed)
two_digit_number = any_number % 100                    #=> 34

# Calculate the final addition
total = two_digit_number / 10 + two_digit_number % 10  #=> 7

答案 3 :(得分:0)

对于两位整数,至少可以使用另一种方法:Numeric#divmod,它返回数组中的商和模数。下面是几种不同的数字求和方法的速度:

b = 18
n = 1_000_000
Benchmark.bmbm do |x|
  x.report('to_s:') { n.times { b.to_s.chars.map(&:to_i).reduce(:+) }}
  x.report('divmod:') { n.times { b.divmod(10).reduce(:+) }}
  x.report('direct division:') { n.times { b/10 + b%10 } }
  x.report('digits:') { n.times { a.digits.reduce(:+) } }
end

#####
                       user     system      total        real
to_s:              0.750000   0.000000   0.750000 (  0.750700)
divmod:            0.150000   0.000000   0.150000 (  0.153516)
direct division:   0.080000   0.000000   0.080000 (  0.076697)
digits:            0.560000   0.020000   0.580000 (  0.574687)

答案 4 :(得分:0)

这里有一个有趣的实用解决方案:

def get_digits(n)

  res=[]; i=0;

  while 10**i < n
    res.push( n/10**i%10 )
    i += 1
  end

  return res

end

答案 5 :(得分:-1)

def  digits_sum(number,n)
  number_array=number.to_s.chars  
  n=[n,number_array.length].min
  number_array.slice(-n,n).map {|c| c.to_i }.reduce(:+) || 0
end

此方法返回N个右数位的总和。

digits_sum 123456789,5 => 35
digits_sum 123456789,2 => 17

如果你给N大于数字长度但是如果提供了负数则不会工作

,这将有效