java.io.StreamTokenizer.TT_编号:浮点还是整数?

java.io.StreamTokenizer.TT_编号:浮点还是整数?,java,parsing,Java,Parsing,有没有办法找到由.nval(例如200)解析并返回的值是整数还是浮点数 谢谢 已编辑: 我想知道输入是“200”还是“200.0”。我会使用模数运算符: if (yourNval % 1 > 0) { // nval is floating point. } else { // nval is an integer. } 这是因为Java中的模数和整数一样有效 更新:由于您指定需要区分整数和小数部分为零值的双精度整数,因此我认为您必须执行以下操作: Double(your

有没有办法找到由.nval(例如
200
)解析并返回的值是整数还是浮点数

谢谢

已编辑


我想知道输入是“200”还是“200.0”。

我会使用模数运算符:

if (yourNval % 1 > 0)
{
    // nval is floating point.
}
else
{
    // nval is an integer.
}
这是因为Java中的模数和整数一样有效

更新:由于您指定需要区分整数和小数部分为零值的双精度整数,因此我认为您必须执行以下操作:

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;
    }
}

基本上,当您试图确定一个
double
是否为
int
时,您可以创建一个
BigDecimal
并测试其方法。您还可以使用
Math
静态方法,并根据原始值测试返回值

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

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

我认为使用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());
    }  
}

类的文档是

谢谢你的anwser,但这并没有告诉我输入是“200.0”还是“200”。我在上面添加了代码来确定整数
nval
输入包含的尾随零的数量。您的示例,
200.0
,将产生
numTrailingZeroes
1
。再次感谢您,您的解决方案使用了浮点值,但没有告诉我StreamTokenizer解析的原始令牌。如果您知道整数值和尾随零的数量,您就确切知道令牌是什么。我想akf和我当时真的不明白你的问题,因为你不得不重新措辞两次。谢谢你的回答,但这并没有告诉我输入是“200.0”还是“200”。因为字段是双精度的,
200
将始终是
200.0