Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何从某个字符串位置解析double,并获得其后字符的位置? 我希望类似于代码> STD::STOD C++。 我找到的最接近的东西是DecimalFormat类,但它的最大问题是它的行为与Double.parseDouble()不同。例如,它将3.14E+2解析为3.14,而不是314。而Double.parseDouble()对这两种情况给出了相同的答案,这就是我想要的行为。用E替换所有E+不是一个理想的选择(它可能会破坏其他东西)_Java_Parsing_Precision_Decimalformat - Fatal编程技术网

Java:如何从某个字符串位置解析double,并获得其后字符的位置? 我希望类似于代码> STD::STOD C++。 我找到的最接近的东西是DecimalFormat类,但它的最大问题是它的行为与Double.parseDouble()不同。例如,它将3.14E+2解析为3.14,而不是314。而Double.parseDouble()对这两种情况给出了相同的答案,这就是我想要的行为。用E替换所有E+不是一个理想的选择(它可能会破坏其他东西)

Java:如何从某个字符串位置解析double,并获得其后字符的位置? 我希望类似于代码> STD::STOD C++。 我找到的最接近的东西是DecimalFormat类,但它的最大问题是它的行为与Double.parseDouble()不同。例如,它将3.14E+2解析为3.14,而不是314。而Double.parseDouble()对这两种情况给出了相同的答案,这就是我想要的行为。用E替换所有E+不是一个理想的选择(它可能会破坏其他东西),java,parsing,precision,decimalformat,Java,Parsing,Precision,Decimalformat,所以基本上,我希望Double.parseDouble()能够设置起始位置并返回结束位置。在Java中是否有某种方法可以在不重新实现整个双重解析例程的情况下实现这一点?Scanner类非常接近您的要求: import java.util.*; import java.lang.reflect.*; public class ScanFloat { public static void main(String args[]) throws Exception { Stri

所以基本上,我希望
Double.parseDouble()
能够设置起始位置并返回结束位置。在Java中是否有某种方法可以在不重新实现整个双重解析例程的情况下实现这一点?

Scanner类非常接近您的要求:

import java.util.*;
import java.lang.reflect.*;

public class ScanFloat {
    public static void main(String args[]) throws Exception {
        String str = "foo 3.14E+2 xx";
        int startPos = 4;
        Scanner s = new Scanner(str.substring(4));
        s.useLocale(Locale.ENGLISH);
        System.out.println(s.nextDouble());
        System.out.println("endingPos: " + (startPos + getPos(s)));

    }
    static int getPos(Scanner s) throws Exception {
      Field f = Scanner.class.getDeclaredField("position");
      f.setAccessible(true);
      return (int) f.get(s);
    }
}
输出:

314.0
endingPos: 11
314.0
11
但是,输入
“foo3.14E+2xx”
将引发异常。根据您的用例,它可能是好的,也可能不是好的

使用正则表达式可以解决这一问题,而且也不难,因为您只需使用:

输出:

314.0
endingPos: 11
314.0
11

取一个子串并调用Double.parseDouble()怎么样?@eis你怎么知道应该取多少?记住:我想让索引超过双精度的末尾。您需要精确地指定内容。让我们以3.14E+2为例。如果您(缺少)规范,则可以将其解析为3,超过double的索引将为1。或者被解析为3.14,超过double的索引将是4。或者被解析为314,超过双精度的索引将是7。因此,你需要定义你认为双值的一部分和不需要的部分,以及解析器应该如何操作。一种方法是首先用正则表达式扫描字符串以获取索引。另一个选项是使用that has nextDouble()方法,尽管我不确定它是否完全涵盖了您的用例。@JBNizet我指定它是因为我希望得到与
Double.parseDouble()
相同的结果(但能够指定/检索
ParsePosition
)。谢谢,但可以。看起来不是我想要的。因为1)它仍然涉及复制我理想情况下想要避免的字符串(因为它对于给定的任务来说是完全不必要的),2)像
“foo3.14E+2xx”
这样的情况正是我解析的结果。即,不同的令牌不一定是空格分隔的。3) 是否正在访问私有/受保护字段?感觉hacky=)是的,它要么使用一个库,要么自己实现(使用regexp或实现一个标记器)。虽然我不明白你复制字符串的意思。@DanM。因此,现在添加了正则表达式选项。那不符合要求吗?谢谢,我会调查的。通过复制字符串,我的意思是不需要创建
子字符串
,因为algo不会修改字符串,但由于Java std lib的限制,这似乎是不可能的。我还添加了一条关于将启动位置推到正则表达式的注释,这样您可以避免使用子字符串。虽然正则表达式本身在幕后做了很多事情,所以我个人只使用子字符串。