web-dev-qa-db-ja.com

可変精度でJava String.format?

ユーザー入力に基づいてフォーマットしている文字列の二重表現の精度を変えたいのですが。今、私は次のようなことを試みています:

String foo = String.format("%.*f\n", precision, my_double);

ただし、Java.util.UnknownFormatConversionExceptionを受け取ります。このアプローチの私のインスピレーションは、C printfと このリソース (セクション1.3.1)でした。

どこかに単純な構文エラーがありますか、Javaはこのケースをサポートしていますか、それともより良いアプローチがありますか?

編集:

私は次のようなことができると思います:

String foo = String.format("%." + precision + "f\n", my_double);

しかし、私はまだそのような操作のネイティブサポートに興味があります。

25

あなたはあなた自身の質問に答えました-あなたのフォーマット文字列を動的に構築してください...有効なフォーマット文字列はここに概説された規則に従います: http://Java.Sun.com/j2se/1.5.0/docs/api/Java /util/Formatter.html#syntax

合計8文字(小数点を含む)を占めるフォーマット済みの小数が必要で、小数点の後に4桁が必要な場合、フォーマット文字列は「%8.4f」のようになります。

私の知る限り、Javaには、フォーマット文字列が柔軟であること以外に「ネイティブサポート」はありません。

17
vicatcu

DecimalFormat クラスを使用できます。

double d1 = 3.14159;
double d2 = 1.235;

DecimalFormat df = new DecimalFormat("#.##");

double roundedD1 = df.format(d); // 3.14
double roundedD2 = df.format(d); // 1.24

実行時に精度を設定する場合は、次を呼び出します。

df.setMaximumFractionDigits(precision)
6
Willi Mentzel

何故なの :

String form = "%."+precision+"f\n";
String foo = String.format(form, my_double);

または:

public static String myFormat(String src, int precision, Object args...)
{
    String form = "%."+precision+"f\n";
    return String.format(form, args);
}
3
Gerdi