String str="33 and P090204 my salary is ¥8400.4 ";
提取所有数值进行相加33+90204+8400.4=98637.4返回。
这个程序怎么写
[b]问题补充:[/b]
不用替换这样方法
但还是谢谢你
[b]问题补充:[/b]
对字符串硬处理
[quote="abcbbc"]问题补充:
不用替换这样方法
对字符串硬处理[/quote]
呃……嗯?不过我上面的办法没用到替换啊。这处理方式已经很硬了……
[code="java"]import java.io.*;
public class Test {
private static double nextDouble(Reader in) throws IOException {
int c = -1;
while (!Character.isDigit(c = in.read()) && -1 != c) { }
if (-1 == c) return Double.NaN;
StringBuilder sb = new StringBuilder(Character.toString((char)c));
while (Character.isDigit(c = in.read())) {
sb.append((char)c);
}
if ('.' == (char)c) {
sb.append('.');
while (Character.isDigit(c = in.read())) {
sb.append((char)c);
}
}
return Double.parseDouble(sb.toString());
}
public static void main(String[] args) throws Exception {
String str = "33 and P090204 my salary is ¥8400.4 ";
double acc = 0;
double d = 0;
StringReader in = new StringReader(str);
while (!Double.isNaN(d = nextDouble(in))) {
acc += d;
}
System.out.println(acc); // 98637.4
}
}[/code]
那或许你想要的是这样?
再不行的话就把Character.isDigit()换成:
[code="java"]private static boolean isDigit(int codePoint) {
return codePoint >= '0' && codePoint <= '9';
}[/code]
然后把Double.parseDouble()也换成自己的实现……hmm
用这个正则表达式:/0*(\d+(?:.\d+)?)/
[code="ruby"]r = /0*(\d+(?:.\d+)?)/
str = "33 and P090204 my salary is #8400.4 "
str.scan(r).map {|m| m[0].to_f}.inject {|acc,i| acc + i}
#=> 98637.4[/code]
[code="java"]import java.util.regex.*;
public class Test {
public static void main(String[] args) {
String str = "33 and P090204 my salary is ¥8400.4 ";
Pattern p = Pattern.compile("0*(\d+(?:\.\d+)?)");
Matcher m = p.matcher(str);
double acc = 0;
while (m.find()) {
acc += Double.parseDouble(m.group(1));
}
System.out.println(acc); // 98637.4
}
}[/code]