Was ist der Java-Äquivalent von printf% g Formatspezifizierer des C?
Frage
Ich habe versucht Formatter.format verwenden, aber das scheint die Mantisse auf Zahlen mit 0 Mantisse zu verlassen, während die C-Version nicht. Gibt es ein Äquivalent von% g Formatspezifizierer des C in Java, und wenn nicht, ist es eine Möglichkeit, zu fälschen? Meine Absicht ist es, die Mantisse genau wie C ist aus Kompatibilitätsgründen zu bewahren.
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);
}
}
Console:
$ javac Main.java && java Main
1.00000
$ gcc foo.c && ./a.out
1
In ähnlicher Weise mit 1,2 als Eingabe, die Mantisse länger in Java-Version
$ javac Main.java && java Main
1.20000
$ gcc foo.c && ./a.out
1.2
Lösung
Haben Sie die java.text.DecimalFormat Klasse?
System.out.println(new DecimalFormat().format(1.0));
Ausgänge:
1
während:
System.out.println(new DecimalFormat().format(1.2));
Ausgänge:
1.2
Andere Tipps
Bearbeiten : Dieser Code bewirkt, dass der Bruchteil fehlt zu gehen, wenn der Exponent 17 Ziffern ist, wegen meiner Missverständnis, wie String.format diese Zahlen formatiert. Also bitte nicht nicht diesen Code verwenden: P
Danke für den Input, Jungs. Ich kann nicht einen Weg zu konfigurieren DecimalFormat oder Number finden, um genau die Funktionalität zu klonen, aber es scheint diese Methode funktioniert (gefolgt von einem Beispiel):
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));
}
}
und deren Ausgänge:
$ 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
könnten Sie ein Number . die Mindestbruchstellen auf 0 Durch die Einstellung, aber die maximalen größer zu verlassen, sollte es tun, was Sie wollen.
Es ist nicht so einfach, wie printf, aber es sollte funktionieren.
gut, können Sie festlegen, wie viele Stellen Sie wollen: "% .2G" wird 1.2 als 1.20 angezeigt
Beachten Sie, dass mit
String.format("%.17g", x).replaceFirst("\\.?0+(e|$)", "$1")
nicht für 1.2345e-20 (die Null von den Endleisten, die Herstellung von 1.2345e-2). Hier ist, was ich am Ende mit in meinem Code:
String.format(Locale.US, "%.6g", x).replaceFirst("\\.0+(e|$)", "$1").replaceFirst("(\\.[0-9]*[1-9])(0+)(e|$)", "$1$3")
Im Grunde modifizierte ich den Ausdruck nur Nullen am Ende des Bruchteils zu gewährleisten, werden entfernt und teilen diese in zwei Fällen. Aber danke für mich in der richtigen Richtung.