From: rubikitch Date: 2005-12-14T18:25:46+09:00 Subject: [ruby-list:41711] Re: 文字列に格納された頭が 0 で始まる 10 進数の数値への変換 From: Miki Toru Subject: [ruby-list:41710] 文字列に格納された頭が 0 で始まる 10 進数の数値への変換 Date: Wed, 14 Dec 2005 18:18:17 +0900 るびきちです。 > この場合,数値に変換しようと > 関数 Integer やメソッド to_i > を使った場合,挙動が異なります。 お、ほんとだ。 irb(main):240:0> "011".to_i => 11 irb(main):241:0> Integer("011") => 9 > 本来なら 0 で始まる数値は8進数と認識されて然りだと思うの 時と場合によると思いますが…。 たとえば、ファイル名に連番が使われていて、 a-001.txt .. a-099.txt なんてのがあった場合、8進数と認識されたら困ります。 > また,一般的に 0 が頭についた10進数の文字列を > 整数型に変換するには ruby ではどうするのが定石でしょうか > ? String#to_iでしょうか。 String#to_i --- to_i --- to_i(base) ruby 1.7 feature 文字列を 10 進数表現と解釈して、整数に変換します。 p " 10".to_i # => 10 p "010".to_i # => 10 p "-010".to_i # => -10 整数とみなせない文字があればそこまでを変換対象とします。変換対象が 空文字列であれば 0 を返します。 p "0x11".to_i # => 0 hex, oct, to_f, Integer, Float も参照してください。 逆に、数値を文字列に変換するには sprintf, %, Integer#to_s [Integer/to_s] を使用します。 ruby 1.7 feature: 基数を指定することでデフォルトの 10 進以外に 2 〜 36 進数への変換 を行うことができます。また、0 を指定すると prefix により基数を判断 します(逆に prefix を認識するのは 0 を指定したときだけです)。 0, 2 〜 36 以外の引数を指定した場合、例外 ArgumentError が発 生します。 p "0b10".to_i(0) # => 2 p "0o10".to_i(0) # => 8 p "010".to_i(0) # => 8 p "0d10".to_i(0) # => 10 p "0x10".to_i(0) # => 16 Kernel#Integer --- Integer(arg) 引数を整数(Fixnum,Bignum)に変換した結果を返します。 数値、文字列以外のオブジェクトに対しては to_i メソッドを 使用します(ruby 1.7 feature: 1.7 では、to_int)。 変換した結果が整数(Integerのサブクラス)でなければ 例外 TypeError が発生します。 引数が文字列であった場合には、0x, 0b, 0 などの接頭辞に応じて それぞれ 16 進、2 進、8 進数として変換します。 整数と見なせない文字列を引数に指定した場合、例外 ArgumentError が発生します。 p Integer(10.1) # => 10 p Integer(10.8) # => 10 p Integer("10") # => 10 p Integer("10_0_0") # => 1000 p Integer("10__0") # => 100 # => invalid value for Integer: "10__0" (ArgumentError) (ruby 1.7 feature) p Integer("_10") # => invalid value for Integer: "_10" (ArgumentError) p Integer("10_") # => invalid value for Integer: "10_" (ArgumentError) p Integer("0d10") # => invalid value for Integer: "0d10" (ArgumentError) # => 10 (ruby 1.7 feature) p Integer("010") # => 8 p Integer("0o10") # => invalid value for Integer: "0o10" (ArgumentError) (ruby 1.7 feature) # => 8 p Integer("0x10") # => 16 p Integer("0b10") # => 2 p Integer(" \n10\t ") # => 10 p Integer("") # => `Integer': invalid value for Integer: "" (ArgumentError) p Integer(nil) # => 0 p Integer(Object.new) # => cannot convert Object into Integer (TypeError) String#hex [String/hex], String#oct [String/oct], String#to_i [String/to_i] も参照してください。 るびきち☆ http://www.rubyist.net/~rubikitch/