2016-07-11 14 views
1

Für eine Zuweisung muss ich eine Methode mit dem Namen get_integer_from_string schreiben, die eine Eingabezeichenfolge in eine Ganzzahl konvertiert. Ich habe es fertig, aber für eine Anforderung:Was kann ich anstelle von char.to_i verwenden?

  • Bitte NICHT implizite oder automatische Typumwandlung dieses Problem zu lösen Verwenden Sie, dh atoi() in C, int() in Python, Funktionen wie parseInt () in Java oder intval() in
  • PHP

Was kann ich char.to_i mit in meinem Code ersetzen unter diese Anforderung zu erfüllen?

def get_integer_from_string(str, based=7) 
    return 0 if (/^(?<num>\d+)$/ =~ str).nil? 
    result = 0 
    str.reverse.each_char.with_index do |char, index| 
    tmp = char.to_i * based**index 
    result += tmp 
    end 
    result rescue 0 
end 
+0

Mai 'Basis' ist größer als 10, z.B. 16? – mudasobwa

Antwort

3

Ich vermute, dass Sie dies überdenken. Da char nur eine von zehn verschiedenen Strings sein kann, nur eine Lookup-Tabelle als Hash machen:

C_TO_I = { 
    "0" => 0, "1" => 1, "2" => 2, "3" => 3, 
    "4" => 4, "5" => 5, "6" => 6, "7" => 7, 
    "8" => 8, "9" => 9 
} 

Dann ersetzen Sie einfach char.to_i in Ihrem Code mit C_TO_I[char]. Um zu demonstrieren:

char = "7" 
p C_TO_I[char] 
# => 7 
+1

'('0' .. '9'). Map.with_index {| v, i | [v, i]} .to_h' – mudasobwa

+0

@mudasobwa also wird es so sein 'code' def get_integer_from_string (str, based = 7) zurückgeben 0 if (/^(? \ d +) $/= ~ str). Null? Ergebnis = 0 str.reverse.each_char.with_index do | char, index | tmp = bis-h * basierend ** Index Ergebnis + = tmp Ende Ergebnis Rettung 0 Ende –

+0

@AdelAlmaleh Diese Frage wäre besser an diese Antwort Autor adressiert; Ich würde mit der Re-Implementierung von 'to_i' gehen (siehe meine Antwort), die für ungewöhnliche Basen sicherer ist. – mudasobwa

1
def my_to_i input, base 
    ('0'...input).count.tap do |i| 
    raise ArgumentError, 'Incorrect value in input' if i >= base || i < 0 
    end 
end 

Hier sind wir wieder implementieren to_i Funktion unter Verwendung der Tatsache, dass Zeichen, was Ziffern, werden anschließend entfernt. raise Klausel kümmert sich um ungültige Eingabe, e. G. 8, wenn die Basis 7 ist.

1

Just for Kicks, hier ist eine andere Art und Weise Sie Ihre Methode schreiben könnte:

C_TO_I = (?0..?9).each_with_index.to_h 

def s_to_i(str, base=7, mag=0) 
    return 0 if str.empty? 
    C_TO_I[str[-1]] * base ** mag + 
    s_to_i(str[0...-1], base, mag + 1) 
end 

str = "654" 
p s_to_i(str) # => 333 

Natürlich ist die C_TO_I Hash oben nur 10 für die Basis arbeiten und niedriger. Sie könnten stattdessen den ganzen Weg bis zur Basis 36 mit etwas ähnlichem gehen:

+1

'[? 0 ..? 9,? A ..? Z] .flat_map (&: zu_a)' ⇒ '[*? 0 ..? 9, *? A ..? Z]'. – mudasobwa

Verwandte Themen