How to convert String to Long in Kotlin?

前端 未结 11 982
旧时难觅i
旧时难觅i 2021-01-31 13:00

So, due to lack of methods like Long.valueOf(String s) I am stuck.

How to convert String to Long in Kotlin?

相关标签:
11条回答
  • 2021-01-31 13:41

    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
    
    0 讨论(0)
  • 2021-01-31 13:43

    Extension methods are available for Strings to parse them into other primitive types. Examples below:

    • "true".toBoolean()
    • "10.0".toFloat()
    • "10.0".toDouble()
    • "10".toByte()
    • "10".toShort()
    • "10".toInt()
    • "10".toLong()
    0 讨论(0)
  • 2021-01-31 13:44

    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.

    0 讨论(0)
  • 2021-01-31 13:45

    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          |
    +—————————————————————————————————————————————+——————————+———————————————————————+
    
    0 讨论(0)
  • 2021-01-31 13:47

    To convert a String to Long (that represents a 64-bit signed integer) in Kotlin 1.3 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
    
    0 讨论(0)
提交回复
热议问题