使用Integer.parseInt(someIntString, radix)并不总是有效,并且在某些情况下可能会返回NumberFormatException。
我已经检查过API,并且会说会返回这样的例外:
如果无法将字符串解析为整数值,或者radix< Character.MIN_RADIX || 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()函数(它可能与我编写的代码非常相似),但我想处理任何基数而不仅仅是十六进制。
我也知道使用parseInt支持负值解析,这就是它可能导致异常的原因。
是否有使用任何基数将字符串解析为整数的内置函数或已知算法?
我当然假设整数变量可以保存该值(使用最多4个字节)并且该数字的符号无关紧要。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
问题是java不支持无符号整数,因为&#34; ff00ff00&#34;如果大于正数int,则java将其视为超出范围。一个简单的解决方案是使用Long.parseLong(string,radix),理想情况下你可以将受影响的变量的类型更改为long,但是你也可以使它适用于一些棘手的转换。