Wie konvertiere ich String in Long in Kotlin?

157

Also, wegen fehlender Methoden Long.valueOf(String s)stecke ich fest.

Wie konvertiere ich String in Long in Kotlin?

Hieronymus
quelle

Antworten:

153

1. string.toLong()

Analysiert die Zeichenfolge als [lange] Zahl und gibt das Ergebnis zurück.

@throws NumberFormatException, wenn die Zeichenfolge keine gültige Darstellung einer Zahl ist.

2. string.toLongOrNull()

Analysiert die Zeichenfolge als [lange] Zahl und gibt das Ergebnis zurück oder null wenn die Zeichenfolge keine gültige Darstellung einer Zahl ist.

3. str.toLong(10)

Analysiert die Zeichenfolge als [lange] Zahl und gibt das Ergebnis zurück.

@throws NumberFormatException, wenn die Zeichenfolge keine gültige Darstellung einer Zahl ist.

@throws IllegalArgumentException, wenn [radix] kein gültiger Radix für die Konvertierung von Zeichenfolgen in Zahlen ist.

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

4. string.toLongOrNull(10)

Analysiert die Zeichenfolge als [lange] Zahl und gibt das Ergebnis zurück oder null wenn die Zeichenfolge keine gültige Darstellung einer Zahl ist.

@throws IllegalArgumentException, wenn [radix] kein gültiger Radix für die Konvertierung von Zeichenfolgen in Zahlen ist.

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

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

public static Long valueOf(String s) throws NumberFormatException
Misagh
quelle
1
eyval, alee bood
DolDurma
94

String hat eine entsprechende Erweiterungsmethode:

"10".toLong()
Ilya Klyuchnikov
quelle
1
Namen in Kotlin geändert haben, müssen Sie sich keine Sorgen machen müssen darüber , wo oder warum, weiß nur , in Kotlin , dass alle Stringeine Erweiterungsfunktion haben toLong()sowie toInt()und andere. Sie können diese verwenden. Vielleicht kann @ilya diese Antwort auf den aktuellen Kotlin aktualisieren ( jet.StringReferenz entfernen .)
Jayson Minard
Nur ein Kopf hoch, wenn Sie eine Folge von Ziffern iterieren, sind dies Zeichen und [char] .toInt () gibt Ihnen die ASCII-Darstellung.
Peheje
58

Für Strings stehen Erweiterungsmethoden zur Verfügung , um sie in andere primitive Typen zu analysieren. Beispiele unten:

Eric
quelle
2
str.toLongOrNull()und andere ähnlich benannte Methoden sind ebenfalls nützlich, wenn Sie nicht garantieren können, dass die Eingabe korrekt formatiert wird. Damit können Sie str.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
Dinge
9

Hinweis: Die erwähnten Antworten jet.Stringsind veraltet. Hier ist der aktuelle Kotlin (1.0):

Jeder Stringin Kotlin hat bereits eine Erweiterungsfunktion, die Sie aufrufen können toLong(). Es wird nichts Besonderes benötigt, verwenden Sie es einfach.

Alle Erweiterungsfunktionen fürString sind dokumentiert. Weitere für die Standardbibliothek finden Sie in der API-Referenz

Jayson Minard
quelle
7

Es ist interessant. Code wie folgt:

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

macht diese Ausgabe:

2
true

Ich denke, Kotlin konvertiert in diesem Fall von java.lang.Longund lange primitiv zu kotlin.Longautomatisch. Es ist also eine Lösung, aber ich würde mich freuen, ein Tool ohne die Verwendung des Pakets java.lang zu sehen.

Hieronymus
quelle
6

Tatsächlich ist in 90% der Fälle, in denen Sie auch überprüfen müssen, ob das "Long" gültig ist, Folgendes erforderlich:

"10".toLongOrNull()

Es gibt ein 'orNull'-Äquivalent für jeden' toLong 'der Grundtypen, und diese ermöglichen die Verwaltung ungültiger Fälle unter Einhaltung des Kotlin? Idiom.

innov8
quelle
Einverstanden. Meistens ist .toLongOrNull () das, was Sie brauchen.
Andrej
0

string.toLong ()

Wo stringist deine Variable?

Nikhil Katekhaye
quelle
0

Eine gute alte Java-Möglichkeit, die in den Antworten nicht erwähnt wird, ist java.lang.Long.decode(String).


Dezimalzeichenfolgen:

Kotlins String.toLong()entspricht Java Long.parseLong(String):

Analysiert das Zeichenfolgenargument als vorzeichenbehaftete Dezimalstelle . ... Der resultierende lange Wert wird zurückgegeben, genau so, als ob das Argument und der Radix 10 als Argumente für die parseLong(java.lang.String, int)Methode angegeben wurden.


Nicht dezimale Zeichenfolgen:

Kotlins String.toLong(radix: Int)entspricht Javas eLong.parseLong(String, int) :

Analysiert das Zeichenfolgenargument als vorzeichenbehaftetes Long in dem durch das zweite Argument angegebenen Radix. Die Zeichen in der Zeichenfolge müssen alle Ziffern des angegebenen Radix sein ...

Und hier kommt java.lang.Long.decode(String)ins Bild:

Dekodiert einen String in einen Long. Akzeptiert Dezimal-, Hexadezimal- und Oktalzahlen, die durch die folgende Grammatik angegeben werden: DecodableString:

(Vorzeichen) Dezimalzahl | (Zeichen) 0x HexDigits | (Zeichen) 0X HexDigits | (Zeichen) # HexDigits | (Zeichen) 0 OctalDigits

Zeichen: - | +

Das heißt, das decodekann Strings wie analysieren "0x412", wo andere Methoden zu a führen 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
DVarga
quelle
0

Das Konvertieren eines Stringin Long(das eine 64-Bit-Ganzzahl mit Vorzeichen darstellt) in Kotlin 1.3 ist recht einfach .

Sie können eine der folgenden drei Methoden verwenden:

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
Andy Fedoroff
quelle
0

Wenn Sie NumberFormatExceptionbeim Parsen nicht damit umgehen möchten

 var someLongValue=string.toLongOrNull() ?: 0
nvinayshetty
quelle
0

Eigentlich gibt es mehrere Möglichkeiten:

Gegeben:

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

Dann haben wir:

+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString is a valid number ?            |  true    | false                 |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLong()                       |  number  | NumberFormatException |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull()                 |  number  | null                  |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull() ?: defaultValue |  number  | defaultValue          |
+—————————————————————————————————————————————+——————————+———————————————————————+
nxhoaf
quelle
Wie können Sie defaultValue = Long: defaultValue haben? Wo würde numberString in Ihrem Beispiel verwendet werden / Ich denke, es sollte defaultValue = Long: numberString sein?
James Smith