Odpowiedzi:
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
String
ma odpowiednią metodę rozszerzenia:
"10".toLong()
String
mają 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.String
odniesienie).
Metody rozszerzające są dostępne dla String
s, aby przeanalizować je na inne typy pierwotne. Przykłady poniżej:
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")
Uwaga: wspomniane odpowiedzi jet.String
są nieaktualne. Oto aktualny Kotlin (1.0):
Każdy String
w 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
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.Long
i długo prymitywnego na kotlin.Long
automatyczny. Jest to więc rozwiązanie, ale z przyjemnością zobaczyłbym narzędzie bez użycia pakietu java.lang.
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.
string.toLong ()
gdzie string
jest twoja zmienna.
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 decode
moż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
Konwersja a String
na 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
Jeśli nie chcesz obsługiwać NumberFormatException
podczas analizowania
var someLongValue=string.toLongOrNull() ?: 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 |
+—————————————————————————————————————————————+——————————+———————————————————————+