Что Java эквивалентен из C printf %g спецификатор формата?

ну, спустя много времени я нашел этот пост: При получении неоднозначного совпадения найдено исключение при вызове DeleteAsync

я добавил IsDeleted и Id для моих сущностей; следовательно, код при генерации был плохим.

7
задан John Douthat 27 June 2010 в 21:21
поделиться

4 ответа

Вы пробовали использовать класс java.text.DecimalFormat ?

System.out.println(new DecimalFormat().format(1.0));

выводит:

1

, тогда как:

System.out.println(new DecimalFormat().format(1.2));

выводит:

1.2
2
ответ дан 7 December 2019 в 07:50
поделиться

редактировать : Этот код приводит к тому, что дробная часть пропадает, если экспонента составляет 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
4
ответ дан 7 December 2019 в 07:50
поделиться

ну, вы можете указать, сколько цифр вы хотите: «% .2g» отобразит 1,2 как 1,20

0
ответ дан 7 December 2019 в 07:50
поделиться

Вы можете использовать NumberFormat . Установив минимальную дробную часть на 0, но оставив максимальную больше, он должен делать то, что вы хотите.

Это не так просто, как printf, но оно должно работать.

1
ответ дан 7 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: