9

に変換せずに、のlengthを見つけたい。FixnumnumString

つまり、メソッドnumを呼び出さずに入っている桁数は次のとおりです。.to_s()

num.to_s.length
4

8 に答える 8

13

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]
于 2016-12-26T17:22:11.723 に答える
4

上位投票のループは優れていますが、あまり Ruby ではなく、多数の場合は遅くなります。.to_s は組み込み関数であるため、はるかに高速になります。ALMOST 普遍的な組み込み関数は、構築されたループや反復子よりもはるかに高速です。

于 2016-03-23T22:03:18.153 に答える
1

別の方法:

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
于 2014-07-08T04:01:06.140 に答える
0

正規表現を使用したくない場合は、次の方法を使用できます。

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
于 2014-05-05T15:26:12.793 に答える
0

派手にする必要はありません。これと同じくらい簡単にできます。

def l(input)
  output = 1
  while input - (10**output) > 0
    output += 1
  end
  return output
end
puts l(456)
于 2019-06-28T17:32:31.140 に答える