0

バックグラウンド

Integer.parseInt(someIntString, radix)を使用しても常に機能するとは限らず、場合によっては NumberFormatException が返されることがあります。

API を確認したところ、そのような例外が返されると書かれています。

文字列を整数値として解析できない場合、または基数 < Character.MIN_RADIX || 基数 > Character.MAX_RADIX.

例外の原因となるサンプル コード:

System.out.println(Integer.parseInt("ff00ff00",16));

Javaでも同じ例外が発生します。

整数は 4 バイトを保持するため、これでも機能するはずですが、機能しません。

そのようなことが可能であることの証明は次のとおりです。

final String input="ff00ff00";
int output=0;
for(int i=0;i<input.length();++i)
  {
  output<<=4;
  final char c=input.charAt(i);
  if(c>='a')
    output+=c-'a'+10;
  else output+=c-'0';
  }
System.out.println(output);
System.out.println(Integer.toHexString(output));

私はColor.parseColor()関数の使用を知っていることに注意してください(そして、おそらく私が書いたコードに非常に似ています) が、16 進数だけでなく、任意の基数を処理したいと考えています。

parseInt を使用すると負の値の解析がサポートされることも知っているため、おそらく例外が発生します。

質問

基数を使用して文字列を整数に解析するための組み込み関数または既知のアルゴリズムはありますか?

もちろん、整数変数は値を保持でき(最大4バイトを使用)、数値の符号は無関係であると想定しています。

4

2 に答える 2

1

わかりました、この質問には組み込みのソリューションはないと思いますが、質問で書いたのとほぼ同じコードを使用して解決するのは非常に簡単です:

public static int parseInt(final String input,final int radix)
  {
  int output=0;
  for(int i=0;i<input.length();++i)
    {
    output*=radix;
    final char c=input.charAt(i);
    if(c>='a')
      output+=c-'a'+10;
    else output+=c-'0';
    }
  return output;
  }
于 2013-04-17T19:01:08.023 に答える
0

問題は、Java が符号なし整数をサポートしていないことです。"ff00ff00" は正の整数よりも大きいため、Java はそれを範囲外としてカウントします。簡単な解決策は、Long.parseLong(string, radix) を使用することです。理想的には、影響を受ける変数の型を long に変更しますが、トリッキーなキャストでも機能させることができます。

于 2014-04-08T01:27:07.587 に答える