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.