37

Scala で 16 進文字列を数値 (Int、Long、Short) に変換する方法が見つかりません。

のようなものはあり"A".toInt(base)ますか?

4

5 に答える 5

54

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 パラメーターを 16 進数に解析しようとしていない場合は、Scala が 16 進数の整数リテラルを直接サポートしていることに注意してください。この場合:

val x = 0xCAFE
> x: Int = 51966

Scala は素晴らしいと思いませんか? :-)

于 2012-05-26T05:06:34.550 に答える
31

7zark7の答えは正しいですが、いくつか追加したいと思います。暗黙の from StringtoIntは危険な場合があります。代わりに、ラッパーへの暗黙的な変換を使用して、解析を明示的に呼び出すことができます。

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
于 2012-05-26T06:04:17.063 に答える
11

ワンライナーはどうですか?

def hexToInt(s: String): Int = {
    s.toList.map("0123456789abcdef".indexOf(_)).reduceLeft(_ * 16 + _)
}

scala> hexToInt("cafe")
res0: Int = 51966

そして、2番目の項目に答えるには:

"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
于 2013-08-21T17:34:35.487 に答える
7

UUID を 16 進数から 10 進数に変換したい人は誰でも、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

これの実用的なアプリケーションの 1 つは、バーコードで UUID をエンコードすることです。この場合、Code128 は、英数字の文字列よりもすべての桁で短いバーコードを生成します。http://en.wikipedia.org/wiki/Code128#Subtypesのサブタイプ「128A」に関するメモを参照してください。

于 2013-09-04T05:10:20.213 に答える