2013-04-26 16 views
23
def multiplyStringNumericChars(list: String): Int = { 
    var product = 1; 
    println(s"The actual thing + $list") 
    list.foreach(x => { println(x.toInt); 
         product = product * x.toInt; 
        }); 

    product; 
}; 

Jest to funkcja, która pobiera ciąg znaków, taki jak 12345 i powinna zwrócić wynik 1 * 2 * 3 * 4 * 5. Jednak wracam nie ma sensu. Jaka jest niejawna konwersja z Char na Int wracająca?Scala char do konwersji int

Wygląda na to, że dodajesz 48 do wszystkich wartości. Jeśli zamiast tego robię product = product * (x.toInt - 48), wyniki są poprawne.

+9

Dla charakter, toInt powraca odpowiedni kod postaci. Użyj x.asDigit, aby uzyskać liczbę całkowitą odpowiadającą cyfrze (to działa aż do podstawy 36, jeśli umieścisz litery). –

Odpowiedz

50

Ma to sens: w ten sposób how characters encoded in ASCII table: 0 char mapuje na liczbę dziesiętną 48, 1 na mapę na 49 i tak dalej. Więc w zasadzie podczas konwersji char na int, wszystko co musisz zrobić, to po prostu odjąć '0':

scala> '1'.toInt 
// res1: Int = 49 

scala> '0'.toInt 
// res2: Int = 48 

scala> '1'.toInt - 48 
// res3: Int = 1 

scala> '1' - '0' 
// res4: Int = 1 

Albo po prostu użyć x.asDigit, jak @Reimer powiedział

scala> '1'.asDigit 
// res5: Int = 1