[???] /
[Java FAQ] / [S007]
S007: プリミティブ型/値の変換 - primitive types
[S007 Q-01]
int を文字列(String)に変換するには?
[S007 A-01]
Integer#toString(int)もしくは String#valueOf(int)を使います。
他のプリミティブ型についても同様のことが言えます。それをまとめたものが、以下の表です。
プリミティブ型 Stringを使う場合 それ以外の方法
===============================================================
boolean valueOf(boolean) new Boolean(boolean).toString()
char valueOf(char) new Character(char).toString()
byte valueOf(int) Byte.toString(byte)
short valueOf(int) Short.toString(short)
int valueOf(int) Integer.toString(int)
long valueOf(long) Long.toString(long)
float valueOf(float) Float.toString(float)
double valueOf(double) Double.toString(double)
===============================================================
また、次のような書き方もできます。
int x;
String s;
s = "" + x;
参考記事 [JavaHouse-Brewers:4046]
[S007 Q-02]
文字列(String)を double に変換するには?
[S007 A-02]
Double#parseDouble(String) を使います。
他に Double のインスタンスを作る方法も有ります。
Double doubleObject = Double.valueOf(文字列);
double d = doubleObject.doubleValue();
参考記事 [JavaHouse-Brewers:314]
[S007 Q-03]
double を int に変換するには?
[S007 A-03]
キャストを使います。
たとえば、
double d = 2.5;
int i = (int)d;
のようにします。
小数点以下の値は、0 方向への丸めになります。
すなわち正の数ならばより小さい整数に、
負の数ならばより大きい整数になります。
参考記事 [JavaHouse-Brewers:8415]
[S007 Q-04]
int を16進数の文字列にするには?
[S007 A-04]
Integer#toString(int, int) を使います。
また、符号無しとして文字列化する
Integer#toBinaryString(int i)
Integer#toHexString(int i)
Integer#toOctalString(int i)
というのもあります。
参考記事 [JavaHouse-Brewers:2042] [JavaHouse-Brewers:4202]
[S007 Q-05]
16進ダンプしたいのですが?
[S007 A-05]
A. sun.misc.HexDumpEncoder
というものがあって、こんな出力が
0000: CA FE BA BE 00 03 00 2D 00 28 0A 00 0A 00 15 07 .......-.(......
0010: 00 16 0A 00 02 00 15 07 00 17 08 00 18 0A 00 04 ................
0020: 00 19 09 00 1A 00 1B 0A 00 1C 00 1D 07 00 1E 07 ................
0030: 00 1F 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29 ........()
:
:
:
こういうソースでえられます。
import sun.misc.HexDumpEncoder;
import sun.misc.CharacterEncoder;
import java.io.FileInputStream;
import java.io.IOException;
public class Dump {
static public void main(String[] args) throws Exception {
CharacterEncoder encoder = new HexDumpEncoder();
encoder.encode(new FileInputStream("Dump.class"), System.out);
}
}
参考記事 [JavaHouse-Brewers:2885]
[S007 Q-06]
オブジェクトを文字列化するには?
[S007 A-06]
全てのオブジェクトは、Object#toString() によって文字列化が可能です。
どのような文字列になるのかは、それぞれのクラスによります。
参考記事 [JavaHouse-Brewers:1623]
[S007 Q-07]
文字列を指定されたクラスの値(valueOf)に変換したいのですが?
[S007 A-07]
素直に書けば、該当するクラス名が classname、変換したい文字列が value で得られる場合に、
String classname = ...
String value = ...
Number n;
if (classname.equals("java.lang.Integer")) {
n = Integer.valueOf(value);
} else if (classname.equals("java.lang.Double")) {
n = Double.valueOf(value);
} else ...
となりますね。この if の連なりを何とかしたいのならば、
リフレクションを使って
Number n;
Class clazz = Class.forName(classname);
Method method =
clazz.getMethod("valueOf", new Class[] {String.class});
n = (Number)method.invoke(null, new Object[] {value});
とまとめて書く事が出来ます。
(エラー処理は省略しています。)
参考記事 [JavaHouse-Brewers:14698]
[S007 Q-08]
文字 '0' を数値の 0 に、数値の 0 を文字 '0' 変換したいのですが?
[S007 A-08]
java.lang.Character にあるメソッドを使います。
数値に変換する場合は、digit(char ch, int radix) を使います。
文字に変換したい場合は、forDigit(int digit, int radix) を使います。
radix には、たとえば16進数での話ならば 16 を指定します。
文字列と整数値の変換ならば、S007-01 を参照して下さい。
参考記事 [JavaHouse-Brewers:153]
[S007 Q-09]
short a = 2; a = -a; が int から short への変換が必要だと
コンパイルエラーになるのですがなぜですか?
[S007 A-09]
Java では byte, char, short 型は、演算前に int に変換されるという仕様になっているからです。
この場合 -a の型が int になるため、このエラーが起きます。
演算結果をキャストして a = (short)-a としてください。
参考記事 [JavaHouse-Brewers:23772]
[S007 Q-10]
Integer#parseInt が NumberFormatException を発生するのですが?
[S007 A-10]
Integer#parseInt(String s) の s に数字を現す以外の文字が入っていると、
java.lang.NumberFormatException が発生します。
整数を表す文字しか入っていないように見える場合には、
始めや終わりに空白や改行などの文字が含まれていないかを
特に確認してみて下さい。
また、勘定系のアプリケーションなどで、書式が設定
されている数字( 1,000,000 など)を処理する必要が
ある場合は、java.text.NumberFormat を利用すると便
利です。例えば "10,000" を int の 10000 に変換する
場合は
java.text.NumberFormat nf
= java.text.NumberFormat.getInstance();
:
int count = nf.parse("10,000").intValue();
となります。
参考記事 [JavaHouse-Brewers:26810]
[S007 Q-11]
byte を符号無しとして(unsigned byte として)int と相互に変換するには?
[S007 A-11]
int への変換は下位ビットのみを有効にする "& 0xFF" を使います。
int からの変換は byte へのキャストを使います。
int への変換は例えば次のようになります。
byte b;
int i;
i = b & 0xFF;
この式で -128 以上 -1 以下の範囲が 128 以上 255 以下に変換され、
0 以上 127 以下の範囲はそのまま 0 以上 127 以下になります。
この例の変換を詳細に見てみます。
例えば b に入っている値のビットパターンが 1111 1101 であったとします。
Java では byte は演算前にint に変換されるので、符合拡張の結果 b の値はまず、
1111 1111 1111 1111 1111 1111 1111 1101 になり、次に 0xFF すなわち
0000 0000 0000 0000 0000 0000 1111 1111 とビットごとに論理積がとられ
0000 0000 0000 0000 0000 0000 1111 1101 になります。
int からの変換は単なるキャストでよく、例えば次のようになります。
int i;
byte b;
b = (byte)i;
この式で 128 以上 255 以下の範囲が -128 以上 -1 以下に変換され、
0 以上 127 以下の範囲はそのまま 0 以上 127 以下になります。
Java での整数の、より小さな整数へのキャストは下位ビットを取り出す変換です。
例えば、i に入っている値のビットパターンが
0000 0000 0000 0000 0000 0000 1111 1101 のときは、b は 1111 1101 になります。
参考記事 [JavaHouse-Brewers:26824]
[S007 Q-12]
byte に対しての「>>>=」シフト演算子の結果が変なのですが?
[S007 A-12]
Java では byte は演算前に int に変換されるためです。
byte b; に対する演算 b >>>= 1; は、
b = (byte)((int)b >>> 1);
の意味になります。int へキャストされているので、負の場合には
byte で右シフトを考えたものと結果が異なってきます。
b = -1 の場合に動きをみて見ます。まず、
int へキャストされ、 -1 すなわち 1111 1111 は、
1111 1111 1111 1111 1111 1111 1111 1111 になります。
これを右シフトして
0111 1111 1111 1111 1111 1111 1111 1111 が得られます。
最後に byte へキャストされ 1111 1111 になります。
byte として右シフトしたい場合には、
b = (byte)((b & 0xFF) >>> 1);
のように書きます。
こうすると、次のように動作します。
& の前に -1 すなわち 1111 1111 は int へキャストされ、
1111 1111 1111 1111 1111 1111 1111 1111 になります。
次に 0xFF とビット毎の論理積を取って
0000 0000 0000 0000 0000 0000 1111 1111 が得られ、右シフトして
0000 0000 0000 0000 0000 0000 0111 1111 となり
最後にキャストにより 0111 1111 になります。
なお、int の時の最上位ビットは 0 ですから >>> でなく、>> 演算子でも
同じことになります。
参考記事 [JavaHouse-Brewers:26838]
contributor: Norikazu Nakato
コメントの送り先:Java FAQ BBS