0

编写一个程序,检查字符串数组是否包含有效数字。如果字符串包含“.”,则将其转换为 Double,否则将其转换为 Integer。输入应为字符串数组 { "10.20", "123456", "12 。无效的”}。

我的问题是 123456 正在更改为 double。我必须将其更改为 int。请帮助 :(

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");
        }
    }
}
4

7 回答 7

5
if(str[i].indexOf('.') == -1) {
    int e = Integer.parseInt(str[i]);
}
else {
    double d = Double.parseDouble(str[i]);
}

这比所有不需要的循环都要优雅得多。祝你好运!

要了解其工作原理,请参阅 indexOf() 的字符串 API

于 2012-12-29T16:21:06.593 回答
2

至于您当前使用的方式,您需要在每次迭代中将其重置为count0否则在找到第一个双精度值后的每个值都将转换为双精度值,因为您的countnon-zero在每种情况下都是如此。

因此,在您的第一个 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);
    }
}

使用的循环称为增强型 for-loop

String#contains()方法检查字符串是否包含某个字符。或者,您可以使用方法来查找字符串中String#indexOf()的索引。.如果它返回一个正值,那么您的字符串包含该字符。

于 2012-12-29T16:21:42.643 回答
2

我根本不会使用循环。我假设您没有随机数据,并且您知道每个“列”的类型应该是什么。

String[] str = {"10.20", "123456", "12.invalid"};

double d = Double.parseDouble(str[0]);
int i = Integer.parseInt(str[1]);
String s = str[2];

如果您不知道一个值应该是 adouble还是 an int,您始终可以将其解析为 double 而不会损失精度。

于 2012-12-29T16:24:50.720 回答
1

看来您必须将每个字符串的 count 设置回零,而您没有这样做。

于 2012-12-29T16:21:28.170 回答
0

一次迭代后再次计数为零count=0,在第二次迭代中计数不为零,因此再次考虑为双精度值

于 2012-12-29T16:21:14.767 回答
0

在每个检查元素之后,您必须将 count 变量重置为 0。这种方式计数会增加,因为“10.20”包括一个点并且不会为“123456”重置。

于 2012-12-29T16:21:46.017 回答
0

您的代码有点乱,但关键是您不会为str.

所以如果你在循环中添加一个counter=0;遍历一个字符串的所有字符的循环,你可能会得到你想要的?

一些额外的提示:

  • 使用可读的变量名
  • 缩进你的代码
于 2012-12-29T16:21:52.770 回答