How to work with leading zeros in integers

后端 未结 2 1934
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-10 05:08

What is the proper way to deal with leading zeros in Ruby?

0112.to_s
 => \"74\"
0112.to_i
 => 74

Why is it converting 0112

2条回答
  •  忘掉有多难
    2020-12-10 05:41

    You can't, because Ruby's Integer class does not store leading zeros.

    A leading 0 in a number literal is interpreted as a prefix:

    • 0 and 0o: octal number
    • 0x: hexadecimal number
    • 0b: binary number
    • 0d: decimal number

    It allows you to enter numbers in these bases. Ruby's parser converts the literals to the appropriate Integer instances. The prefix or leading zeros are discarded.

    Another example is %w for entering arrays:

    ary = %w(foo bar baz)
    #=> ["foo", "bar", "baz"]
    

    There's no way to get that %w from ary. The parser turns the literal into an array instance, so the script never sees the literal.

    0112 (or 0o112) is interpreted (by the parser) as the octal number 112 and turned into the integer 74.

    A decimal 0112 is just 112, no matter how many zeros you put in front:

    0d0112   #=> 112
    0d00112  #=> 112
    0d000112 #=> 112
    

    It's like additional trailing zeros for floats:

    1.0   #=> 1.0
    1.00  #=> 1.0
    1.000 #=> 1.0
    

    You probably have to use a string, i.e. "0112"

    Another option is to provide the (minimum) width explicitly, e.g.:

    def descending_order(number, width = 0)
      sprintf('%0*d', width, number).reverse.to_i
    end
    
    descending_order(123, 4)
    #=> 3210
    
    descending_order(123, 10)
    #=> 3210000000
    

提交回复
热议问题