【发布时间】:2012-06-10 18:07:38
【问题描述】:
我有一个文本(字符串),我只需要从中获取数字,我的意思是如果我有文本:
“我在 53.2 公里外”,我想得到“53.2”(不是 532 或 53 或 2)
我尝试了Extract digits from a string in Java 中的解决方案。它返回“532”。
有人对此有想法吗?
感谢
【问题讨论】:
我有一个文本(字符串),我只需要从中获取数字,我的意思是如果我有文本:
“我在 53.2 公里外”,我想得到“53.2”(不是 532 或 53 或 2)
我尝试了Extract digits from a string in Java 中的解决方案。它返回“532”。
有人对此有想法吗?
感谢
【问题讨论】:
您可以直接使用Scanner,它具有nextDouble() 和hasNextDouble() 方法如下:
Scanner st = new Scanner("I'm 53.2 km away");
while (!st.hasNextDouble())
{
st.next();
}
double value = st.nextDouble();
System.out.println(value);
输出:53.2
【讨论】:
【讨论】:
import java.util.regex.*;
class ExtractNumber
{
public static void main(String[] args)
{
String str = "I'm 53.2 km away";
String[] s = str.split(" ");
Pattern p = Pattern.compile("(\\d)+\\.(\\d)+");
double d;
for(int i = 0; i< s.length; i++)
{
Matcher m = p.matcher(s[i]);
if(m.find())
d = Double.parseDouble(m.group());
}
System.out.println(d);
}
}
【讨论】:
km。该示例确实使用了一个空格,但这只是一个 nit。
s[i] 替换为m.group() 这应该可以解决您指出的问题。
最好和最简单的方法是使用正则表达式和 replaceAll 字符串方法。例如
String a = "2.56 Kms";
String b = a.replaceAll("\\^[0-9]+(\\.[0-9]{1,4})?$","");
Double c = Double.valueOf(b);
System.out.println(c);
【讨论】:
如果您确定您的数字是“单词”(空格分隔)并且不想使用正则表达式,则可以解析它们...
String myString = "I'm 53.2 km away";
List<Double> doubles = new ArrayList<Double>();
for (String s : myString.split(" ")) {
try {
doubles.add(Double.valueOf(s));
} catch (NumberFormatException e) {
}
}
【讨论】:
String 无法解析。
I'm 解析为以失败结尾的双重结尾一点也不例外。
我刚刚做了一个方法getDoubleFromString。我认为这不是最好的解决方案,但效果很好!
public static double getDoubleFromString(String source) {
if (TextUtils.isEmpty(source)) {
return 0;
}
String number = "0";
int length = source.length();
boolean cutNumber = false;
for (int i = 0; i < length; i++) {
char c = source.charAt(i);
if (cutNumber) {
if (Character.isDigit(c) || c == '.' || c == ',') {
c = (c == ',' ? '.' : c);
number += c;
} else {
cutNumber = false;
break;
}
} else {
if (Character.isDigit(c)) {
cutNumber = true;
number += c;
}
}
}
return Double.parseDouble(number);
}
【讨论】: