Как красиво отформатировать плавающие числа в строку без лишних десятичных 0? - PullRequest
446 голосов
/ 01 апреля 2009

64-битный дубль может представлять целое число +/- 2 53 точно

Учитывая этот факт, я решил использовать двойной тип в качестве единого типа для всех моих типов, так как мое самое большое целое число - 32-разрядное без знака.

Но теперь я должен напечатать эти псевдоцелые числа, но проблема в том, что они также смешиваются с реальными двойными числами.

Итак, как мне правильно напечатать эти двойники на Java?

Я пробовал String.format("%f", value), что близко, за исключением того, что я получаю много конечных нулей для малых значений.

Вот пример выходных данных %f

232.00000000
0.18000000000
1237875192.0
4.5800000000
0.00000000
1.23450000

Что я хочу, это:

232
0.18
1237875192
4.58
0
1.2345

Конечно, я могу написать функцию для обрезки этих нулей, но это большая потеря производительности из-за манипулирования строками. Могу ли я сделать лучше с кодом другого формата?

EDIT

Ответы Тома Э. и Джереми С. неприемлемы, поскольку они оба произвольно округляют до 2 десятичных знаков. Пожалуйста, поймите проблему, прежде чем ответить.

РЕДАКТИРОВАТЬ 2

Обратите внимание, что String.format(format, args...) является в зависимости от региона (см. Ответы ниже).

Ответы [ 22 ]

0 голосов
/ 23 мая 2013

Вот ответ, который действительно работает (комбинация разных ответов здесь)

public static String removeTrailingZeros(double f)
{
    if(f == (int)f) {
        return String.format("%d", (int)f);
    }
    return String.format("%f", f).replaceAll("0*$", "");
}
0 голосов
/ 19 мая 2013

Вот два способа добиться этого. Во-первых, более короткий (и, вероятно, лучший) путь:

public static String formatFloatToString(final float f)
  {
  final int i=(int)f;
  if(f==i)
    return Integer.toString(i);
  return Float.toString(f);
  }

А вот более длинный и, вероятно, худший путь:

public static String formatFloatToString(final float f)
  {
  final String s=Float.toString(f);
  int dotPos=-1;
  for(int i=0;i<s.length();++i)
    if(s.charAt(i)=='.')
      {
      dotPos=i;
      break;
      }
  if(dotPos==-1)
    return s;
  int end=dotPos;
  for(int i=dotPos+1;i<s.length();++i)
    {
    final char c=s.charAt(i);
    if(c!='0')
      end=i+1;
    }
  final String result=s.substring(0,end);
  return result;
  }
...