Làm cách nào để chuyển đổi String thành Long trong Kotlin?


157

Vì vậy, do thiếu phương pháp như Long.valueOf(String s)tôi bị mắc kẹt.

Làm cách nào để chuyển đổi String thành Long trong Kotlin?

Câu trả lời:


153

1. string.toLong()

Phân tích chuỗi dưới dạng số [Dài] và trả về kết quả.

@throw NumberFormatException nếu chuỗi không phải là đại diện hợp lệ của một số.

2. string.toLongOrNull()

Phân tích chuỗi dưới dạng số [Dài] và trả về kết quả hoặc null nếu chuỗi không phải là đại diện hợp lệ của số.

3. str.toLong(10)

Phân tích chuỗi dưới dạng số [Dài] và trả về kết quả.

@throw NumberFormatException nếu chuỗi không phải là đại diện hợp lệ của một số.

@throws IllegalArgumentException khi [radix] không phải là cơ số hợp lệ để chuyển đổi chuỗi thành số.

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

4. string.toLongOrNull(10)

Phân tích chuỗi dưới dạng số [Dài] và trả về kết quả hoặc null nếu chuỗi không phải là đại diện hợp lệ của số.

@throws IllegalArgumentException khi [radix] không phải là cơ số hợp lệ để chuyển đổi chuỗi thành số.

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 có một phương thức mở rộng tương ứng:

"10".toLong()

1
Tên đã thay đổi trong Kotlin, bạn không cần phải lo lắng về việc tại sao hoặc tại sao, chỉ cần biết trong Kotlin rằng tất cả đều Stringcó chức năng mở rộng toLong()cũng như các chức năng toInt()khác. Bạn có thể sử dụng chúng. Có lẽ @ilya có thể cập nhật câu trả lời này cho Kotlin hiện tại (xóa jet.Stringtham chiếu.)
Jayson Minard

Chỉ cần ngẩng cao đầu, nếu bạn lặp lại một chuỗi các chữ số, chúng sẽ là ký tự và [char] .toInt () sẽ cung cấp cho bạn biểu diễn ascii.
Peheje

58

Các phương thức mở rộng có sẵn cho Strings để phân tích chúng thành các kiểu nguyên thủy khác. Ví dụ dưới đây:


2
str.toLongOrNull()và các phương thức được đặt tên tương tự khác cũng hữu ích nếu bạn không thể đảm bảo rằng đầu vào sẽ được định dạng chính xác. Với điều này, bạn có thể làm những việc nhưstr.toLongOrNull()?.let { doSomethingWith(it) } ?: println("Please input a number")
sotrh

9

Lưu ý: Câu trả lời đề cập jet.Stringđã lỗi thời. Đây là Kotlin hiện tại (1.0):

Bất kỳ Stringtrong Kotlin đều có chức năng mở rộng mà bạn có thể gọi toLong(). Không có gì đặc biệt là cần thiết, chỉ cần sử dụng nó.

Tất cả các chức năng mở rộng choString được ghi lại. Bạn có thể tìm thấy những người khác cho lib tiêu chuẩn trong tài liệu tham khảo api


7

Thật thú vị. Mã như thế này:

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

làm cho đầu ra này:

2
true

Tôi đoán, Kotlin thực hiện chuyển đổi từ java.lang.Longvà nguyên thủy từ lâu sang kotlin.Longtự động trong trường hợp này. Vì vậy, đó là giải pháp, nhưng tôi sẽ rất vui khi thấy công cụ mà không sử dụng gói java.lang.


6

Trên thực tế, 90% thời gian bạn cũng cần kiểm tra 'dài' là hợp lệ, vì vậy bạn cần:

"10".toLongOrNull()

Có một loại 'tương đương' cho mỗi loại 'toLong' của các loại cơ bản và những loại này có cho phép quản lý các trường hợp không hợp lệ khi giữ với Kotlin không? cách diễn đạt.


Đã đồng ý. Hầu hết thời gian .toLongOrNull () là những gì bạn cần.
Andrej


0

Một khả năng Java cũ tốt những gì không được đề cập trong các câu trả lời là java.lang.Long.decode(String).


Chuỗi thập phân:

Của Kotlin String.toLong()tương đương với Java Long.parseLong(String):

Phân tích đối số chuỗi dưới dạng thập phân dài đã ký . ... Giá trị dài kết quả được trả về, chính xác như thể đối số và cơ số 10 được đưa ra làm đối số cho parseLong(java.lang.String, int)phương thức.


Chuỗi không thập phân:

Kotlin's String.toLong(radix: Int)tương đương với Java của eLong.parseLong(String, int) :

Phân tích đối số chuỗi dưới dạng dài ký trong cơ số được chỉ định bởi đối số thứ hai. Tất cả các ký tự trong chuỗi phải là chữ số của cơ số được chỉ định ...

Và đây java.lang.Long.decode(String)là hình ảnh:

Giải mã một chuỗi thành dài. Chấp nhận số thập phân, thập lục phân và số bát phân được đưa ra bởi ngữ pháp sau: DecodableString:

(Ký hiệu) DecimalNumeral | (Ký) 0x HexDigits | (Ký) 0X HexDigits | (Ký) # HexDigits | (Ký) 0 OctalDigits

Ký tên: - | +

Điều đó có nghĩa là decodecó thể phân tích các chuỗi như "0x412", trong đó các phương thức khác sẽ dẫn đến một 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

Để chuyển đổi một Stringđến Long(đại diện cho một ký số nguyên 64-bit) trong Kotlin 1.3 khá đơn giản .

Bạn có thể sử dụng bất kỳ phương pháp nào trong ba phương pháp sau:

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

Nếu bạn không muốn xử lý NumberFormatExceptiontrong khi phân tích cú pháp

 var someLongValue=string.toLongOrNull() ?: 0

0

Trên thực tế, có một số cách:

Được:

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

Sau đó chúng tôi có:

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

Làm thế nào bạn có thể có defaultValue = Long: defaultValue Trường hợp numberString sẽ được sử dụng trong ví dụ của bạn / Tôi nghĩ rằng nó phải là defaultValue = Long: numberString?
James Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.