Java `NumberFormat` предполагает неверный тип номера - PullRequest
0 голосов
/ 06 февраля 2019

Например:

NumberFormat nf = NumberFormat.newInstace();
Number number = nf.parse("0.0");

number разрешается как java.lang.Integer во время выполнения, даже если ясно, что значение Double.В большинстве случаев это не проблема, поскольку значение все равно заключено в Number, но проблема в том, что Number не реализует Comparable, и я вынужден прибегнуть к его приведению.

Есть ли класс, который предполагает "0.0" -подобные строки для представления Double?

1 Ответ

0 голосов
/ 06 февраля 2019

Числовой формат знает, как числа записываются в вашем регионе.Например, в Италии у вас есть "," как десятичная точка.Итак:

     NumberFormat nf =  NumberFormat.getInstance(Locale.ITALY);
     Number number = nf.parse("0,1");
     System.err.println(number);  

0.1

Хотя, если вы использовали "."который просто используется для создания групп (например, тысячи), вы получите 1 как результат (что правильно, если 01 - 1):

     NumberFormat nf =  NumberFormat.getInstance(Locale.ITALY);
     Number number = nf.parse("0.1");
     System.err.println(number);  

1

Сейчасс английским языком это полная противоположность:

        NumberFormat nf =  NumberFormat.getInstance(Locale.ENGLISH);
        Number number = nf.parse("0.1");
        System.err.println(number);

0.1

И, наконец, английский с ",":

        NumberFormat nf =  NumberFormat.getInstance(Locale.ENGLISH);
        Number number = nf.parse("0,1");
        System.err.println(number);

1

Кто-то спорил о следах 0.Итак:

   NumberFormat nf =  NumberFormat.getInstance(Locale.ENGLISH);
   double d = nf.parse("17").doubleValue();
   double d2 = nf.parse("17.000").doubleValue();

И d, и d2 будут иметь одинаковое значение.Это точно такое же поведение, как если бы я назначил переменные в коде.

   double d = 17;
   double d2 = 17.000;

Обе переменные будут содержать одинаковое число.В обоих случаях без потери точности.

Сравнение также правильно вернет true:

   boolean test = nf.parse("17") == nf.parse("17.000");
   System.err.print( test );

true

То же поведение, что ив коде:

   boolean test = 17 == 17.000;
   System.err.print( test );

true

Наконец, возвращаемый тип NumberFormat - это «Number».Он анализирует число как то, что есть: число.Так что это не Дабл или Лонг (как Животное не является Собакой или Кошкой, даже если Собака является Животным).

Если вам нужен надежный тип double, вы просто используете number.doubleValue (), который дает вам надежный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...