Come convertire String in Long in Kotlin?


157

Quindi, a causa della mancanza di metodi come se Long.valueOf(String s)fossi bloccato.

Come convertire String in Long in Kotlin?

Risposte:


154

1. string.toLong()

Analizza la stringa come un numero [lungo] e restituisce il risultato.

@throws NumberFormatException se la stringa non è una rappresentazione valida di un numero.

2. string.toLongOrNull()

Analizza la stringa come un numero [lungo] e restituisce il risultato o null se la stringa non è una rappresentazione valida di un numero.

3. str.toLong(10)

Analizza la stringa come un numero [lungo] e restituisce il risultato.

@throws NumberFormatException se la stringa non è una rappresentazione valida di un numero.

@throws IllegalArgumentException quando [radix] non è un radix valido per la conversione da stringa a numero.

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

4. string.toLongOrNull(10)

Analizza la stringa come un numero [lungo] e restituisce il risultato o null se la stringa non è una rappresentazione valida di un numero.

@throws IllegalArgumentException quando [radix] non è un radix valido per la conversione da stringa a numero.

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 ha un metodo di estensione corrispondente:

"10".toLong()

1
I nomi sono cambiati in Kotlin, non devi preoccuparti di dove o perché, basta sapere in Kotlin che tutti Stringhanno una funzione di estensione toLong()così come toInt()e altri. Puoi usarli. Forse @ilya può aggiornare questa risposta all'attuale Kotlin (rimuovi jet.Stringriferimento.)
Jayson Minard,

Solo un avvertimento, se stai ripetendo una stringa di cifre, saranno caratteri e [char] .toInt () ti darà la rappresentazione ASCII.
Peheje,

58

I metodi di estensione sono disponibili per Strings per analizzarli in altri tipi primitivi. Esempi di seguito:


2
str.toLongOrNull()e altri metodi con nomi simili sono utili anche se non è possibile garantire che l'input sia formattato correttamente. Con questo puoi fare cose comestr.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
sotrh,

9

Nota: le risposte menzionate non jet.Stringsono aggiornate. Ecco l'attuale Kotlin (1.0):

Chiunque Stringin Kotlin ha già una funzione di estensione che puoi chiamare toLong(). Non è necessario nulla di speciale, basta usarlo.

Tutte le funzioni di estensione perString sono documentate. Puoi trovarne altri per lib standard nel riferimento api


7

È interessante. Codice come questo:

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

rende questo output:

2
true

Immagino che Kotlin effettui automaticamente la conversione java.lang.Longe la lunga primitiva kotlin.Longin questo caso. Quindi, è una soluzione, ma sarei felice di vedere lo strumento senza l'utilizzo del pacchetto java.lang.


6

In realtà, il 90% delle volte è anche necessario verificare che il "lungo" sia valido, quindi è necessario:

"10".toLongOrNull()

Esiste un equivalente "orNull" per ogni "toLong" dei tipi di base, e questi consentono di gestire casi non validi in linea con Kotlin? idioma.


Concordato. Il più delle volte .toLongOrNull () è ciò di cui hai bisogno.
Andrej,


0

Una buona vecchia possibilità di Java ciò che non è menzionato nelle risposte è java.lang.Long.decode(String).


Stringhe decimali:

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

Analizza l'argomento stringa come un decimale con segno lungo . ... Viene restituito il valore lungo risultante, esattamente come se l'argomento e la radice 10 fossero dati come argomenti al parseLong(java.lang.String, int)metodo.


Stringhe non decimali:

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

Analizza l'argomento stringa come long con segno nella radice specificata dal secondo argomento. I caratteri nella stringa devono essere tutti cifre della radice specificata ...

E qui viene java.lang.Long.decode(String)in figura:

Decodifica una stringa in una lunga. Accetta numeri decimali, esadecimali e ottali forniti dalla seguente grammatica: DecodableString:

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

Segno: - | +

Ciò significa che decodepuò analizzare stringhe come "0x412", dove altri metodi si tradurranno in 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

0

Convertire Stringa Long(che rappresenta un numero intero con segno a 64 bit) in Kotlin 1.3 è abbastanza semplice .

È possibile utilizzare uno dei tre metodi seguenti:

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

Se non si desidera gestire NumberFormatExceptiondurante l'analisi

 var someLongValue=string.toLongOrNull() ?: 0

0

In realtà, ci sono diversi modi:

Dato:

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

Poi abbiamo:

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

come puoi avere defaultValue = Long: defaultValue Dove si userebbe numberString nel tuo esempio / Penso che dovrebbe essere defaultValue = Long: numberString?
James Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.