Як перетворити String в Long в Котлін?


157

Отже, через відсутність таких методів, як Long.valueOf(String s)я застряг.

Як перетворити String в Long в Котлін?

Відповіді:


153

1. string.toLong()

Розбирає рядок як [Long] число і повертає результат.

@throws NumberFormatException, якщо рядок не є дійсним поданням числа.

2. string.toLongOrNull()

Розбирає рядок як [Long] число і повертає результат або null якщо рядок не є дійсним поданням числа.

3. str.toLong(10)

Розбирає рядок як [Long] число і повертає результат.

@throws NumberFormatException, якщо рядок не є дійсним поданням числа.

@throws IllegalArgumentException, коли [radix] не є дійсним радіусом для перетворення рядка в число.

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

4. string.toLongOrNull(10)

Розбирає рядок як [Long] число і повертає результат або null якщо рядок не є дійсним поданням числа.

@throws IllegalArgumentException, коли [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
Імена в Котліні змінилися, вам не потрібно турбуватися про те, де і чому, просто знайте в Котліні, що всі Stringмають функцію розширення toLong(), а також toInt()і інші. Ви можете використовувати ці. Можливо, @ilya може оновити цю відповідь на поточний Котлін (видалити 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, застаріли. Ось поточний Котлін (1.0):

Будь-який Stringв Котліні вже має функцію розширення, яку ви можете зателефонувати toLong(). Нічого особливого не потрібно, просто використовуйте.

Всі функції розширення дляString документально задокументовані. Ви можете знайти інших стандартних ліб у посиланні на api


7

Це цікаво. Код таким:

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

робить цей вихід:

2
true

Я думаю, Котлін робить перетворення з java.lang.Longдавно примітивного в kotlin.Longавтоматичне в цьому випадку. Отже, це рішення, але я би радий бачити інструмент без використання пакету java.lang.


6

Насправді, 90% часу, який також потрібно перевірити "довгий", є дійсним, тому вам потрібно:

"10".toLongOrNull()

Існує еквівалент "orNull" для кожного "toLong" основних типів, і вони дозволяють керувати недійсними справами з підтримкою Kotlin? ідіома.


Домовились. Більшість часу .toLongOrNull () - те, що вам потрібно.
Андрій


0

Одна добра стара можливість Java, що не згадується у відповідях java.lang.Long.decode(String).


Десяткові рядки:

Котлін String.toLong()еквівалент Java Long.parseLong(String):

Розбирає аргумент рядка як підписаний десятковий довгий . ... Отримане довге значення повертається точно так, як якщо б аргумент і радіус 10 були задані як аргументи parseLong(java.lang.String, int)методу.


Недесяткові рядки:

Котлін - х String.toLong(radix: Int)еквівалентна Ява еLong.parseLong(String, int) :

Розбирає аргумент рядка як підписаний довгий у радіусі, визначеному другим аргументом. Усі символи в рядку повинні бути цифрами заданого радіусу ...

І ось java.lang.Long.decode(String)у картину входить :

Розшифровує рядок у довгий. Приймає десяткові, шістнадцяткові та восьмеричні числа, задані наступною граматикою: DecodableString:

(Знак) DecimalNumeral | (Знак) 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-розрядний ціле число) в Котлин 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?
Джеймс Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.