scala - tripa - que tension debo usar en mi raqueta
Cuerda Hexagonal a Int, Corta y Larga en Scala (5)
¿Qué pasa con una sola línea?
def hexToInt(s: String): Int = {
s.toList.map("0123456789abcdef".indexOf(_)).reduceLeft(_ * 16 + _)
}
scala> hexToInt("cafe")
res0: Int = 51966
Y para contestar tu segundo item:
¿Hay algo como "A" .toInt (base)?
Sí, todavía como una sola línea:
def baseToInt(s: String, base: String): Int = {
s.toList.map(base.indexOf(_)).reduceLeft(_ * base.length + _)
}
scala> baseToInt("1100", "01")
res1: Int = 12
Simplemente no se puede encontrar una manera de transformar una cadena hexagonal en un número (Int, Long, Short) en Scala.
¿Hay algo como "A".toInt(base)
?
Cualquiera que desee convertir un UUID de hex a un número decimal puede tomar prestado de la respuesta de Benoit y usar BigDecimal para el trabajo:
scala> "03cedf84011dd11e38ff0800200c9a66".toList.map(
| "0123456789abcdef".indexOf(_)).map(
| BigInt(_)).reduceLeft( _ * 16 + _)
res0: scala.math.BigInt = 5061830576017519706280227473241971302
O más generalmente:
def hex2dec(hex: String): BigInt = {
hex.toLowerCase().toList.map(
"0123456789abcdef".indexOf(_)).map(
BigInt(_)).reduceLeft( _ * 16 + _)
}
def uuid2dec(uuid: UUID): BigInt = {
hex2dec(uuid.toString.replace("-",""))
}
Entonces:
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
Una aplicación práctica para esto es codificar el UUID en un código de barras, donde Code128 produce un código de barras más corto para todos los dígitos que para las cadenas alfanuméricas. Consulte las notas sobre el subtipo "128A" en http://en.wikipedia.org/wiki/Code128#Subtypes .
La respuesta de 7zark7 es correcta, pero quiero hacer algunas adiciones. Implícito de String
a Int
puede ser peligroso. En su lugar, puede utilizar la conversión implícita para envolver y llamar explícitamente el análisis:
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
Para Largo y Corto, también es posible usar los métodos Java directamente como
Long2long(java.lang.Long.valueOf(hexString, 16))
donde Long2long
puede incluso omitirse en algunos casos.
Puedes usar las librerías de Java:
val number = Integer.parseInt("FFFF", 16)
> number: Int = 65535
O si te sientes chispeante :-):
implicit def hex2int (hex: String): Int = Integer.parseInt(hex, 16)
val number: Int = "CAFE" // <- behold the magic
number: Int = 51966
-
Edición: TAMBIÉN, si no está específicamente tratando de analizar un parámetro String en hexadecimal, tenga en cuenta que Scala admite directamente literales enteros hexadecimales. En este caso:
val x = 0xCAFE
> x: Int = 51966
¿No es Scala maravilloso? :-)