Nasıl String in Kotlin dönüştüğünde için?


157

Yani, Long.valueOf(String s)benim gibi yöntem eksikliği nedeniyle sıkışmış.

Nasıl String in Kotlin dönüştüğünde için?

Yanıtlar:


154

1. string.toLong()

Dizeyi [Uzun] sayı olarak ayrıştırır ve sonucu döndürür.

Dize bir sayının geçerli bir temsili değilse @throws NumberFormatException.

2. string.toLongOrNull()

Dizeyi [Uzun] sayı olarak ayrıştırır ve sonucu döndürür veya null dize bir sayının geçerli bir temsili değilse.

3. str.toLong(10)

Dizeyi [Uzun] sayı olarak ayrıştırır ve sonucu döndürür.

Dize bir sayının geçerli bir temsili değilse @throws NumberFormatException.

@throws IllegalArgumentException, [radix] dizeden sayıya dönüşüm için geçerli bir radix olmadığında.

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

4. string.toLongOrNull(10)

Dizeyi [Uzun] sayı olarak ayrıştırır ve sonucu döndürür veya null dize bir sayının geçerli bir temsili değilse.

@throws IllegalArgumentException, [radix] dizeden sayıya dönüşüm için geçerli bir radix olmadığında.

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 karşılık gelen bir uzantı yöntemine sahiptir:

"10".toLong()

1
Kotlin'de isimler değişti, nerede veya neden konusunda endişelenmenize gerek yok, sadece Kotlin'de herkesin yanı sıra ve diğerleri Stringiçin bir uzantı fonksiyonuna sahip olduğunu bilin . Bunları kullanabilirsiniz. Belki @ilya bu cevabı mevcut Kotlin'e güncelleyebilir ( referansı kaldır .)toLong()toInt()jet.String
— Jayson Minard

Sadece bir adım yukarı, eğer bir basamak dizisini yineliyorsanız, bunlar karakter olur ve [char] .toInt () size ascii temsilini verecektir.
— Peheje

58

StringBunların diğer ilkel tiplere ayrıştırılması için genişletme yöntemleri mevcuttur . Aşağıdaki örnekler:


2
str.toLongOrNull()ve girişin doğru biçimlendirileceğini garanti edemezseniz, benzer şekilde adlandırılmış diğer yöntemler de yararlıdır. Bununla şunları yapabilirsinizstr.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
— sotrh

9

Not: jet.StringBelirtilen cevaplar güncel değildir. İşte mevcut Kotlin (1.0):

StringKotlin'deki herhangi birinin arayabileceğiniz bir uzantı işlevi zaten var toLong(). Özel bir şey gerekmez, sadece kullanın.

İçin tüm uzantı işlevleriString belgelenmiştir. Api başvurusunda standart lib için başkalarını bulabilirsiniz


7

İlginç. Bunun gibi kod:

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

bu çıktıyı yapar:

2
true

Sanırım, Kotlin bu durumda otomatik olarak java.lang.Longuzun ve ilkel bir dönüşüm yapar kotlin.Long. Yani, bu çözüm, ama java.lang paket kullanımı olmadan aracı görmek için mutlu olurdu.


6

Aslında, 'uzun' kontrol etmeniz gereken zamanın% 90'ı geçerlidir, bu yüzden ihtiyacınız olan:

"10".toLongOrNull()

Temel türlerin her bir 'toLong' için bir 'orNull' eşdeğeri vardır ve bunlar Kotlin'e uygun olarak geçersiz vakaların yönetilmesine izin verir mi? deyim.


Kabul. Çoğu zaman .toLongOrNull () ihtiyacınız olan şeydir.
— Andrej


0

İyi bir eski Java olasılığı cevaplarda belirtilmeyen şeydir java.lang.Long.decode(String).


Ondalık Dizeler:

Kotlin's String.toLong()Java ile eşdeğerdir Long.parseLong(String):

Dize bağımsız değişkenini işaretli ondalık uzun olarak ayrıştırır . Sonuçta elde edilen uzun değer, tıpkı argüman ve sayı tabanı 10, parseLong(java.lang.String, int)yönteme argüman olarak verilmiş gibi döndürülür .


Ondalık olmayan Dizeler:

Kotlin en String.toLong(radix: Int)Java'nın eşdeğerdir eLong.parseLong(String, int) :

Dize bağımsız değişkenini, ikinci bağımsız değişken tarafından belirtilen yarıçapta uzun işaretli olarak ayrıştırır. Dizedeki karakterlerin tümü belirtilen yarıçapın rakamları olmalıdır ...

Ve işte java.lang.Long.decode(String)resim ortaya çıkıyor :

Bir Dizeyi Bir Uzun Kodun Kodunu Çözer. Aşağıdaki dilbilgisi tarafından verilen ondalık, onaltılık ve sekizli sayıları kabul eder: DecodableString:

(İşaret) Ondalık Sayı | (İşaret) 0x HexDigits | (İşaret) 0X HexDigits | (İşaret) # HexDigits | (İşaret) 0 OctalDigits

İşaret: - | +

Bu , diğer yöntemlerin a ile sonuçlanacağı decodeDizeleri ayrıştırabileceği anlamına gelir ."0x412"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

Bir dönüştürmek için Stringhiç LongKOTLIN 1.3 (yani 64 bitlik işaretli tamsayı gösterir) oldukça basittir .

Aşağıdaki üç yöntemden herhangi birini kullanabilirsiniz:

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

NumberFormatExceptionAyrıştırma sırasında işlemek istemiyorsanız

 var someLongValue=string.toLongOrNull() ?: 0

0

Aslında, birkaç yol var:

Verilen:

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

Sonra elimizde:

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

nasıl defaultValue = Long: defaultValue örneğinizde numberString nerede kullanılır / bence defaultValue = Long: numberString olmalı?
— James Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.