ما هو المعادل Java لمحدد تنسيق printf %g الخاص بـ C؟

StackOverflow https://stackoverflow.com/questions/873298

  •  22-08-2019
  •  | 
  •  

سؤال

لقد حاولت استخدام Formatter.format، ولكن يبدو أن هذا يترك الجزء العشري على الأرقام التي تحتوي على 0 الجزء العشري، في حين أن الإصدار C لا يفعل ذلك.هل يوجد ما يعادل محدد التنسيق %g الخاص بـ C في Java، وإذا لم يكن الأمر كذلك، فهل هناك طريقة لتزييفه؟نيتي هي الحفاظ على الجزء العشري تمامًا مثل حرف 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

نصائح أخرى

تعديل : ل يسبب هذا الرمز الجزء الكسري للذهاب في عداد المفقودين إذا كان الأس هو 17 أرقام، نظرا لبلدي سوء الفهم لكيفية تنسيق String.format تلك الأرقام. لذلك لا يرجى عدم استخدام هذا الرمز: 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

يمكنك استخدام أ تنسيق الرقم.من خلال تعيين الحد الأدنى لأرقام الكسور على 0، مع ترك الحد الأقصى أكبر، يجب أن تفعل ما تريد.

إنها ليست سهلة مثل printf، ولكنها يجب أن تعمل.

وكذلك، يمكنك تحديد كم عدد الأرقام التي تريدها: سيتم عرض 1.2 كما 1.20 "٪ .2g"

ملحوظة أن استخدام

String.format("%.17g", x).replaceFirst("\\.?0+(e|$)", "$1")

وفشل ل1.2345e 20 (يجرد الصفر من نهاية، وإنتاج 1.2345e-2). هنا هو ما انتهى بي الأمر استخدام في قانون بلدي:

String.format(Locale.US, "%.6g", x).replaceFirst("\\.0+(e|$)", "$1").replaceFirst("(\\.[0-9]*[1-9])(0+)(e|$)", "$1$3")

وأساسا أنا تعديل التعبير لضمان الأصفار الوحيدة في نهاية الجزء الكسري تتم إزالة وتقسيم ذلك في حالتين. ولكن بفضل لافتا لي في الاتجاه الصحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top