Bagaimana cara mengubah String ke Long di Kotlin?

157

Jadi, karena kurangnya metode seperti Long.valueOf(String s)saya mandek.

Bagaimana cara mengubah String ke Long di Kotlin?

Jerome
sumber

Jawaban:

154

1. string.toLong()

Parsing string sebagai angka [Panjang] dan mengembalikan hasilnya.

@mengirimkan NumberFormatException jika string bukan representasi angka yang valid.

2. string.toLongOrNull()

Parsing string sebagai angka [Panjang] dan mengembalikan hasilnya atau null jika string bukan representasi angka yang valid.

3. str.toLong(10)

Parsing string sebagai angka [Panjang] dan mengembalikan hasilnya.

@mengirimkan NumberFormatException jika string bukan representasi angka yang valid.

@throws IllegalArgumentException ketika [radix] bukan radix yang valid untuk konversi string ke angka.

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

4. string.toLongOrNull(10)

Parsing string sebagai angka [Panjang] dan mengembalikan hasilnya atau null jika string bukan representasi angka yang valid.

@throws IllegalArgumentException ketika [radix] bukan radix yang valid untuk konversi string ke angka.

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

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

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

String memiliki metode ekstensi yang sesuai:

"10".toLong()
Ilya Klyuchnikov
sumber
1
Nama telah berubah di Kotlin, Anda tidak perlu khawatir tentang di mana atau mengapa, ketahuilah di Kotlin bahwa semua Stringmemiliki fungsi ekstensi toLong()serta toInt()dan lainnya. Anda bisa menggunakan ini. Mungkin @ilya dapat memperbarui jawaban ini ke Kotlin saat ini (hapus jet.Stringreferensi.)
Jayson Minard
Hanya kepala, jika Anda mengulangi serangkaian angka, mereka akan menjadi karakter dan [char] .toInt () akan memberi Anda representasi ascii.
Peheje
58

Metode ekstensi tersedia untuk Stringmengurai mereka menjadi tipe primitif lainnya. Contoh di bawah ini:

Eric
sumber
2
str.toLongOrNull()dan metode lain yang serupa juga berguna jika Anda tidak dapat menjamin bahwa input akan diformat dengan benar. Dengan ini, Anda dapat melakukan hal-hal sepertistr.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
sotrh
9

Catatan: Jawaban yang disebutkan jet.Stringsudah usang. Inilah Kotlin saat ini (1.0):

Apa pun Stringdi Kotlin sudah memiliki fungsi ekstensi yang dapat Anda hubungi toLong(). Tidak ada yang istimewa diperlukan, gunakan saja.

Semua fungsi ekstensi untukString didokumentasikan. Anda dapat menemukan orang lain untuk lib standar dalam referensi api

Jayson Minard
sumber
7

Ini menarik. Kode seperti ini:

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

membuat output ini:

2
true

Saya kira, Kotlin membuat konversi dari java.lang.Longdan lama primitif ke kotlin.Longotomatis dalam kasus ini. Jadi, ini solusinya, tapi saya akan senang melihat alat tanpa penggunaan paket java.lang.

Jerome
sumber
6

Sebenarnya, 90% dari waktu Anda juga perlu memeriksa 'panjang' itu valid, jadi Anda perlu:

"10".toLongOrNull()

Ada 'orNull' yang setara untuk setiap 'toLong' dari tipe dasar, dan ini memungkinkan untuk mengelola kasus yang tidak sesuai dengan Kotlin? idiom.

innov8
sumber
Sepakat. Sebagian besar waktu .toLongOrNull () adalah yang Anda butuhkan.
Andrej
0

string.toLong ()

di mana stringvariabel Anda.

Nikhil Katekhaye
sumber
0

Satu kemungkinan Jawa tua yang baik apa yang tidak disebutkan dalam jawaban adalah java.lang.Long.decode(String).


String Desimal:

Kotlin String.toLong()setara dengan Java Long.parseLong(String):

Mengurai argumen string sebagai desimal yang ditandatangani . ... Nilai panjang yang dihasilkan dikembalikan, persis seperti jika argumen dan radix 10 diberikan sebagai argumen untuk parseLong(java.lang.String, int)metode ini.


String Non-desimal:

Kotlin String.toLong(radix: Int)setara dengan eLong.parseLong(String, int) Java :

Mem-parsing argumen string sebagai panjang yang ditandatangani di radix yang ditentukan oleh argumen kedua. Semua karakter dalam string harus merupakan digit dari radix yang ditentukan ...

Dan inilah java.lang.Long.decode(String)gambarannya:

Memecah String menjadi Long. Menerima angka desimal, heksadesimal, dan oktal yang diberikan oleh tata bahasa berikut: DecodableString:

(Tanda) Angka Desimal | (Masuk) 0x HexDigits | (Masuk) 0X HexDigits | (Masuk) # HexDigits | (Masuk) 0 OctalDigits

Masuk: - | +

Itu berarti decodedapat mem-parsing String seperti "0x412", di mana metode lain akan menghasilkan 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
sumber
0

Untuk mengonversi a Stringmenjadi Long(yang mewakili integer bertanda 64-bit) di Kotlin 1.3 cukup sederhana .

Anda dapat menggunakan salah satu dari tiga metode berikut:

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

Jika Anda tidak ingin menangani NumberFormatExceptionsaat parsing

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

Sebenarnya ada beberapa cara:

Diberikan:

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

Maka kita memiliki:

+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString is a valid number ?            |  true    | false                 |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLong()                       |  number  | NumberFormatException |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull()                 |  number  | null                  |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull() ?: defaultValue |  number  | defaultValue          |
+—————————————————————————————————————————————+——————————+———————————————————————+
nxhoaf
sumber
bagaimana Anda dapat memiliki defaultValue = Long: defaultValue Di mana numberString akan digunakan dalam contoh Anda / saya pikir itu seharusnya defaultValue = Long: numberString?
James Smith