0

次のような文字列があり、"2E6 3.34e-5 3 4.6"replaceAll を使用して次のようなトークンを置き換えたい:

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

(つまり、間に e または E がある 2 つの数値) を同等の通常の数値形式に変換します (つまり、"2E6""2000000""3.34e-5"置き換えます"0.0000334") 。

私が書いた:

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

しかし、実際には、そのように書くだけでなく、最初の引数に10を2番目の引数の力で乗算したいと思います..何かアイデアはありますか?

アップデート

私はあなたの提案に基づいて次のことをしました:

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

マッチから置換にグループを逐語的にコピーするよりも複雑なことをしたい場合は、 の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 に答える
0

replaceAll メソッドではそれができないと思います。あなたは正規表現を知っているようですので、正しい方向に向けるだけです。PatternおよびMatcherクラスを試してください。これにより、正規表現パターンをコンパイルしてグループを見つけることができます。たとえば、最初のグループに 10 を e の後のグループのべき乗で乗算します。

于 2012-11-27T13:11:52.887 に答える