数字('0'
〜'9'
)と数値(0
〜9
) の相互変換方法について。
Kotlin での方法について述べるが、他の言語でも考え方は同じ1である。
基本的な方法
半角数字 c: Char
を数値に変換:
c - '0'
数値 i: Int
を半角数字に変換:
'0' + i
いずれも、半角数字 '0'
を全角数字 '0'
に置き換えることで、全角数字('0'
〜'9'
)と数値(0
〜9
)の相互変換も行える。
解説
Char
型の値は数値
Kotlin の Char
型の値は Unicode での1文字[^Unicode での1文字]を表す。
[^Unicode での1文字]: 厳密に言えば UTF-16 での1符号単位を表す。U+0000〜U+FFFF の範囲に限れば Unicode での1文字(1コードポイント)と一致する。
Unicode の各文字は U+XXXX という表記[^U+XXXX という表記]で示される。
XXXX の部分は4桁の16進数である。
例えば、半角アルファベットの 'A'
は U+0041、'B'
は U+0042、ひらがなの 'あ'
であれば U+3042 である。
[^U+XXXX という表記]: U+FFFF より大きい、U+10000〜U+10FFFF の範囲の文字もあるが、Char
の値1つでは表せないので当記事では扱わない。
Char
型の値は内部では16ビットの数値であるため、Char.toInt
などの関数で他の数値型の値に変換できる。
Char
を他の数値型に変換した値は、U+XXXX の XXXX の値である。
Char
の演算
Char
クラスには +
と -
の演算子が定義されている。
Char
- Char
-> Int
'B' - 'A' // -> 1
// ↑は↓と等価。
'B'.toInt() - 'A'.toInt()
Char
+ Int
-> Char
'A' + 1 // -> 'B'
// ↑は↓と等価。
('A'.toInt() + 1).toChar()
Char
- Int
-> Char
'B' - 1 // -> 'A'
// ↑は↓と等価。
('B'.toInt() - 1).toChar()
注意
Int
+ Char
や Int
- Char
はできない。
Int
クラスにそのような演算子が定義されていないからだ。
数字と数値の相互変換
半角数字 '0'
〜'9'
は U+0030〜U+0039 と連続している。
そのため半角数字から半角数字 '0'
を引くと、左項の半角数字が表す数値が得られる。
'1' - '0' // -> 1
また半角数字 '0'
に数値を足すと、右項の数値を表す半角数字が得られる。
'0' + 1 // -> '1'
全角数字 '0'
〜'9'
も U+FF10〜U+FF19 で連続しているので同様のことができる。
他にも数値を表すような文字や記号で Unicode コードポイントが連続しているものがあれば、同じような相互変換ができる。
しかし残念ながら漢数字は連続していないためできない。('一': U+4E00、'二': U+4E8C、…)
-
文字が内部では数値で表されていて演算ができるというところは同じ。扱える文字コードや演算の仕方は異なるだろう。 ↩