0

我有一个字符串,例如:"2E6 3.34e-5 3 4.6"并且我想使用 replaceAll 替换标记,例如:

"((\\-)?[0-9]+(\\.([0-9])+)?)(E|e)((\\-)?[0-9]+(\\.([0-9])+)?)"

(即两个数字之间有 e 或 E)转换成等效的正常数字格式(即"2E6""2000000""3.34e-5"替换"0.0000334"

我写:

value.replaceAll("((\\-)?[0-9]+(\\.([0-9])+)?)(E|e)((\\-)?[0-9]+(\\.([0-9])+)?)", "($1)*10^($6)");

但我想实际上将第一个参数乘以 10 到第二个参数的幂,而不仅仅是这样写.. 有什么想法吗?

更新

根据您的建议,我做了以下操作:

Pattern p = Pattern.compile("((\\-)?[0-9]+(\\.([0-9])+)?)(E|e)((\\-)?[0-9]+(\\.([0-9])+)?)");
Matcher m = p.matcher("2E6 3.34e-5 3 4.6");
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, "WHAT HERE??"); // What HERE ??
}
m.appendTail(sb);
System.out.println(sb.toString());

更新

最后,这就是我所达到的:

// 32 #'s because this is the highest precision I need in my application
private static NumberFormat formatter = new DecimalFormat("#.################################");

private static String fix(String values) {
    String[] values_array = values.split(" ");
    StringBuilder result = new StringBuilder();
    for(String value:values_array){
        try{
            result.append(formatter.format(new Double(value))).append(" ");
        }catch(NumberFormatException e){ //If not a valid double, copy it as is
            result.append(value).append(" ");
        }
    }
    return result.toString().substring(0, result.toString().length()-1);
}
4

4 回答 4

2
    StringBuffer buffer = new StringBuffer();

    Pattern regex = Pattern.compile("((\\-)?[0-9]+(\\.([0-9])+)?)(E|e)((\\-)?[0-9]+(\\.([0-9])+)?)");
    Matcher matcher = regex.matcher( "2E6 3.34e-5 3 4.6");
    while (matcher.find()) {

      String a = matcher.group(1); //The $1
      String b = matcher.group(6); //The $6
      String repl = null;
      if( a != null && b != null ) { //Check if both exist for this match
                      //Parse, do calculations and convert to string again
          repl = BigDecimal.valueOf( Double.parseDouble( a ) * Math.pow( 10, Double.parseDouble( b ) )).toString();
      }
      else {
          repl = matcher.group(0); //Else return unaffected
      }
      matcher.appendReplacement(buffer, repl);
    }
    matcher.appendTail(buffer);

    System.out.println( buffer.toString());
     //"2000000.0 0.0000334 3 4.6"
于 2012-11-27T13:41:16.087 回答
1

如果您需要将科学数字符号转换为普通形式,您可以使用DecimalFormat

public static void main(String[] args) {
    NumberFormat formatter = new DecimalFormat();

    double num1 = 2E6;
    formatter = new DecimalFormat("##########");
    System.out.println(formatter.format(num1)); 

    double num2 = 3.3e-5;
    formatter = new DecimalFormat("#.##########");
    System.out.println(formatter.format(num2));
}

只需添加逻辑来拆分初始字符串spaces并应用上述逻辑。

您可以在DecimalFormat的 javadoc中查看有关符号的更多信息,例如#(在这种情况下)。

Symbol Location     Localized?  Meaning   
------------------------------------------------------------
#      Number       Yes         Digit, zero shows as absent 
于 2012-11-27T13:37:42.360 回答
0

我认为您无法使用 replaceAll 方法做到这一点。您似乎知道正则表达式,所以我只会为您指出正确的方向。试试PatternMatcher类。有了这个,您可以编译一个正则表达式模式并找到组,例如将第一个组乘以 10 到 e 之后的组的幂。

于 2012-11-27T13:11:52.887 回答
0

find()如果您想做比从匹配项逐字复制组到替换组更复杂的事情,那么您必须appendReplacement/appendTail使用Matcher. javadoc 中appendReplacement有一个很好的例子。

在循环内部,您可以使用它m.group()来访问匹配的字符串,并m.group(n)访问第 n 个括号组,这样您就可以创建一个适合NumberFormat您需要的输出格式,然后执行类似的操作

double val = Double.parseDouble(m.group());
m.appendReplacement(nf.format(val));

或使用String.format

m.appendReplacement(String.format("%f", val));

(或者BigDecimal如果您不能确定您的值都可以表示为 ,则使用double)。

于 2012-11-27T13:17:04.210 回答