2013-06-21 172 views
0

你好我想有刺转换,如“ABC-d1_23QWEwer”为int数字符串转换为int得到一个唯一的编号

StringBuilder sb = new StringBuilder(); 
int intServiceName = 0; 
String stringServiceValue; 
for (int i = 0; i < serviceName.length(); i++){ 
    if (DEBUG) Log.i(TAG, "serviceName.length() loop i: " + i); 
    sb.append(String.valueOf(Character.getNumericValue(serviceName.charAt(i)))); 
    if (DEBUG) Log.i(TAG, "serviceName.length() loop i after: " + i); 
} 
if (DEBUG) Log.i(TAG, "serviceName.length() loop end2"); 
stringServiceValue = sb.toString(); 
if (DEBUG) Log.i(TAG, "serviceName.length() loop end: "+stringServiceValue.replaceAll("\\D+","")); 
stringServiceValue = stringServiceValue.replaceAll("\\D+",""); 
if (DEBUG) Log.i(TAG, "serviceName.length() loop endstringServiceValue: "+ stringServiceValue); 
intServiceName = Integer.parseInt(stringServiceValue); 
if (DEBUG) Log.i(TAG, "serviceName.length() loop end123123: "+ String.valueOf(intServiceName)); 

当代码到达此行我得到一个错误:

intServiceName = Integer.parseInt(stringServiceValue); 

我做错了什么?这是错误日志

06-21 19:12:54.760: E/AndroidRuntime(11139): FATAL EXCEPTION: AsyncTask #4 
06-21 19:12:54.760: E/AndroidRuntime(11139): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-21 19:12:54.760: E/AndroidRuntime(11139): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.lang.Thread.run(Thread.java:856) 
06-21 19:12:54.760: E/AndroidRuntime(11139): Caused by: java.lang.NumberFormatException: Invalid int: "2914282912918292114" 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.lang.Integer.invalidInt(Integer.java:138) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.lang.Integer.parse(Integer.java:378) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.lang.Integer.parseInt(Integer.java:366) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.lang.Integer.parseInt(Integer.java:332) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at com.wr.noc.AsyncTasks.doInBackground(AsyncTasks.java:113) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at com.wr.noc.AsyncTasks.doInBackground(AsyncTasks.java:1) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
06-21 19:12:54.760: E/AndroidRuntime(11139): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
06-21 19:12:54.760: E/AndroidRuntime(11139): ... 5 more 
+1

如何“ABC-d1_23QWEwer”考虑到是一个整数?你想从中提取数字吗?如果是这样,你需要你自己的解析逻辑。 – asgs

+0

这就是为什么我使用Character.getNumericValue() – Waqleh

+2

字符串的.hashCode()函数会不会更容易和更简单? – GojiraDeMonstah

回答

1

使用long而不是整数。你的电话号码是太大 如果你需要一个int不长

sb.append(String.valueOf(Character.getNumericValue(serviceName.charAt(i))).substring(0, 1)); 
5

观察:

06-21 19:12:54.760: E/AndroidRuntime(11139): Caused by: java.lang.NumberFormatException: Invalid int: "2914282912918292114" 

我认为它会溢出,你可以使用很长的来代替。

1

您的号码对于整数来说太大。考虑到使用长:

numServiceName = Long.parseLong(stringServiceValue); 
2

数量2,914,282,912,918,292,114太大而不适合用int值。它只是适合长时间内(最大值为签订长期IS 9,223,372,036,854,775,807),所以你可以做

long l = Long.parseLong(someString); 

虽然一个更好的解决办法是要问自己,为什么你需要是如此庞大的数字。重新设计算法以避免出现如此大的数字会使事情变得更容易。

1

您的号码2914282912918292114太大而无法成为intint可容纳的最大值是2,147,483,647。您需要使用long,其最大值可以为9,223,372,036,854,775,807

Long.parseLong(yourString); 

如果你正在处理庞大的数字,您可以使用号码BigInteger类整数和BigDecimal与十进制数字。

0

经过整串这样你可以做这样的事情:

// not sure if the syntax is correct 

int myInt[] = new int[myString.length()]; 

for (int i = 0; i < myString.length(); i++) 
    myInt.add(myString[i]); 
相关问题