java.io.StreamTokenizer.TT_NUMBER:浮动还是整数?

时间:2009-07-27 11:41:55

标签: java parsing

有没有办法找出java.io.StreamTokenizer解析和返回的值。 nval (例如200)是整数还是浮点数?

由于

被修改

我希望能够知道输入是'200'还是'200.0'。

3 个答案:

答案 0 :(得分:3)

我觉得StringTokenizer不可能,它太旧了。您可以使用扫描仪完成这项工作:

Scanner fi = new Scanner("string 200 200.0");
fi.useLocale(Locale.US);

while (fi.hasNext()) {
    if (fi.hasNextInt()) {
        System.out.println("Integer: " + fi.nextInt());
    } else if (fi.hasNextDouble()) {
        System.out.println("Double: " + fi.nextDouble());
    } else {
        System.out.println("String: " + fi.next());
    }  
}

课程的文档是here

答案 1 :(得分:0)

我会使用模数运算符:

if (yourNval % 1 > 0)
{
    // nval is floating point.
}
else
{
    // nval is an integer.
}

这是因为Java中的模works with floating point numbers以及整数。

更新:由于你指定需要用零值小数部分来区分整数和双精度,我认为你必须做类似以下的事情:

Double(yourNval).toString().indexOf('.');

因此,更完整的功能将如下所示:

if (yourNval % 1 > 0)
{
    // nval is floating point.
}
else
{
    // nval is an integer.

    // Find number of trailing zeroes.
    String doubleStr = Double(yourNval).toString();
    int decimalLoc = doubleStr.indexOf('.');
    int numTrailingZeroes = 0;

    if (decimalLoc > 0)
    {
        numTrailingZeroes = doubleStr.length() - decimalLoc - 1;
    }
}

答案 2 :(得分:0)

由于您实际上是在尝试确定double是否为int,因此您可以创建BigDecimal并测试其scale()方法。您还可以使用Math静态方法floor()并针对原始方法测试返回值。

 if(Math.floor(myStreamTokenizer.nval) == myStreamTokenizer.navl)) {
     //treat it as an int
 } else {
     //treat it as a double
 }

在这两个中,我会使用Math.floor选项,因为它会更有效。