今回はKotlin標準で用意されている数値の型やその表記、キャスト、演算子などをまとめてお送りします。
数値の型
符号有りの数値型は6種類。
型名 | ビット数 | 最小数 ~ 最大数 | 値の表記例 |
---|---|---|---|
Byte | 8 | -128 ~ 127 | 57 |
Short | 16 | -32768 ~ 32767 | 298 |
Int | 32 | -2147483648 ~ 2147483647 | 12345 |
Long | 64 | -9223372036854775808 ~ 9223372036854775807 | 12345L |
Float | 32 | -3.4028235×1038 ~ 3.4028235×1038 | 1.9083F |
Double | 64 | – 1.7976931348623157×10308 ~ 1.7976931348623157×10308 | 8.28921 |
表記の際にはアンダースコアで桁を区切ることが許されています。
val a = 1_234_567_890 //1234567890
unsigned(符号無し)の数値型はKotlin1.3以降で使用可能。
型名 | ビット数 | 最小数 ~ 最大数 | 値の表記例 |
---|---|---|---|
UByte | 8 | 0 ~ 255 | 10u |
UShort | 16 | 0 ~ 65535 | 567u |
UInt | 32 | 0 ~ 4294967295 | 70191u |
ULong | 64 | 0 ~ 18446744073709551615 | 1808383uL |
数値型へのキャスト(変換)
Kotlinでは数値型の暗黙的なキャストは行われません。そのため下のようなコードはエラーです。
val a = 1
val b: Byte = a
//Type mismatch: inferred type is Int but Byte was expected
//型の不一致: 推論される型はIntだが、Byte型が求められる
他の数値型への明示的なキャストはto〇〇
メソッドを使います。
"123".toByte() //123 文字列 → Byte
45.toDouble() //45.0 Int → Double
678.9.toInt() //678 Double → Int 小数点以下切り捨て
ただし少数の文字列からInt型などへは一発では変換できません。一旦少数への型変換を行いましょう。
"12.3".toInt() //NumberFormatException
"12.3".toDouble().toInt() //12
キャストが失敗した場合にnullを代入するto〇〇orNull
も用意されています。
val a = "123.5"
val b: Int? = a.toIntOrNull() //null
val c: Double? = a.toDoubleOrNull() //123.5
エルビス演算子と組み合わせることでnullを回避することも可能。
val a = "123.5"
val b = a.toIntOrNull()?: 0 //結果がnullになれば代わりに0を代入
上記以外の数値表記
2進数/16進数は接頭語を付けて表記しましょう。println
に渡した場合などは自動的に10進数に変換されます。なお8進数には対応していません。
接頭語 | 表記例 | 10進数表記 | |
---|---|---|---|
2進数 | 0b | 0b1111011011010 | 7898 |
16進数 | 0x | 0x83f7d | 540541 |
指数表記には対応。通常の書き方でOKです。
1.23e5 == 123000.0
演算子
演算子オーバーロード
数値がサポートする演算子は数多くあります。演算子に対応したメソッドが存在するなら、そのメソッドをオーバーロードすることで独自の動作をさせることも可能です。
data class Ex(val x: Int)
operator fun Ex.plus(other: Ex) = Ex(x + other.x)
//+演算子をオーバーロード
fun main() {
val a = Ex(3)
val b = a + Ex(5)
println(b)
}
//Ex(x=8)
算術演算子
演算子 | メソッド | 意味 |
---|---|---|
a + b | a.plus(b) | + |
a – b | a.minus(b) | - |
a * b | a.times(b) | × |
a / b | a.div(b) | ÷ |
a % b | a.mod(b) | aをbで割った余り |
べき乗はKotlin.Mathパッケージのpow
メソッドで行います。
Math.pow(2.0,3.0) //8.0
%(モジュロ演算)で整数部分を落とす
Int % 2
で偶数/奇数を割り出す計算はメジャーですが、Double % 1
を使って少数から整数部分を落とすような使い方もできます。
val a = "%.3f".format(123.456 % 1) //0.456
後述のformat
メソッドと合わせて試してみてください。
Char型の計算
Char型は内部的にはUnicodeの1文字を表す数値です。そのため+-
の計算を行うことができます。
'A'.toInt() //65
'c' - 1 //b
1 + 'c' //Error。Char型が左辺でなければならない
複合代入演算子
演算子 | メソッド | 意味 |
---|---|---|
a += b | a.plusAssign(b) | a + b の結果をaに代入 |
a -= b | a.minusAssign(b) | a – b の結果をaに代入 |
a *= b | a.timesAssign(b) | a * b の結果をaに代入 |
a /= b | a.divAssign(b) | a / b の結果をaに代入 |
a %= b | a.modAssign(b) | a % b の結果をaに代入 |
インクリメント/デクリメント演算子
演算子 | メソッド | 意味 |
---|---|---|
a++ | a.inc() | aに1を足す |
a-- | a.dec() | aから1を引く |
この演算子を使う場合は前置/後置で挙動が変わるので注意しましょう。
var a = 1
var b = ++a //b == 2
var a = 1
var b = a++ //インクリメントする前の値がbに入るため、b == 1
比較演算子
いずれの演算子も結果が正解であればtrue
、そうでなければfalse
を出力します。
演算子 | メソッド | 意味 |
---|---|---|
a == b | a.equals(b) | aとbは等値である |
a != b | !(a.equals(b)) | aとbは等値ではない |
a === b | aとbは同一である | |
a !== b | aとbは同一ではない | |
a > b | a.compareTo(b) > 0 | aがbより大きい |
a < b | a.compareTo(b) < 0 | aがbより小さい |
a >= b | a.compareTo(b) >= 0 | aがb以上 |
a <= b | a.compareTo(b) <= 0 | aがb以下 |
ビット演算子
演算子 | メソッド | 意味 |
---|---|---|
a shl b | a.shl(b) | 符号付左シフト (Javaの <<) |
a shr b | a.shr(b) | 符号付右シフト (Javaの >>) |
a ushr b | a.ushr(b) | 符号なし右シフト (Javaの >>>) |
a and b | a.and(b) | ビット演算のAND |
a or b | a.or(b) | ビット演算のOR |
a xor b | a.xor(b) | ビット演算のXOR |
a.inv() | ビット反転 |
「ビット演算って何?」という方はこちらが分かりやすいです。
論理演算子
演算子 | 意味 |
---|---|
a and b a && b | 論理積: aとb両方trueであればtrue。それ以外はfalse |
a or b a || b | 論理和: aとb両方falseでなければtrue |
a xor b | 排他的論理和: aかbいずれかがtrueのときのみtrue |
! a | aのtrue/falseを反転 |
論理演算子は数値単体ではなく、結果がBooleanになる式を左辺右辺ともに配置します。
val a = 1
val b = 2
(a == 0) or (b == 2) //true
(a > 0) xor !(b < 2) //右辺に!があるためどちらもtrue → 最終結果はfalse
その他の演算子
演算子 | メソッド | 意味 |
---|---|---|
a .. b | a.rangeTo(b) | aからbまでの範囲(IntRange型を生成) |
a in b | b.contains(a) | aがbに含まれていればtrue |
a !in b | !b.contains(a) | aがbに含まれていなければtrue |
IntRange型を使ったList<Int>の作成
IntRange型をlistOf()
の引数に入れるとList<IntRange>になります。要素をInt型にしたい場合はIntRange型をそのままtoList()
でList型に変換しましょう。
val a: List<IntRange> = listOf(1..3) //[1..3]
val b: List<Int> = (1..3).toList() //[1,2,3]
3 in a //The integer literal does not conform to the expected type IntRange
//Int型(3)は期待されているIntRange型に準拠していない
3 in b //true
三項演算子
Kotlinには三項演算子は存在しません。if式でやりましょう。
val a = 10
if(a == 10) println(1) else println(0)
//trueならelseの左、falseなら右側が出力される
formatメソッドを用いた数値の整形
数値を整形するにはformat
メソッドが利用の幅が広くて便利。
//指定した桁数で少数の四捨五入
val a = 123.45
"%.0f".format(a) //123
"%.1f".format(a) //123.5
//数値を3桁でカンマ区切り
val a = 123456789.123
"%,d".format(a.toInt()) //123,456,789
//ゼロ埋め
val a = 12345
"%,08d".format(a) //0012,345