背景
使用Integer.parseInt(someIntString,基数(并不总是有效的,在某些情况下可能会返回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((函数(它可能与我编写的代码非常相似(,但我想处理任何基数,而不仅仅是十六进制。
我还知道使用parseInt支持负值解析,所以这就是它可能导致异常的原因。
问题
是否有内置函数或已知算法可以使用任何基数将字符串解析为整数?
当然,我假设整数变量可以保存值(使用最大4个字节(,并且数字的符号是不相关的。
好的,我认为这个问题没有内置的解决方案,但使用与我在问题中编写的代码大致相同的代码很容易解决:
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;
}
问题是java不支持无符号整数,因为"ff00ff00"大于正整数,java将其视为超出范围。一个简单的解决方案是使用Long.parseLong(字符串,基数(,理想情况下,您可以将受影响变量的类型更改为Long,但也可以使用一些棘手的强制转换。