2015-02-16 12 views
7

Jaki jest właściwy sposób radzenia sobie z wiodącymi zerami w Ruby?Jak pracować z wiodącymi zerami w liczbach całkowitych

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

Dlaczego jest konwersja 0112 do 74?

Jak przekonwertować 0112 na ciąg "0112"?


Chcę zdefiniować metodę, która przyjmuje liczbę całkowitą jako argument i zwraca ją z cyframi w porządku malejącym.

Ale to nie wydają się działać dla mnie, kiedy mam zer:

def descending_order(n) 
    n.to_s.reverse.to_i 
end 

Odpowiedz

10

liczbowy dosłowne, że zaczyna się 0 jest ósemkowa reprezentacja, z wyjątkiem tych literałów, które zaczynają się 0x które reprezentują liczb szesnastkowych lub 0b które reprezentują liczby binarne.

1 * 8**2 + 1 * 8**1 + 2 * 8**0 == 74 

aby przekształcić go 0112 użyć String#% lub Kernel#sprintf z odpowiednim ciągiem format:

'0%o' % 0112 # 0: leading zero, %o: represent as an octal 
# => "0112" 
+1

To było szybkie i bardzo prawdziwe! – Anthony

+0

@falsetru dzięki za szybką odpowiedź. Jak mogę wziąć to pod uwagę w przypadku metody, która chce odwrócić liczbę, aby była w malejącej kolejności? – Joel

+0

@JoelL, Masz na myśli coś takiego? ''0112'.chars.sort.reverse.join'. Jeśli tak, przekonwertuj liczbę na ciąg znaków w sposób podany w odpowiedzi, następnie 'the_string_object.chars.sort.reverse.join.to_i' – falsetru

3

nie można, bo Integer klasy Ruby nie przechowuje zera. prowadząc 0 w liczba dosłownym

A jest interpretowana jako przedrostek:

  • 0 i 0o: ósemkowa liczba
  • 0x: numer szesnastkowy
  • 0b: liczba binarna
  • 0d: liczba dziesiętna

To pozwala na wprowadzić numery w tych bazach. Analizator składni Ruby konwertuje literały do ​​odpowiednich instancji Integer. Przedrostek lub początkowe zera są odrzucane.

Innym przykładem jest %w dla wjeżdżających tablic:

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

Nie ma sposobu, aby ta %w z ary. Analizator składni przekształca literał w instancję tablicy, więc skrypt nigdy nie widzi literału.

0112 (lub 0o112) jest interpretowany (przez analizator składni) jako liczba ósemkowa 112 i przekształcana w liczbę całkowitą 74.

ułamek dziesiętny 0112 jest po prostu 112, bez względu na to, ile zer można umieścić z przodu:

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

To jakby dodatkowych zer dla pływaków:

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

Prawdopodobnie trzeba używać znaków , czyli "0112"

Inną opcją jest jawne podanie (minimalnej) szerokości, np .:

def descending_order(number, width = 0) 
    sprintf('%0*d', width, number).reverse.to_i 
end 

descending_order(123, 4) 
#=>

descending_order(123, 10) 
#=>000000 
+0

"Liczby całkowite w Ruby nie mają początkowych zer" Nie jestem pewien, czy to właściwy sposób, aby to powiedzieć. Liczby całkowite mogą być reprezentowane w notacji ósemkowej z wiodącym '0'. Domyślna reprezentacja jest jednak dziesiętna. –

+0

@Stefan dzięki za odpowiedź. Czy jest możliwe zdefiniowanie metody, która przyjmuje dowolną liczbę całkowitą i po prostu zwraca liczby w porządku malejącym, nie wiedząc, ile zawiera cyfr? – Joel

+0

@JoelL nie, cofanie00 daje 123, zera są tracone. Klasa "Integer" Rubiego nie może przechowywać zer wiodących. – Stefan

Powiązane problemy