Java 如何从字符串中获取浮点值

Java 如何从字符串中获取浮点值,java,regex,Java,Regex,我有一根像 > 12.4N-m/kg. 从上面的字符串中,我需要得到一个值12.4 当我使用replace all函数str.replaceAll(“[^.0-9]”,“”)时 当then字符串有两个点时,这不起作用 浮点值的位置可能不同。尝试使用以下方法: Float.valueOf(str.substring(0,4)); 下面的代码将假定输入字符串总是以“>”开头,并且它有适当的浮点前缀 int i=2; while(Character.isDigit(str.charAt(i)

我有一根像

> 12.4N-m/kg.
从上面的字符串中,我需要得到一个值
12.4

当我使用replace all函数
str.replaceAll(“[^.0-9]”,“”)时

当then字符串有两个点时,这不起作用

浮点值的位置可能不同。

尝试使用以下方法:

Float.valueOf(str.substring(0,4));

下面的代码将假定输入字符串总是以
“>”
开头,并且它有适当的浮点前缀

int i=2;
while(Character.isDigit(str.charAt(i)) || str.charAt(i) == '.') 
    i++;
float answer = Float.valueOf(str.substring(2,i));

尝试使用这个正则表达式

^[-+]?[0-9]*\.?[0-9]+$

首先丢弃所有非flot字符,然后按如下方式转换为Float:

float f = Float.valueOf("> 12.4N-m/kg.".replaceAll("[^\\d.]+|\\.(?!\\d)", ""));
// now f = 12.4
假设您的输入总是在数字前有一个空格,在数字后有一个
N

String t = "> 12.4N-m/kg.";
Pattern p = Pattern.compile("^.*\\s(\\d+\\.\\d)N.*$");
Matcher matcher = p.matcher(t);
if (matcher.matches()) {
    System.out.println(Float.valueOf(matcher.group(1)));
}

我认为前面的答案遗漏了两点:

  • 还有比这更复杂的数字
  • 单位中可能有一个数字不在浮点数中
因为第二点,我不认为替换所有非数字的东西是个好主意。人们更应该搜索字符串中的第一个数字:

Matcher m = p.matcher(str);
System.out.println("Input: "+ str);
if (m.find()) {
    System.out.println("Found: "+ m.group());
    try {
        System.out.println("Number: "+ Float.parseFloat(m.group()));
    } catch (Exception exc) {
        exc.printStackTrace();
    }
}
或者,你可以做一些类似的事情

int i, j;
for (i = 0; i < str.length(); ++i) {
    if (mightBePartOfNumber(str.charAt(i))) {
        break;  
    }       
}       
for (j = i; j < str.length(); ++j) {
    if (!mightBePartOfNumber(str.charAt(j))) {
        break;  
    }       
}       
String substr = str.substring(i, j);
System.out.println("Found: "+ substr);
try {   
    System.out.println("Number: "+ Float.parseFloat(substr));
} catch (Exception exc) {
    exc.printStackTrace();
}       
inti,j;
对于(i=0;i
和助手在一起

private static boolean mightBePartOfNumber(char c) {
    return ('0' <= c && c <= '9') || c == '+' || c == '-' || c == '.' || c == 'e' || c == 'E'; 
}       
私有静态布尔值可能是数字的一部分(字符c){

return('0'我已尝试了上述选项,但对我无效,请尝试以下模式

Pattern pattern = Pattern.compile("\\d+(?:\\.\\d+)?");

这里我无法预测位置。它可能不同。请提供更多可能输入的示例。请记住,该单元可能包含一个数字(如m^2)这可能不应该以浮点形式结束。@chs需要做什么才能避免像用于指定m平方的m^2这样的情况?我已经添加了两个关于处理m^2的建议。当数字后面紧跟着一个点时,仍然不起作用。你能解释一下模式[^\\d.]+\\\(?!\\d)的含义吗??如果可能的话,你能解释一下识别给定输入模式的过程吗?当然@Munesh:That regex:
[^\\d.]+\124;\.(?!\\ d)
表示它与管道两侧的2个子正则表达式中的一个匹配
|
。LHS匹配除数字或perios之外的任何东西,而RHS表示一个周期,该周期后面没有使用负前瞻的数字。谢谢anubhava。如果您在答案中添加此解释,将会很有帮助。很好的答案:)