¿Cómo convertir una cuerda a larga en Kotlin?

157

Entonces, debido a la falta de métodos como Long.valueOf(String s) estoy atascado.

¿Cómo convertir una cuerda a larga en Kotlin?

Jerome
fuente

Respuestas:

154

1) string.toLong()

Analiza la cadena como un número [Largo] y devuelve el resultado.

@throws NumberFormatException si la cadena no es una representación válida de un número.

2) string.toLongOrNull()

Analiza la cadena como un número [Largo] y devuelve el resultado o null si la cadena no es una representación válida de un número.

3) str.toLong(10)

Analiza la cadena como un número [Largo] y devuelve el resultado.

@throws NumberFormatException si la cadena no es una representación válida de un número.

@throws IllegalArgumentException cuando [radix] no es una raíz válida para la conversión de cadena a número.

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

4) string.toLongOrNull(10)

Analiza la cadena como un número [Largo] y devuelve el resultado o null si la cadena no es una representación válida de un número.

@throws IllegalArgumentException cuando [radix] no es una raíz válida para la conversión de cadena a número.

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

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

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

String tiene un método de extensión correspondiente:

"10".toLong()
Ilya Klyuchnikov
fuente
1
Los nombres han cambiado en Kotlin, no necesita preocuparse por dónde o por qué, solo sepa en Kotlin que todos Stringtienen una función de extensión toLong(), así como toInt()otros. Puedes usar estos. Quizás @ilya pueda actualizar esta respuesta a Kotlin actual (eliminar jet.Stringreferencia)
Jayson Minard
Solo un aviso, si está iterando una cadena de dígitos, serán caracteres y [char] .toInt () le dará la representación ascii.
Peheje
58

Los métodos de extensión están disponibles para que Strings los analice en otros tipos primitivos. Ejemplos a continuación:

Eric
fuente
2
str.toLongOrNull()y otros métodos con nombres similares también son útiles si no puede garantizar que la entrada se formateará correctamente. Con esto puedes hacer cosas comostr.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
sotrh
9

Nota: Las respuestas que mencionan jet.Stringestán desactualizadas. Aquí está el Kotlin actual (1.0):

Cualquiera Stringen Kotlin ya tiene una función de extensión a la que puede llamartoLong() . No se necesita nada especial, solo úselo.

Todas las funciones de extensiónString están documentadas. Puede encontrar otros para lib estándar en la referencia de la API

Jayson Minard
fuente
7

Es interesante. Código como este:

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

hace esta salida:

2
true

Supongo que Kotlin hace una conversión desde java.lang.Longprimitiva larga a kotlin.Longautomática en este caso. Entonces, es la solución, pero me encantaría ver la herramienta sin el uso del paquete java.lang.

Jerome
fuente
6

En realidad, el 90% de las veces que también necesita verificar el 'largo' es válido, por lo que necesita:

"10".toLongOrNull()

¿Hay un equivalente 'o Nulo' para cada 'toLong' de los tipos básicos, y estos permiten gestionar casos no válidos con Kotlin? idioma.

innov8
fuente
Convenido. La mayoría de las veces .toLongOrNull () es lo que necesita.
Andrej
0

string.toLong ()

¿Dónde stringestá tu variable?

Nikhil Katekhaye
fuente
0

Una buena posibilidad de Java que no se menciona en las respuestas es java.lang.Long.decode(String).


Cuerdas Decimales:

Kotlin String.toLong()es equivalente a Java Long.parseLong(String):

Analiza el argumento de cadena como un decimal con signo largo . ... Se devuelve el valor largo resultante, exactamente como si el argumento y la raíz 10 fueran dados como argumentos del parseLong(java.lang.String, int)método.


Cadenas no decimales:

Kotlin String.toLong(radix: Int)es equivalente a eLong.parseLong(String, int) de Java :

Analiza el argumento de cadena como un signo largo en la raíz especificada por el segundo argumento. Todos los caracteres de la cadena deben ser dígitos de la raíz especificada ...

Y aquí entra java.lang.Long.decode(String)en escena:

Decodifica una cadena en un largo. Acepta números decimales, hexadecimales y octales dados por la siguiente gramática: DecodableString:

(Signo) DecimalNumeral | (Signo) 0x HexDigits | (Firmar) 0X HexDigits | (Firmar) # HexDigits | (Signo) 0 OctalDigits

Signo: - | +

Eso significa que decodepuede analizar cadenas como "0x412", donde otros métodos resultarán en a 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
fuente
0

Convertir un Stringa Long(que representa un entero con signo de 64 bits) en Kotlin 1.3 es bastante simple .

Puede usar cualquiera de los siguientes tres métodos:

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
fuente
0

Si no desea manejar NumberFormatExceptionmientras analiza

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

En realidad, hay varias formas:

Dado:

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

Entonces nosotros tenemos:

+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString is a valid number ?            |  true    | false                 |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLong()                       |  number  | NumberFormatException |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull()                 |  number  | null                  |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull() ?: defaultValue |  number  | defaultValue          |
+—————————————————————————————————————————————+——————————+———————————————————————+
nxhoaf
fuente
¿Cómo puede tener defaultValue = Long: defaultValue ¿Dónde se usaría numberString en su ejemplo / Creo que debería ser defaultValue = Long: numberString?
James Smith