[???] / [Java FAQ] / [S007]
S007: プリミティブ型/値の変換 - primitive types

[S007 Q-01]
Back
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]
Back
文字列(String)を double に変換するには? [S007 A-02] Double#parseDouble(String) を使います。 他に Double のインスタンスを作る方法も有ります。 Double doubleObject = Double.valueOf(文字列); double d = doubleObject.doubleValue(); 参考記事 [JavaHouse-Brewers:314]
[S007 Q-03]
Back
double を int に変換するには? [S007 A-03] キャストを使います。 たとえば、 double d = 2.5; int i = (int)d; のようにします。 小数点以下の値は、0 方向への丸めになります。 すなわち正の数ならばより小さい整数に、 負の数ならばより大きい整数になります。 参考記事 [JavaHouse-Brewers:8415]
[S007 Q-04]
Back
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]
Back
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]
Back
オブジェクトを文字列化するには? [S007 A-06] 全てのオブジェクトは、Object#toString() によって文字列化が可能です。 どのような文字列になるのかは、それぞれのクラスによります。 参考記事 [JavaHouse-Brewers:1623]
[S007 Q-07]
Back
文字列を指定されたクラスの値(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]
Back
文字 '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]
Back
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]
Back
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]
Back
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]
Back
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]

Back
contributor: Norikazu Nakato
コメントの送り先:Java FAQ BBS