Jak przekonwertować String na Long w Kotlin?


157

Tak więc z powodu braku metod, takich jak Long.valueOf(String s)ja, utknąłem.

Jak przekonwertować String na Long w Kotlin?

Odpowiedzi:


153

1. string.toLong()

Analizuje ciąg jako liczbę [Long] i zwraca wynik.

@throws NumberFormatException, jeśli ciąg nie jest prawidłową reprezentacją liczby.

2. string.toLongOrNull()

Analizuje ciąg jako liczbę [Long] i zwraca wynik lub null jeśli łańcuch nie jest prawidłową reprezentacją liczby.

3. str.toLong(10)

Analizuje ciąg jako liczbę [Long] i zwraca wynik.

@throws NumberFormatException, jeśli ciąg nie jest prawidłową reprezentacją liczby.

@throws IllegalArgumentException, gdy [podstawa] nie jest prawidłową podstawą konwersji ciągów na liczby.

public inline fun String.toLong(radix: Int): Long = java.lang.Long.parseLong(this, checkRadix(radix))

4. string.toLongOrNull(10)

Analizuje ciąg jako liczbę [Long] i zwraca wynik lub null jeśli łańcuch nie jest prawidłową reprezentacją liczby.

@throws IllegalArgumentException, gdy [podstawa] nie jest prawidłową podstawą konwersji ciągów na liczby.

public fun String.toLongOrNull(radix: Int): Long? {...}

5. java.lang.Long.valueOf(string)

public static Long valueOf(String s) throws NumberFormatException

1
eyval, alee bood
DolDurma

94

String ma odpowiednią metodę rozszerzenia:

"10".toLong()

1
Nazwy zmieniły się w Kotlinie, nie musisz się martwić, gdzie i dlaczego, po prostu wiedz w Kotlinie, że wszystkie Stringmają funkcję rozszerzenia, toLong()a także toInt()inne. Możesz ich użyć. Może @ilya może zaktualizować tę odpowiedź do bieżącego Kotlin (usuń jet.Stringodniesienie).
Jayson Minard,

Tylko uwaga, jeśli iterujesz ciąg cyfr, będą to znaki i [char] .toInt () poda reprezentację ascii.
Peheje

58

Metody rozszerzające są dostępne dla Strings, aby przeanalizować je na inne typy pierwotne. Przykłady poniżej:


2
str.toLongOrNull()i inne podobnie nazwane metody są również przydatne, jeśli nie możesz zagwarantować, że dane wejściowe zostaną poprawnie sformatowane. Dzięki temu możesz robić takie rzeczy jakstr.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
sotrh

9

Uwaga: wspomniane odpowiedzi jet.Stringsą nieaktualne. Oto aktualny Kotlin (1.0):

Każdy Stringw Kotlinie ma już funkcję rozszerzenia, którą możesz wywołać toLong(). Nic specjalnego nie jest potrzebne, po prostu go użyj.

Wszystkie funkcje rozszerzeńString są udokumentowane. Możesz znaleźć inne dla standardowej biblioteki lib w dokumentacji API


7

To interesujące. Kod w ten sposób:

val num = java.lang.Long.valueOf("2");
println(num);
println(num is kotlin.Long);

tworzy ten wynik:

2
true

Myślę, że Kotlin w tym przypadku dokonuje konwersji z java.lang.Longi długo prymitywnego na kotlin.Longautomatyczny. Jest to więc rozwiązanie, ale z przyjemnością zobaczyłbym narzędzie bez użycia pakietu java.lang.


6

Właściwie 90% czasu, w którym musisz również sprawdzić, czy „długi” jest prawidłowy, więc potrzebujesz:

"10".toLongOrNull()

Istnieje odpowiednik „orNull” dla każdego „toLong” z podstawowych typów, a te pozwalają na zarządzanie nieprawidłowymi przypadkami z zachowaniem Kotlina? idiom.


