2020/10/29 公開
・文字数字を数値に変換
文字列(String型)で格納された整数値を、int型の整数に変換する方法を説明しています。
"12345678" → 12345678 "-230091" → -230091
Javaには、String型をint型に変換するInteger.parseIntメソッド、Integer.ValueOfメソッドが用意されています。
Integer.parseIntメソッド
public int parseInt( String s )
■文字列の引数を符号付き10進数の整数型として構文解析します。 パラメータ s : 整数の値にに変換する文字列の値 戻り値 int型の整数
Integer.valueOfメソッド
public static Integer valueOf( String s )
■指定されたStringの値を保持するIntegerオブジェクトを返します。 パラメータ s : 整数(Integerクラス)に変換する文字列の値 戻り値 Integerクラスの整数の値
ここで説明するのは、上記のようなメソッドの作り方です。
具体的には、String型をbyte配列に変換し、そのbyte配列の値から整数の値を求めるものです。
例えば、文字列が"1287"である場合、これをbyte型の配列codeに変換すると。
code[ 0 ] = 49; // '1'のASCIIコード code[ 1 ] = 50; // '2'のASCIIコード code[ 2 ] = 56; // '8'のASCIIコード code[ 3 ] = 55; // '7'のASCIIコード
となります。各文字をASCIIコードに変換された値を格納します。
このbyte配列の添え字の0から3の順に以下のような計算を行います。
int result = 0; result = (int)code[ 0 ] - 48; // resultの値 : 1 result = ( result * 10 ) + (int)code[ 1 ] - 48; // resultの値 : 12 result = ( result * 10 ) + (int)code[ 2 ] - 48; // resultの値 : 128 result = ( result * 10 ) + (int)code[ 3 ] - 48; // resultの値 : 1287
配列の添え字の小さいほうから順番に、10倍しながら足していくことで桁を1つずつ上げます。
'0'のASCIIコードが48なので、配列codeの各値から48を引いて計算します。
また、以下のように48の代わりに'0'を直接ソースコードに書いて計算させることもできます。
int result = 0; result = (int)code[ 0 ] - '0'; // resultの値 : 1 result = ( result * 10 ) + (int)code[ 1 ] - '0'; // resultの値 : 12 result = ( result * 10 ) + (int)code[ 2 ] - '0'; // resultの値 : 128 result = ( result * 10 ) + (int)code[ 3 ] - '0'; // resultの値 : 1287
static int parseInt10( String str )が作成したメソッドで、文字列の最初の文字が'+'、'-'の場合の処理も記載しています。また、数字以外の文字がある場合、符号が数字の途中に有る場合など変換に失敗したときに結果をint型で持てる最小値-2147483648を戻すようにしています。
StringtoValue10.java ← クリックしてダウンロードページに移動
001: public class StringtoValue10 { 002: // 文字列を10進数に変換 003: // エラーの場合、int型の最小値"Integer.MIN_VALUE"を戻す 004: static int parseInt10( String str ) 005: { 006: // 文字数を取得 007: int len = str.length(); 008: 009: // 文字数が1未満の場合、intの最小値を戻す 010: if ( 1 > len ) 011: return Integer.MIN_VALUE; 012: 013: // 文字列をbyte配列に変換 014: byte[] code = str.getBytes(); 015: 016: // 整数の符号の初期化(-1:'-' 1:'+') 017: int sign = 1; 018: 019: // 結果格納用の変数 020: int result = 0; 021: 022: // 変換するループ 023: for ( int i = 0; i < len; i++ ) { 024: switch ( code[ i ] ) { 025: case '-': 026: // マイナス符号の処理 027: 028: // 文字列の途中に'-'が有る 029: if ( 0 != i ) 030: return Integer.MIN_VALUE; 031: 032: // '-'だけの文字列 033: if ( 2 > len ) 034: return Integer.MIN_VALUE; 035: 036: // 符号を'-'にする 037: sign = -1; 038: break; 039: 040: case '+': 041: // プラス符号の処理 042: 043: // 文字列の途中に'+'が有る 044: if ( 0 != i ) 045: return Integer.MIN_VALUE; 046: 047: // '+'だけの文字列 048: if ( 2 > len ) 049: return Integer.MIN_VALUE; 050: 051: // 符号を'+'にする 052: sign = 1; 053: break; 054: 055: case '0': 056: case '1': 057: case '2': 058: case '3': 059: case '4': 060: case '5': 061: case '6': 062: case '7': 063: case '8': 064: case '9': 065: // 数字の処理の処理 066: // 桁を1桁増やす 067: result *= 10; 068: 069: // code[i]の値を整数にキャストして足す 070: result += (int)( (byte)code[ i ] - '0' ); 071: 072: break; 073: 074: default: 075: // 数字と符号以外の文字の場合 076: return Integer.MIN_VALUE; 077: } 078: } 079: 080: // 最後に符号を掛けて戻す 081: return result * sign; 082: } 083: 084: 085: // メイン 086: public static void main( String[] args ) { 087: // 結果を格納する変数 088: int result; 089: 090: // 変換結果出力 091: result = parseInt10( "1234567" ); 092: System.out.println( result ); 093: 094: result = parseInt10( "-99999" ); 095: System.out.println( result ); 096: 097: result = parseInt10( "+8888" ); 098: System.out.println( result ); 099: 100: result = parseInt10( "-" ); 101: System.out.println( result ); 102: 103: result = parseInt10( "+" ); 104: System.out.println( result ); 105: 106: result = parseInt10( "678+9" ); 107: System.out.println( result ); 108: } 109: }
StringtoValue10.Javaの出力結果
1234567 -99999 8888 -2147483648 -2147483648 -2147483648
変換に失敗している場合、int型の最小値-2147483648が出力されています。
以上です。
■関連コンテンツ
文字列→byte配列 | Stringからbyte[] |
文字列 | 文字列について |
変数の最小値・最大値 | 変数の最小値と最大値を取得する方法を解説 |
2進数を整数に変換 | "11001"→25 |
■新着情報
2022.07.07 | 外部プログラムの実行 | exeファイル実行 |
2022.07.06 | 完全数 | 6=1+2+3 |