に変換せずに、のlength
を見つけたい。Fixnum
num
String
つまり、メソッドnum
を呼び出さずに入っている桁数は次のとおりです。.to_s()
num.to_s.length
Ruby 2.4 にはInteger#digitsメソッドがあり、数字を含む配列を返します。
num = 123456
num.digits
# => [6, 5, 4, 3, 2, 1]
num.digits.count
# => 6
編集:
負の数を処理するには (@MatzFan に感謝)、絶対値を使用します。整数#abs
-123456.abs.digits
# => [6, 5, 4, 3, 2, 1]
上位投票のループは優れていますが、あまり Ruby ではなく、多数の場合は遅くなります。.to_s は組み込み関数であるため、はるかに高速になります。ALMOST 普遍的な組み込み関数は、構築されたループや反復子よりもはるかに高速です。
別の方法:
def ndigits(n)
n=n.abs
(1..1.0/0).each { |i| return i if (n /= 10).zero? }
end
ndigits(1234) # => 4
ndigits(0) # => 1
ndigits(-123) # => 3
正規表現を使用したくない場合は、次の方法を使用できます。
def self.is_number(string_to_test)
is_number = false
# use to_f to handle float value and to_i for int
string_to_compare = string_to_test.to_i.to_s
string_to_compare_handle_end = string_to_test.to_i
# string has to be the same
if(string_to_compare == string_to_test)
is_number = true
end
# length for fixnum in ruby
size = Math.log10(string_to_compare_handle_end).to_i + 1
# size has to be the same
if(size != string_to_test.length)
is_number = false
end
is_number
end
派手にする必要はありません。これと同じくらい簡単にできます。
def l(input)
output = 1
while input - (10**output) > 0
output += 1
end
return output
end
puts l(456)