Comment convertir String en Long dans Kotlin?


157

Donc, en raison du manque de méthodes comme Long.valueOf(String s)je suis coincé.

Comment convertir String en Long dans Kotlin?

Réponses:


154

1. string.toLong()

Analyse la chaîne sous forme de nombre [Long] et renvoie le résultat.

@throws NumberFormatException si la chaîne n'est pas une représentation valide d'un nombre.

2. string.toLongOrNull()

Analyse la chaîne comme un nombre [Long] et renvoie le résultat ou null si la chaîne n'est pas une représentation valide d'un nombre.

3. str.toLong(10)

Analyse la chaîne sous forme de nombre [Long] et renvoie le résultat.

@throws NumberFormatException si la chaîne n'est pas une représentation valide d'un nombre.

@throws IllegalArgumentException lorsque [base] n'est pas une base valide pour la conversion de chaîne en nombre.

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

4. string.toLongOrNull(10)

Analyse la chaîne comme un nombre [Long] et renvoie le résultat ou null si la chaîne n'est pas une représentation valide d'un nombre.

@throws IllegalArgumentException lorsque [base] n'est pas une base valide pour la conversion de chaîne en nombre.

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 a une méthode d'extension correspondante:

"10".toLong()

1
Les noms ont changé dans Kotlin, vous n'avez pas à vous soucier de savoir où ni pourquoi, sachez simplement à Kotlin que tous Stringont une fonction d'extension toLong()ainsi que d' toInt()autres. Vous pouvez les utiliser. Peut-être que @ilya peut mettre à jour cette réponse à Kotlin actuel (supprimer la jet.Stringréférence.)
Jayson Minard

Attention, si vous itérez une chaîne de chiffres, ce seront des caractères et [char] .toInt () vous donnera la représentation ascii.
Peheje

58

Des méthodes d'extension sont disponibles pour Strings pour les analyser en d'autres types primitifs. Exemples ci-dessous:


2
str.toLongOrNull()et d'autres méthodes de même nom sont également utiles si vous ne pouvez pas garantir que l'entrée sera formatée correctement. Avec ça, vous pouvez faire des choses commestr.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
sotrh

9

Remarque: les réponses mentionnées jet.Stringsont obsolètes. Voici le Kotlin actuel (1.0):

Tout Stringdans Kotlin a déjà une fonction d'extension que vous pouvez appeler toLong(). Rien de spécial n'est nécessaire, utilisez-le simplement.

Toutes les fonctions d'extension pourString sont documentées. Vous pouvez en trouver d'autres pour la bibliothèque standard dans la référence de l' API


7

C'est intéressant. Code comme celui-ci:

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

rend cette sortie:

2
true

Je suppose que Kotlin effectue une conversion de java.lang.Longet longue primitive à kotlin.Longautomatiquement dans ce cas. Donc, c'est une solution, mais je serais heureux de voir l'outil sans l'utilisation du package java.lang.


6

En fait, 90% du temps, vous devez également vérifier que le `` long '' est valide, vous avez donc besoin de:

"10".toLongOrNull()

Il existe un équivalent «orNull» pour chaque «toLong» des types de base, et ceux-ci permettent de gérer les cas non valides en respectant le Kotlin? idiome.


D'accord. La plupart du temps, vous avez besoin de .toLongOrNull ().
Andrej


0

Une bonne vieille possibilité Java qui n'est pas mentionnée dans les réponses est java.lang.Long.decode(String).


Chaînes décimales:

Kotlin String.toLong()est équivalent à Java Long.parseLong(String):

Analyse l'argument de chaîne comme un long décimal signé . ... La valeur longue résultante est renvoyée, exactement comme si l'argument et la base 10 étaient donnés comme arguments à la parseLong(java.lang.String, int)méthode.


Chaînes non décimales:

Kotlin's String.toLong(radix: Int) est équivalent au eLong.parseLong(String, int) de Java :

Analyse l'argument de chaîne comme un long signé dans la base spécifiée par le deuxième argument. Les caractères de la chaîne doivent tous être des chiffres de la base spécifiée ...

Et voici java.lang.Long.decode(String)dans l'image:

Décode une chaîne en un long. Accepte les nombres décimaux, hexadécimaux et octaux donnés par la grammaire suivante: DecodableString:

(Signe) DecimalNumeral | (Signe) 0x HexDigits | (Signe) 0X HexDigits | (Signe) # HexDigits | (Signe) 0 OctalDigits

Signe: - | +

Cela signifie qu'il decodepeut analyser des chaînes comme "0x412", où d'autres méthodes entraîneront un fichier 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

Convertir un Stringen Long(qui représente un entier signé 64 bits) dans Kotlin 1.3 est assez simple .

Vous pouvez utiliser l'une des trois méthodes suivantes:

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

Si vous ne voulez pas gérer NumberFormatExceptionlors de l'analyse

 var someLongValue=string.toLongOrNull() ?: 0

0

En fait, il existe plusieurs façons:

Donné:

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

Ensuite nous avons:

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

comment pouvez-vous avoir defaultValue = Long: defaultValue Où numberString serait-il utilisé dans votre exemple / Je pense qu'il devrait être defaultValue = Long: numberString?
James Smith
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.