2011-02-18 9 views
4

engineering notationの文字列に測定値と単位を自動的にフォーマットする方法を見つけようとしています。これは、指数が常に3の倍数であるが、キロ、メガ、ミリ、マイクロプレフィックスを使用して表される点で、科学記法の特別な場合である。自動的にJavaの工学単位に測定値をフォーマットします

これは、this postに似ていますが、SI単位と接頭辞の全範囲を処理する点が異なります。

例えば、私はそのようなことは数量フォーマットするライブラリーの後だ:12キロヘルツまたは12.346 kHzのもしくは12.3456789キロヘルツ 1234567.89 J 1 MJ又は1.23 MJ又は1.2345 MJとしてフォーマットされるよう 12345.6789ヘルツがフォーマットされると など。

JSR-275/JScienceはユニット測定には問題ありませんが、私はまだ測定の大きさに基づいて自動的に最も適切なスケーリングプレフィックスを見つけることができます。

乾杯、 サム。

+0

これは、独自の実装をロールバックするための簡単な場所と思われます。唯一の難しい部分は、SIユニットに既にメトリックプレフィックスがある、質量のような量を扱うことです。 –

+0

@Anonの質量は、それが適切なSI単位ではなくても、グラムの点で考えるように言ったなら、おそらく簡単でしょう。 – corsiKa

答えて

2
import java.util.*; 
class Measurement { 
    public static final Map<Integer,String> prefixes; 
    static { 
     Map<Integer,String> tempPrefixes = new HashMap<Integer,String>(); 
     tempPrefixes.put(0,""); 
     tempPrefixes.put(3,"k"); 
     tempPrefixes.put(6,"M"); 
     tempPrefixes.put(9,"G"); 
     tempPrefixes.put(12,"T"); 
     tempPrefixes.put(-3,"m"); 
     tempPrefixes.put(-6,"u"); 
     prefixes = Collections.unmodifiableMap(tempPrefixes); 
    } 

    String type; 
    double value; 

    public Measurement(double value, String type) { 
     this.value = value; 
     this.type = type; 
    } 

    public String toString() { 
     double tval = value; 
     int order = 0; 
     while(tval > 1000.0) { 
      tval /= 1000.0; 
      order += 3; 
     } 
     while(tval < 1.0) { 
      tval *= 1000.0; 
      order -= 3; 
     } 
     return tval + prefixes.get(order) + type; 
    } 

    public static void main(String[] args) { 
     Measurement dist = new Measurement(1337,"m"); // should be 1.337Km 
     Measurement freq = new Measurement(12345678,"hz"); // should be 12.3Mhz 
     Measurement tiny = new Measurement(0.00034,"m"); // should be 0.34mm 

     System.out.println(dist); 
     System.out.println(freq); 
     System.out.println(tiny); 

    } 

} 
+0

"kilo"は小文字のkでなければならないことに注意してください。さらに、私はあなたが「340 um」(0.34 mmではなく)がほしいと確信しているので、2番目のループは 'while(tval <1)'でなければなりません。 –

+0

私は参照してください。私はそれらを投げるでしょう。私は小数点3以内のものは大丈夫だと仮定していました。 1 <= c <1000の要素が必要なように見えます。明確化のおかげで! – corsiKa

+0

コメント権限のないユーザーのコメント(Xp-ert): 'if(tval!= 0){'の前に 'while(tval > 1000.0){'と'} '' return tval + prefixes.get(order)+ type; 'の前に、そうでなければ、値が' 0'のときに2番目のループで永久にループします。 – Anne

関連する問題