如何在Java中将包含时间单位(ms/ns/ps/fs等)的字符串解析为双精度

如何在Java中将包含时间单位(ms/ns/ps/fs等)的字符串解析为双精度,java,Java,如何将表示时间的字符串(包含双精度和时间单位后缀(ms/ns/ps/picosecond/us/fs/msec/miliseconds等)解析为双精度秒 例如,输入字符串 "1.23 ms" "0.98 ns" "33 s" 输出加倍: 0.00123 0.0000000098 33.0 谢谢您可以使用该类在不同的时间度量之间进行转换 但是,您需要解析字符串以确定数值和单位 它不像将字符串解析为double那么简单,因为在本例中,您还将它转换为秒,而不是保留原始单位 您可以使用该类在不同的时

如何将表示时间的字符串(包含双精度和时间单位后缀(ms/ns/ps/picosecond/us/fs/msec/miliseconds等)解析为双精度秒

例如,输入字符串

"1.23 ms"
"0.98 ns"
"33 s"
输出加倍:

0.00123
0.0000000098
33.0
谢谢

您可以使用该类在不同的时间度量之间进行转换

但是,您需要解析字符串以确定数值和单位

它不像将字符串解析为double那么简单,因为在本例中,您还将它转换为秒,而不是保留原始单位

您可以使用该类在不同的时间度量之间进行转换

但是,您需要解析字符串以确定数值和单位


它不像将字符串解析为double那么简单,因为在本例中,您还将它转换为秒,而不是保留原始单位

像这样一个简单的代码应该可以做到这一点

private double convertExpression(String str) throws Exception{
    String []stringArr = str.split(" ");
    if(stringArr.length <= 1){
        throw new Exception("Incorrect format");
    }

    String unit = stringArr[1];
    String stringVal = stringArr[0];
    double intVal = Double.parseDouble(stringVal);

    switch(unit){
    case "ms":
        return intVal/1000;
    case "ns":
        return intVal/10e9;
    case "s":
        return intVal;
    }
    return 0;
}
private-double-convertExpression(字符串str)引发异常{
字符串[]stringArr=str.split(“”);

if(stringArr.length这样一个简单的代码就可以了

private double convertExpression(String str) throws Exception{
    String []stringArr = str.split(" ");
    if(stringArr.length <= 1){
        throw new Exception("Incorrect format");
    }

    String unit = stringArr[1];
    String stringVal = stringArr[0];
    double intVal = Double.parseDouble(stringVal);

    switch(unit){
    case "ms":
        return intVal/1000;
    case "ns":
        return intVal/10e9;
    case "s":
        return intVal;
    }
    return 0;
}
private-double-convertExpression(字符串str)引发异常{
字符串[]stringArr=str.split(“”);

如果(stringArr.length在这个特定示例中,我将使用正则表达式。 您可以使用正则表达式从字符串和单位中提取值,以便相应地处理它

以下操作应该有效:
(\d+(?:\。\d+)\s?(\w?s)

第一个捕获组将提供小数部分,第二个捕获组将提供单位(ns/ms/s)。您可以将第一个捕获组存储为双精度,将第二个捕获组存储为字符串,并根据获得的单位对双精度执行数学运算。如果是ns,则为x10^-9,等等

或者,一个更简单但不太灵活的解决方案是基于空格分割字符串,然后将结果数组中的第一个值作为双精度,第二个值作为一个单位。但是,如果删除字符串中的空格,这将不起作用。我更喜欢正则表达式解决方案,因为您知道,如果找到匹配项,则第一次捕获组将包含一个值,第二个值将包含一个单位

如果您对正则表达式解决方案感兴趣,那么我将在这里详细介绍:

(\d+(?:\。\d+)\s)(\w?s)

表示捕获组的开始
\d+
表示它正在获取一个或多个十进制值
(?:
指示非捕获组的开始
\.
表示它正在寻找一个点
表示组的结束(捕获或非捕获)
表示“一项或全部”
\s?
表示一个或多个空格
\w?
表示一个或多个字母
s
表示它正在寻找一个s

总之,它正在查找一个十进制值,后跟一个可选的空格字符,然后是任意字母和一个“s”。这意味着它将接受以下任意一项:

5.00ms

5.00秒

5.10纳秒

5.1259 fs

241.015552ps

1秒

它不会接受:

12 wpwa

12a

平底锅

511.2012wprpwaroawroaroas

它不接受最后一个字符,因为单位最多只能是两个字符——一个用来表示多小,如m或n,另一个用来表示单位为秒(s)。
如果您决定要显示数字后的任何文本以支持“512.032毫秒”这样的文本,那么您可以在我提供的语句中将最后的
(\w?s)
更改为
(\w*s)

在这个特定示例中,我将使用正则表达式。 您可以使用正则表达式从字符串和单位中提取值,以便相应地处理它

以下操作应该有效:
(\d+(?:\。\d+)\s?(\w?s)

第一个捕获组将提供小数部分,第二个捕获组将提供单位(ns/ms/s)。您可以将第一个捕获组存储为双精度,将第二个捕获组存储为字符串,并根据获得的单位对双精度执行数学运算。如果是ns,则为x10^-9,等等

或者,一个更简单但不太灵活的解决方案是基于空格分割字符串,然后将结果数组中的第一个值作为双精度,第二个值作为一个单位。但是,如果删除字符串中的空格,这将不起作用。我更喜欢正则表达式解决方案,因为您知道,如果找到匹配项,则第一次捕获组将包含一个值,第二个值将包含一个单位

如果您对正则表达式解决方案感兴趣,那么我将在这里详细介绍:

(\d+(?:\。\d+)\s)(\w?s)

表示捕获组的开始
\d+
表示它正在获取一个或多个十进制值
(?:
指示非捕获组的开始
\.
表示它正在寻找一个点
表示组的结束(捕获或非捕获)
表示“一项或全部”
\s?
表示一个或多个空格
\w?
表示一个或多个字母
s
表示它正在寻找一个s

总之,它正在查找一个十进制值,后跟一个可选的空格字符,然后是任意字母和一个“s”。这意味着它将接受以下任意一项:

5.00ms

5.00秒

5.10纳秒

5.1259 fs

241.015552ps

1秒

它不会接受:

12 wpwa

12a

平底锅

511.2012wprpwaroawroaroas

它不接受最后一个字符,因为单位最多只能是两个字符——一个用来表示多小,如m或n,另一个用来表示单位为秒(s)。 如果您决定要显示数字后的任何文本以支持文本lik
1.23 ms = 0.00123 seconds
0.98 ns = 9.800000000000001E-10 seconds
33 s = 33.0 seconds
1.3 us = 1.3E-6 seconds
20.5 ps = 2.05E-11 seconds
4.5 fs = 4.5000000000000005E-15 seconds