在Scala中找不到将Hex字符串转换为数字(Int,Long,Short)的方法。
有类似"A".toInt(base)
的内容吗?
答案 0 :(得分:46)
您可以使用Java库:
val number = Integer.parseInt("FFFF", 16)
> number: Int = 65535
或者,如果你感到有点兴奋: - ):
implicit def hex2int (hex: String): Int = Integer.parseInt(hex, 16)
val number: Int = "CAFE" // <- behold the magic
number: Int = 51966
此外,如果您没有专门尝试将String参数解析为十六进制,请注意Scala直接支持十六进制整数文字。在这种情况下:
val x = 0xCAFE
> x: Int = 51966
Scala不是很精彩吗? : - )
答案 1 :(得分:29)
7zark7答案是正确的,但我想补充一些。
从String
到Int
的隐含可能很危险。相反,您可以使用隐式转换来包装并显式调用解析:
class HexString(val s: String) {
def hex = Integer.parseInt(s, 16)
}
implicit def str2hex(str: String): HexString = new HexString(str)
val num: Int = "CAFE".hex
答案 2 :(得分:11)
单线程怎么样?
def hexToInt(s: String): Int = {
s.toList.map("0123456789abcdef".indexOf(_)).reduceLeft(_ * 16 + _)
}
scala> hexToInt("cafe")
res0: Int = 51966
回答你的第二项:
是否有“A”.toInt(base)?
是的,仍然是一个单行:
def baseToInt(s: String, base: String): Int = {
s.toList.map(base.indexOf(_)).reduceLeft(_ * base.length + _)
}
scala> baseToInt("1100", "01")
res1: Int = 12
答案 3 :(得分:6)
任何想要将UUID从十六进制转换为十进制数的人都可以借用Benoit的答案并使用BigDecimal来完成这项工作:
scala> "03cedf84011dd11e38ff0800200c9a66".toList.map(
| "0123456789abcdef".indexOf(_)).map(
| BigInt(_)).reduceLeft( _ * 16 + _)
res0: scala.math.BigInt = 5061830576017519706280227473241971302
或更一般地说:
def hex2dec(hex: String): BigInt = {
hex.toLowerCase().toList.map(
"0123456789abcdef".indexOf(_)).map(
BigInt(_)).reduceLeft( _ * 16 + _)
}
def uuid2dec(uuid: UUID): BigInt = {
hex2dec(uuid.toString.replace("-",""))
}
然后:
scala> import java.util.UUID
scala> val id = UUID.fromString("3CEDF84-011D-D11E-38FF-D0800200C9A66")
id: java.util.UUID = 03cedf84-011d-d11e-38ff-0800200c9a66
scala> uuid2dec(id)
res2: BigInt = 5061830576017519706280227473241971302
这方面的一个实际应用是在条形码中编码UUID,其中Code128为所有数字生成比使用字母数字字符串更短的条形码。请参阅http://en.wikipedia.org/wiki/Code128#Subtypes上有关子类型“128A”的说明。
答案 4 :(得分:2)
对于Long和Short,也可以直接使用Java方法,如
Long2long(java.lang.Long.valueOf(hexString, 16))
在某些情况下甚至可以省略Long2long
。