[ruby-list:41711] Re: 文字列に格納された頭が 0 で始まる 10 進数の数値への変換

From: rubikitch <rubikitch@...>
Date: 2005-12-14 09:25:46 UTC
List: ruby-list #41711
From: Miki Toru <miki_1702@yahoo.co.jp>
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/
        

In This Thread