编写一个程序,检查String数组是否包含有效数字。如果字符串包含“。”,则将其转换为Double,否则将其转换为Integer.Input应该是字符串{“10.20”,“123456”的数组,“12.invalid”}。
我的问题是123456变为double。我必须将其更改为int.Please help:(
public class Ch7LU3Ex1
{
public static void main(String[] args)
{
String[] str = new String []{"10.20","123456","12.invalid"};
int i,count=0;
try
{
for(i=0;i<3;i++)
{
int l = str[i].length();
for(int j=0;j<l;j++)
{
if(str[i].charAt(j)=='.')
{
count++;
}
else
{
continue;
}
}
if(count!=0)
{
double d = Double.parseDouble(str[i]);
System.out.println(d);
}
else
{
int e = Integer.parseInt(str[i]);
System.out.println(e);
}
}
}
catch(NumberFormatException e)
{
System.out.println("Invalid number");
}
}
}
答案 0 :(得分:5)
if(str[i].indexOf('.') == -1) {
int e = Integer.parseInt(str[i]);
}
else {
double d = Double.parseDouble(str[i]);
}
这比所有不需要的循环更优雅。祝你好运!
要了解其工作原理,see the String API for indexOf()。
答案 1 :(得分:2)
对于您当前使用的方式,您需要在每次迭代中将count
重置为0
,否则在找到第一个double值后的每个值都将转换为double,因为
count
值non-zero
。{/ p>
因此,在您的第一个for循环中,您需要在开始时重置计数,如下所示: -
for(i=0;i<3;i++)
{
count = 0;
现在,你真的让你的任务变得复杂。您根本不需要使用count
变量。此外,您不需要nested loop
。你可以像这样做一个简单的循环。只是不要自己处理个别角色。 Java库具有已经为您完成的方法。请改用它们: -
for (String str: arr) {
if (str.contains(".")) {
double d = Double.parseDouble(str);
} else {
int i = Integer.parseInt(str);
}
}
使用的循环称为enhanced for-loop。
String#contains()
方法检查字符串是否包含某个字符。或者,您可以使用String#indexOf()
方法在字符串中查找.
的索引。如果它返回一个正值,那么你的字符串就包含那个字符。
答案 2 :(得分:2)
我根本不会使用循环。我假设你没有随机数据,你知道每个“列”的类型应该是。
String[] str = {"10.20", "123456", "12.invalid"};
double d = Double.parseDouble(str[0]);
int i = Integer.parseInt(str[1]);
String s = str[2];
如果您不知道某个值应该是double
还是int
,则可以始终将其解析为双精度而不会丢失精度。
答案 3 :(得分:1)
似乎你必须为每个字符串将计数设置回零而你没有这样做。
答案 4 :(得分:0)
再次设置一次迭代后计数为零count=0
,在第二次迭代中计数不为零,因此再次考虑为双值
答案 5 :(得分:0)
您必须在每个检查过的元素后将count变量重置为0。这种方式计数递增,因为“10.20”包括一个点,并且不会为“123456”重置。
答案 6 :(得分:0)
您的代码有点混乱,但重点是您不会重置str
的每个成员的计数。
因此,如果你在循环中添加一个counter=0;
来覆盖一个字符串的所有字符,你可能得到你想要的东西吗?
一些额外的提示: