Como converter String para Long no Kotlin?

157

Então, devido à falta de métodos como Long.valueOf(String s)eu estou preso.

Como converter String para Long no Kotlin?

Jerome
fonte

Respostas:

154

1 string.toLong()

Analisa a string como um número [Long] e retorna o resultado.

@throws NumberFormatException se a sequência não for uma representação válida de um número.

2) string.toLongOrNull()

Analisa a string como um número [Long] e retorna o resultado ou null se a string não é uma representação válida de um número.

3) str.toLong(10)

Analisa a string como um número [Long] e retorna o resultado.

@throws NumberFormatException se a sequência não for uma representação válida de um número.

@throws IllegalArgumentException quando [radix] não é um radical válido para conversão de string em número.

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

4) string.toLongOrNull(10)

Analisa a string como um número [Long] e retorna o resultado ou null se a string não é uma representação válida de um número.

@throws IllegalArgumentException quando [radix] não é um radical válido para conversão de string em número.

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

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

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

String possui um método de extensão correspondente:

"10".toLong()
Ilya Klyuchnikov
fonte
1
Nomes mudaram em Kotlin, você não precisa se preocupar com onde ou por quê, só sei em Kotlin que todos Stringtêm uma função de extensão toLong(), bem como toInt(), entre outros. Você pode usá-los. Talvez @ilya pode atualizar esta resposta para Kotlin atual (remove jet.Stringreferência.)
Jayson Minard
Apenas um aviso, se você estiver repetindo uma sequência de dígitos, eles serão caracteres e [char] .toInt () fornecerá a representação ascii.
Peheje
58

Os métodos de extensão estão disponíveis para Strings para analisá-los em outros tipos primitivos. Exemplos abaixo:

Eric
fonte
2
str.toLongOrNull()e outros métodos com nomes semelhantes também serão úteis se você não puder garantir que a entrada será formatada corretamente. Com isso você pode fazer coisas comostr.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
sotrh
9

Nota: As respostas mencionadas jet.Stringestão desatualizadas. Aqui está o Kotlin atual (1.0):

Qualquer pessoa Stringno Kotlin já possui uma função de extensão que você pode chamar toLong(). Nada de especial é necessário, basta usá-lo.

Todas as funções de extensão paraString estão documentadas. Você pode encontrar outras pessoas para a lib padrão na referência da API

Jayson Minard
fonte
7

É interessante. Código como este:

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

faz esta saída:

2
true

Eu acho que Kotlin faz a conversão de java.lang.Longe longo primitivo para kotlin.Longautomaticamente neste caso. Portanto, é uma solução, mas eu ficaria feliz em ver a ferramenta sem o uso do pacote java.lang.

Jerome
fonte
6

Na verdade, 90% das vezes você também precisa verificar o 'long' é válido, então você precisa:

"10".toLongOrNull()

Existe um equivalente 'orNull' para cada 'toLong' dos tipos básicos, e eles permitem gerenciar casos inválidos de acordo com o Kotlin? idioma.

innov8
fonte
Acordado. Na maioria das vezes, .toLongOrNull () é o que você precisa.
Andrej
0

string.toLong ()

Onde stringestá sua variável?

Nikhil Katekhaye
fonte
0

Uma boa e antiga possibilidade de Java que não é mencionada nas respostas é java.lang.Long.decode(String).


Sequências decimais:

O Kotlin's String.toLong()é equivalente ao Java Long.parseLong(String):

Analisa o argumento da string como um comprimento decimal assinado . ... O valor longo resultante é retornado, exatamente como se o argumento e a raiz 10 fossem dados como argumentos para o parseLong(java.lang.String, int)método.


Strings não decimais:

O Kotlin's String.toLong(radix: Int)é equivalente ao eLong.parseLong(String, int) : do Java

Analisa o argumento da string como um longo assinado na raiz especificada pelo segundo argumento. Os caracteres na sequência devem ser todos dígitos da raiz especificada ...

E aqui entra java.lang.Long.decode(String)em cena:

Decodifica uma String em um Long. Aceita números decimais, hexadecimais e octais fornecidos pela seguinte gramática: DecodableString:

(Sinal) DecimalNumeral | (Assinar) 0x HexDigits | (Assinar) 0X HexDigits | (Assinar) # HexDigits | (Sinal) 0 OctalDigits

Sinal: - | +

Isso significa que decodepode analisar Strings como "0x412", onde outros métodos resultarão em 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
fonte
0

Converter um Stringpara Long(que representa um número inteiro assinado de 64 bits) no Kotlin 1.3 é bastante simples .

Você pode usar qualquer um dos três métodos a seguir:

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

Se você não quiser manipular NumberFormatExceptionenquanto estiver analisando

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

Na verdade, existem várias maneiras:

Dado:

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

Então nós temos:

+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString is a valid number ?            |  true    | false                 |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLong()                       |  number  | NumberFormatException |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull()                 |  number  | null                  |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull() ?: defaultValue |  number  | defaultValue          |
+—————————————————————————————————————————————+——————————+———————————————————————+
nxhoaf
fonte
como você pode ter defaultValue = Long: defaultValue Onde numberString seria usado no seu exemplo / Eu acho que deveria ser defaultValue = Long: numberString?
James Smith