Zgoda. W większości przypadków .toLongOrNull () jest tym, czego potrzebujesz.
Andrej


0

Jedna ze starych dobrych możliwości w Javie, o której nie ma mowy w odpowiedziach, to java.lang.Long.decode(String).


Ciągi dziesiętne:

Kotlin String.toLong()jest odpowiednikiem Java Long.parseLong(String):

Analizuje argument ciągu jako długość dziesiętną ze znakiem . ... Wynikowa wartość long jest zwracana dokładnie tak, jakby argument i podstawa 10 zostały podane jako argumenty parseLong(java.lang.String, int)metody.


Ciągi niedziesiętne:

Kotlin String.toLong(radix: Int)jest odpowiednikiem eLong.parseLong(String, int) Java :

Analizuje argument łańcuchowy jako długi ze znakiem w podstawie określonej przez drugi argument. Wszystkie znaki w ciągu muszą być cyframi o określonej podstawie ...

I tu pojawia java.lang.Long.decode(String)się obraz:

Dekoduje ciąg znaków na Long. Akceptuje liczby dziesiętne, szesnastkowe i ósemkowe podane według następującej gramatyki: DecodableString:

(Sign) DecimalNumeral | (Podpisz) 0x HexDigits | (Podpisz) 0X HexDigits | (Znak) # HexDigits | (Znak) 0 OctalDigits

Znak: - | +

Oznacza to, że decodemoże analizować ciągi znaków, tak jak "0x412"inne metody spowodują utworzenie pliku NumberFormatException.

val kotlin_toLong010 = "010".toLong() // 10 as parsed as decimal
val kotlin_toLong10 = "10".toLong() // 10 as parsed as decimal
val java_parseLong010 = java.lang.Long.parseLong("010") // 10 as parsed as decimal
val java_parseLong10 = java.lang.Long.parseLong("10") // 10 as parsed as decimal

val kotlin_toLong010Radix = "010".toLong(8) // 8 as "octal" parsing is forced
val kotlin_toLong10Radix = "10".toLong(8) // 8 as "octal" parsing is forced
val java_parseLong010Radix = java.lang.Long.parseLong("010", 8) // 8 as "octal" parsing is forced
val java_parseLong10Radix = java.lang.Long.parseLong("10", 8) // 8 as "octal" parsing is forced

val java_decode010 = java.lang.Long.decode("010") // 8 as 0 means "octal"
val java_decode10 = java.lang.Long.decode("10") // 10 as parsed as decimal

0

Konwersja a Stringna Long(która reprezentuje 64-bitową liczbę całkowitą ze znakiem) w Kotlin 1.3 jest dość prosta .

Możesz użyć dowolnej z następujących trzech metod:

val number1: Long = "789".toLong()
println(number1)                                   // 789

val number2: Long? = "404".toLongOrNull()
println("number = $number2")                       // number = 404

val number3: Long? = "Error404".toLongOrNull()    
println("number = $number3")                       // number = null

val number4: Long? = "111".toLongOrNull(2)
println("numberWithRadix(2) = $number4")           // numberWithRadix(2) = 7

0

Jeśli nie chcesz obsługiwać NumberFormatExceptionpodczas analizowania

 var someLongValue=string.toLongOrNull() ?: 0

0

Właściwie jest kilka sposobów:

Dany:

var numberString : String = "numberString" 
// number is the Long value of numberString (if any)
var defaultValue : Long    = defaultValue

Następnie mamy:

+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString is a valid number ?            |  true    | false                 |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLong()                       |  number  | NumberFormatException |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull()                 |  number  | null                  |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull() ?: defaultValue |  number  | defaultValue          |
+—————————————————————————————————————————————+——————————+———————————————————————+

jak możesz mieć defaultValue = Long: defaultValue Gdzie w twoim przykładzie zostanie użyty ciąg numberString / Myślę, że powinno to być defaultValue = Long: numberString?
James Smith
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.