How to convert String to Long in Kotlin?
KotlinKotlin Problem Overview
So, due to lack of methods like Long.valueOf(String s)
I am stuck.
How to convert String to Long in Kotlin?
Kotlin Solutions
Solution 1 - Kotlin
1. string.toLong()
> Parses the string as a [Long] number and returns the result.
> @throws NumberFormatException if the string is not a valid > representation of a number.
2. string.toLongOrNull()
> Parses the string as a [Long] number and returns the result or null
> if the string is not a valid representation of a number.
3. str.toLong(10)
> Parses the string as a [Long] number and returns the result.
> @throws NumberFormatException if the string is not a valid > representation of a number.
> @throws IllegalArgumentException when > [radix] is not a valid radix for string to number conversion.
public inline fun String.toLong(radix: Int): Long = java.lang.Long.parseLong(this, checkRadix(radix))
4. string.toLongOrNull(10)
> Parses the string as a [Long] number and returns the result or null
> if the string is not a valid representation of a number.
> @throws IllegalArgumentException when [radix] is not a valid radix for string > to number conversion.
public fun String.toLongOrNull(radix: Int): Long? {...}
5. java.lang.Long.valueOf(string)
public static Long valueOf(String s) throws NumberFormatException
Solution 2 - Kotlin
String
has a corresponding extension method:
"10".toLong()
Solution 3 - Kotlin
Extension methods are available for String
s to parse them into other primitive types. Examples below:
Solution 4 - Kotlin
Note: Answers mentioning jet.String
are outdated. Here is current Kotlin (1.0):
Any String
in Kotlin already has an extension function you can call toLong()
. Nothing special is needed, just use it.
All extension functions for String
are documented. You can find others for standard lib in the api reference
Solution 5 - Kotlin
Actually, 90% of the time you also need to check the 'long' is valid, so you need:
"10".toLongOrNull()
There is an 'orNull' equivalent for each 'toLong' of the basic types, and these allow for managing invalid cases with keeping with the Kotlin? idiom.
Solution 6 - Kotlin
It's interesting. Code like this:
val num = java.lang.Long.valueOf("2");
println(num);
println(num is kotlin.Long);
makes this output:
2
true
I guess, Kotlin makes conversion from java.lang.Long
and long primitive to kotlin.Long
automatically in this case. So, it's solution, but I would be happy to see tool without java.lang package usage.
Solution 7 - Kotlin
To convert a String
to Long
(that represents a 64-bit signed integer) in Kotlin is quite simple.
You can use any of the following three methods:
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
Solution 8 - Kotlin
One good old Java possibility what's not mentioned in the answers is java.lang.Long.decode(String)
.
Decimal Strings:
Kotlin's String.toLong()
is equivalent to Java's Long.parseLong(String)
:
> Parses the string argument as a signed decimal long. ... The
> resulting long value is returned, exactly as if the argument and the
> radix 10 were given as arguments to the parseLong(java.lang.String, int)
method.
Non-decimal Strings:
Kotlin's String.toLong(radix: Int)
is equivalent to Java's eLong.parseLong(String, int)
:
> Parses the string argument as a signed long in the radix specified by > the second argument. The characters in the string must all be digits of the specified radix ...
And here comes java.lang.Long.decode(String)
into the picture:
> Decodes a String into a Long. Accepts decimal, hexadecimal, and octal
> numbers given by the following grammar: DecodableString:
>
> (Sign) DecimalNumeral | (Sign) 0x HexDigits | (Sign) 0X HexDigits | (Sign) # HexDigits | (Sign) 0 OctalDigits
>
> Sign: - | +
That means that decode
can parse Strings like "0x412"
, where other methods will result in a 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
Solution 9 - Kotlin
If you don't want to handle NumberFormatException
while parsing
var someLongValue=string.toLongOrNull() ?: 0
Solution 10 - Kotlin
string.toLong()
where string
is your variable.
Solution 11 - Kotlin
Actually, there are several ways:
Given:
var numberString : String = "numberString"
// number is the Long value of numberString (if any)
var defaultValue : Long = defaultValue
Then we have:
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString is a valid number ? | true | false |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLong() | number | NumberFormatException |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull() | number | null |
+—————————————————————————————————————————————+——————————+———————————————————————+
| numberString.toLongOrNull() ?: defaultValue | number | defaultValue |
+—————————————————————————————————————————————+——————————+———————————————————————+