Как конвертировать String в Long в Kotlin?


157

Итак, из-за отсутствия методов, как Long.valueOf(String s)я застрял.

Как конвертировать String в Long в Kotlin?

Ответы:


154

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
эйвал, але буд
долДурма

94

String имеет соответствующий метод расширения:

"10".toLong()

1
Имена изменились в Kotlin, вам не нужно беспокоиться о том, где и почему, просто знайте в Kotlin, что у всех Stringесть функция расширения, toLong()как toInt()и у других. Вы можете использовать это. Возможно, @ilya может обновить этот ответ для текущего Kotlin (удалить jet.Stringссылку.)
Джейсон Минард

Просто наперед, если вы перебираете строку цифр, они будут символами, и [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

Я предполагаю, что Kotlin делает преобразование из java.lang.Longи долго примитивным в kotlin.Longавтоматическое в этом случае. Итак, это решение, но я был бы рад увидеть инструмент без использования пакета java.lang.


6

На самом деле, в 90% случаев вам также нужно проверить «long», так что вам нужно:

"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)эквивалентен Java- еLong.parseLong(String, int) :

Разбирает строковый аргумент как длинную со знаком в основании, указанном вторым аргументом. Все символы в строке должны быть цифрами указанного радиуса ...

И тут java.lang.Long.decode(String)на снимке появляется:

Декодирует строку в длинный. Принимает десятичные, шестнадцатеричные и восьмеричные числа, заданные следующей грамматикой: 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?
Джеймс Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.