C言語のprintf%gの書式指定子と同等のJavaとは何ですか?
質問
私はFormatter.formatを使用してみましたが、それはCバージョンにはないのに対し、0仮数と数字の仮数部を残しているようです。 JavaでCの%グラムの書式指定子の相当するものはあり、そうでない場合、偽のそれへの道はありますか?私の意図が正確にCの互換性の理由のように仮数を維持することです。
foo.cの
#include <stdio.h>
int main (int argc, char const *argv[])
{
printf("%g\n", 1.0);
return 0;
}
Main.java
class Main {
public static void main(String[] args) {
System.out.printf("%g\n", 1.0);
}
}
コンソールます:
$ javac Main.java && java Main
1.00000
$ gcc foo.c && ./a.out
1
同様に、入力として1.2で、仮数は、Javaのバージョンで長い
$ javac Main.java && java Main
1.20000
$ gcc foo.c && ./a.out
1.2
解決
あなたは java.text.DecimalFormatののクラス?
System.out.println(new DecimalFormat().format(1.0));
出力:
1
一方
System.out.println(new DecimalFormat().format(1.2));
出力:
1.2
他のヒント
編集: このコードは、指数が原因String.Formatのは、これらの数字を書式設定する方法の私の誤解で、17桁の数字であれば行方不明に行くために小数部分が発生します。 P
:だから、このコードを使用しないでくださいしないでください入力してくれてありがとう、みんな。 (例に続く)私は正確に機能性のクローンを作成するときにDecimalFormatかのNumberFormatを設定する方法を見つけることができませんでしたが、この方法が機能するようです。
String.format("%.17g", x).replaceFirst("\\.?0+(e|$)", "$1");
main.cの
#include <stdio.h>
int main (int argc, char const *argv[])
{
printf("%.*g\n", 17, -0.0);
printf("%.*g\n", 17, 0.0);
printf("%.*g\n", 17, 1.0);
printf("%.*g\n", 17, 1.2);
printf("%.*g\n", 17, 0.0000000123456789);
printf("%.*g\n", 17, 1234567890000000.0);
printf("%.*g\n", 17, 0.0000000123456789012345678);
printf("%.*g\n", 17, 1234567890123456780000000.0);
return 0;
}
Main.java
class Main {
public static String formatDouble(double x) {
return String.format("%.17g", x).replaceFirst("\\.?0+(e|$)", "$1");
}
public static void main(String[] args) {
System.out.println(formatDouble(-0.0));
System.out.println(formatDouble(0.0));
System.out.println(formatDouble(1.0));
System.out.println(formatDouble(1.2));
System.out.println(formatDouble(0.0000000123456789));
System.out.println(formatDouble(1234567890000000.0));
System.out.println(formatDouble(0.0000000123456789012345678));
System.out.println(formatDouble(1234567890123456780000000.0));
}
}
とその出力ます:
$ gcc foo.c && ./a.out -0 0 1 1.2 1.23456789e-08 1234567890000000 1.2345678901234567e-08 1.2345678901234568e+24 $ javac Main.java && java Main -0 0 1 1.2 1.23456789e-08 1234567890000000 1.2345678901234567e-08 1.2345678901234568e+24
あなたはのNumberFormat 使用することができますA>。 0に最小小数の桁数を設定することが、より大きな最大値を残すことによって、それはあなたが欲しいものを行う必要があります。
これはprintfのように簡単ではないのですが、それが動作するはずです。
だけでなく、あなたが望むどのように多くの桁数を指定することができます:「%0.2グラム」1.20として1.2が表示されます。
使用していることに注意してください
String.format("%.17g", x).replaceFirst("\\.?0+(e|$)", "$1")
は、(1.2345e-2を産生する、端からゼロストリップ)1.2345e-20のために失敗しました。 ここで私は私のコードで使用して終了するものである。
String.format(Locale.US, "%.6g", x).replaceFirst("\\.0+(e|$)", "$1").replaceFirst("(\\.[0-9]*[1-9])(0+)(e|$)", "$1$3")
基本的に私は、小数部の端部でのみゼロが除去されるように式を変形して2例にこれを分割します。しかし、正しい方向に私を指してくれてありがとう。