如何在Java中将包含时间单位(ms/ns/ps/fs等)的字符串解析为双精度
如何将表示时间的字符串(包含双精度和时间单位后缀(ms/ns/ps/picosecond/us/fs/msec/miliseconds等)解析为双精度秒 例如,输入字符串如何在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那么简单,因为在本例中,您还将它转换为秒,而不是保留原始单位 您可以使用该类在不同的时
"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