代码之家  ›  专栏  ›  技术社区  ›  Dennis Vash

为什么单字符和“单字符字符串”在转换为长字符时不相等(.to long())

  •  1
  • Dennis Vash  · 技术社区  · 6 年前

    我想把 Long 变量,并将其添加到变量中 工作 代码:

    private fun Long.sumDigits(): Long {
        var n = this
        this.toString().forEach { n += it.toString().toLong() }
        return n
    }
    

    用法: assert(48.toLong() == 42.toLong().sumDigits())

    我不得不用 it.toString() 为了让它工作,所以我带着下一个测试来了,但我没有得到它的结果:

    @Test
    fun toLongEquality() {
        println("'4' as Long = " + '4'.toLong())
        println("\"4\" as Long = " + "4".toLong())
        println("\"42\" as Long = " + "42".toLong())
    
        assert('4'.toString().toLong() == 4.toLong())
    }
    

    输出:

    '4' as Long = 52
    "4" as Long = 4
    "42" as Long = 42
    

    这是个好习惯吗 char.toString().toLong() 或者有更好的方法来转换 char ?

    "4" 代表人 烧焦 s?为什么不等于 烧焦 代表?

    2 回复  |  直到 6 年前
        1
  •  2
  •   user8959091user8959091    6 年前

    从文档中:

    类Char:Comparable(source)表示16位Unicode 性格。在JVM上,这种类型的不可为空值是 表示为基元类型char的值。

    有趣的toLong():长

    将此字符的值返回为Long。


    当你使用 '4' as Long 实际上,您得到了字符“4”的Unicode(ASCII)代码

        2
  •  2
  •   Klitos Kyriacou    6 年前

    正如mTak所说,Char表示Unicode值。如果在JVM上使用Kotlin,则可以按如下方式定义函数:

    private fun Long.sumDigits() = this.toString().map(Character::getNumericValue).sum().toLong()
    

    没有理由回来 Long 而不是 Int ,但我和你的问题一样。

    非JVM版本的Kotlin没有 Character 类;使用 map {it - '0'} 相反。