วิธีการแปลงสตริงเป็น Long ใน Kotlin?


157

ดังนั้นเนื่องจากขาดวิธีการเช่นLong.valueOf(String s)ฉันติดอยู่

วิธีการแปลงสตริงเป็น Long ใน Kotlin?

คำตอบ:


154

1 string.toLong()

แยกวิเคราะห์สตริงเป็นหมายเลข [ยาว] และส่งคืนผลลัพธ์

@throws NumberFormatException หากสตริงไม่ใช่ตัวแทนที่ถูกต้องของตัวเลข

2 string.toLongOrNull()

แยกวิเคราะห์สตริงเป็นหมายเลข [ยาว] และส่งคืนผลลัพธ์หรือnull ถ้าสตริงไม่ใช่ตัวเลขที่ถูกต้อง

3 str.toLong(10)

แยกวิเคราะห์สตริงเป็นหมายเลข [ยาว] และส่งคืนผลลัพธ์

@throws NumberFormatException หากสตริงไม่ใช่ตัวแทนที่ถูกต้องของตัวเลข

@throws IllegalArgumentException เมื่อ [radix] ไม่ใช่ radix ที่ถูกต้องสำหรับการแปลงสตริงเป็นตัวเลข

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

4 string.toLongOrNull(10)

แยกวิเคราะห์สตริงเป็นหมายเลข [ยาว] และส่งคืนผลลัพธ์หรือnull ถ้าสตริงไม่ใช่ตัวเลขที่ถูกต้อง

@throws IllegalArgumentException เมื่อ [radix] ไม่ใช่ radix ที่ถูกต้องสำหรับการแปลงสตริงเป็นตัวเลข

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 มีวิธีการขยายที่สอดคล้องกัน:

"10".toLong()

1
ชื่อมีการเปลี่ยนแปลงใน Kotlin คุณไม่จำเป็นต้องกังวลว่าที่ไหนหรือทำไมเพียงรู้ใน Kotlin ว่าทุกคนStringมีฟังก์ชั่นเสริมtoLong()รวมถึงtoInt()และอื่น ๆ คุณสามารถใช้สิ่งเหล่านี้ บางที @ilya สามารถอัปเดตคำตอบนี้เป็น Kotlin ปัจจุบัน (ลบjet.Stringการอ้างอิง)
Jayson Minard

เพียงแค่หัวขึ้นถ้าคุณวนซ้ำของตัวเลขพวกเขาจะเป็นตัวอักษรและ [char] .toInt () จะให้ตัวแทน ASCII ของคุณ
Peheje

58

วิธีการขยายมีให้สำหรับStrings เพื่อแยกพวกเขาเป็นประเภทดั้งเดิมอื่น ๆ ตัวอย่างด้านล่าง:


2
str.toLongOrNull()และวิธีการที่มีชื่อคล้ายกันอื่น ๆ ก็มีประโยชน์เช่นกันหากคุณไม่สามารถรับประกันได้ว่ารูปแบบการป้อนข้อมูลจะถูกต้อง ด้วยสิ่งนี้คุณสามารถทำสิ่งต่าง ๆ ได้str.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
sotrh

9

หมายเหตุ: คำตอบที่กล่าวถึงjet.Stringล้าสมัยแล้ว นี่คือ Kotlin ปัจจุบัน (1.0):

ทุกคนStringใน Kotlin มีฟังก์ชั่นเสริมที่คุณสามารถโทรtoLong()ได้ ไม่จำเป็นต้องใช้อะไรเป็นพิเศษเพียงใช้มัน

ฟังก์ชั่นการขยายStringทั้งหมดสำหรับมีการบันทึกไว้ คุณสามารถค้นหาคนอื่น ๆ สำหรับ lib มาตรฐานในการอ้างอิง API


7

มันน่าสนใจ รหัสเช่นนี้:

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

ทำให้ผลลัพธ์นี้:

2
true

ฉันเดาว่า Kotlin ทำให้การแปลงจากjava.lang.Longและเป็นแบบดั้งเดิมไปเป็นแบบkotlin.Longอัตโนมัติในกรณีนี้ ดังนั้นมันเป็นทางออก แต่ฉันยินดีที่จะเห็นเครื่องมือโดยไม่ต้องใช้แพ็คเกจ java.lang


6

ที่จริงแล้ว 90% ของเวลาที่คุณต้องตรวจสอบว่า 'ยาว' ถูกต้องดังนั้นคุณต้อง:

"10".toLongOrNull()

มี 'orNull' เทียบเท่าสำหรับ 'toLong' พื้นฐานแต่ละประเภทและอนุญาตให้จัดการกรณีที่ไม่ถูกต้องกับ Kotlin หรือไม่ สำนวน.


ตกลง เกือบตลอดเวลา toLongOrNull () เป็นสิ่งที่คุณต้องการ
Andrej


0

หนึ่งที่ดีเป็นไปได้ Java java.lang.Long.decode(String)เก่าสิ่งที่ไม่ได้กล่าวถึงในคำตอบคือ


สตริงทศนิยม:

Kotlin's String.toLong()เทียบเท่ากับ Java Long.parseLong(String):

แยกวิเคราะห์อาร์กิวเมนต์สตริงเป็นทศนิยมที่ลงนามแล้ว ... ค่ายาวที่ได้จะถูกส่งกลับเช่นเดียวกับอาร์กิวเมนต์และ radix 10 ที่ได้รับเป็นอาร์กิวเมนต์ของparseLong(java.lang.String, int)วิธีการ


สตริงที่ไม่ใช่ทศนิยม:

Kotlin's String.toLong(radix: Int)เทียบเท่ากับeLong.parseLong(String, int)ของ Java :

แยกวิเคราะห์อาร์กิวเมนต์สตริงตามความยาวที่ลงชื่อใน radix ที่ระบุโดยอาร์กิวเมนต์ที่สอง อักขระในสตริงทั้งหมดต้องเป็นตัวเลขของฐานที่ระบุ ...

และนี่java.lang.Long.decode(String)คือภาพ:

ถอดรหัสสตริงเป็น Long ยอมรับเลขฐานสิบเลขฐานสิบหกและเลขฐานแปดที่กำหนดโดยไวยากรณ์ต่อไปนี้: DecodableString:

(เครื่องหมาย) เลขทศนิยม (ลงชื่อ) 0x HexDigits | (ลงชื่อ) 0X HexDigits | (ลงชื่อ) # HexDigits | (ลงชื่อ) 0 OctalDigits

เครื่องหมาย: - | +

นั่นหมายความว่าdecodeสามารถแยกสายเช่น"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

การแปลงStringไปLong(ที่แสดงถึง 64 บิตลงนามจำนวนเต็ม) ใน Kotlin 1.3 ค่อนข้างง่าย

คุณสามารถใช้หนึ่งในสามวิธีต่อไปนี้:

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

หากคุณไม่ต้องการที่จะจัดการNumberFormatExceptionในขณะที่แยก

 var someLongValue=string.toLongOrNull() ?: 0

0

จริงๆแล้วมีหลายวิธี:

ได้รับ:

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

จากนั้นเรามี:

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

คุณจะมี defaultValue = Long ได้อย่างไร: defaultValue ที่ numberString จะถูกนำมาใช้ในตัวอย่างของคุณ / ฉันคิดว่ามันควรจะเป็น defaultValue = Long: numberString
James Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.