2016-05-13 2 views
1

Я хотел бы отформатировать число до N знаков после запятой. Там another similar and popular question here, но это не совсем то, что я ищу.Формат поплавок до максимума N знаков после запятой

Я ищу что-то вроде этого, допустим, я хочу макс. 2 места, так что это будет:

1.00 -> "1" (not "1.00") 
1.20 -> "1.2" (not "1.20") 
1.23 -> "1.23" 
1.234 -> "1.23" 
1.235 -> "1.24" 

Отличие другой вопрос в том, что я не хочу, конечные нули после запятой, если не нужны.

Я хотел бы знать, является ли это выполнимо с String.format(), а не с Math.round() или DecimalFormat. Другой вопрос, показанный выше, дает решение с DecimalFormat.

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

+0

Обратите внимание на второй ответ на упомянутый вами вопрос. – Arkadiy

+0

Взгляните на [using BigDecimal] (http://stackoverflow.com/a/13758367/836214) (один из ответов на вопрос, который вы связали) – Krease

+0

Решение опубликовано только с помощью String.format(); – PseudoAj

ответ

2

Вы можете использовать DecimalFormat.

Цитируя документацию:

Вы можете использовать класс DecimalFormat для форматирования десятичных чисел в локализованные строки. Этот класс позволяет вам управлять отображением начальных и конечных нулей, префиксов и суффиксов, группировок (тысяч) разделителей и десятичного разделителя.

Знак фунта (#) обозначает цифру, а период является заполнителем для десятичного разделителя .

public void test(){ 
    DecimalFormat df = new DecimalFormat("#.##"); 
    System.out.println(df.format(1.00)); 
    System.out.println(df.format(1.20)); 
    System.out.println(df.format(1.23)); 
    System.out.println(df.format(1.234)); 
    System.out.println(df.format(1.235)); 
} 

Выход:

1 
1.2 
1.23 
1.23 
1.24 

Update: так как вы обновили вопрос, и вы хотите использовать string.Format, поиск в SO нашел thread и использовать трюк плюс регулярное выражение. Таким образом, вы могли бы использовать что-то вроде этого:

public static void main (String[] args) throws java.lang.Exception 
{ 
    System.out.println(fmt(1.00)); 
    System.out.println(fmt(1.20)); 
    System.out.println(fmt(1.23)); 
    System.out.println(fmt(1.234)); 
    System.out.println(fmt(1.235)); 
} 

public static String fmt(double d) 
{ 
    if(d == (long) d) 
     return String.format("%d",(long)d); 
    else 
     return String.format("%.2f",d).replaceAll("0*$", ""); 
} 

Выход:

1 
1.2 
1.23 
1.23 
1.24 

Во всяком случае, я хотел бы использовать DecimalFormat вместо этого.

+0

Как бы вы поместили десятичные знаки в терминах 'N'? – 4castle

+0

@ 4castle Просто убедитесь, что после десятичной точки в строке формата есть символы * N * '#'. – EJP

+0

Есть ли способ кодировать это с помощью форматирования, или вам нужно будет построить шаблон в цикле с помощью 'StringBuilder'? – 4castle

0

Другим решением, если вы все еще хотите сделать это с String.format(), вот решение:

Java код: ParseN.java

public class ParseN{ 

    public static void main(String []args){ 
     System.out.println(parseN(1.00)); 
     System.out.println(parseN(1.20)); 
     System.out.println(parseN(1.23)); 
     System.out.println(parseN(1.234)); 
     System.out.println(parseN(1.235)); 
    } 

    static String parseN(Double d) 
    { 
     String s = String.format("%.2f", d); 
     s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", ""); 
     return s; 
    } 
} 

выход:

1 
1.2 
1.23 
1.23 
1.24 

Надежда это полностью отвечает на ваш вопрос. Также обратитесь к this.

+0

Вы можете объединить 2 регулярное выражение в '\\.? 0 * $'. Кроме того, в результирующей строке всегда будет десятичная точка, поэтому тройка 'indexOf' не нужна. Если вы поместите 'N' в строку формата, это может быть наиболее полным ответом. – 4castle

2

Вы также можете управлять форматированием DecimalFormat используя setMaximumFractionDigits(...) так:

double d = 1.234567; 
DecimalFormat df = new DecimalFormat(); 
for (int i = 2; i < 6; ++i) { 
    df.setMaximumFractionDigits(i); 
    System.out.println(df.format(d)); 
} 

Это может быть лучше для случая использования, чем генерировать формат, используя StringBuilder или аналогичный.

+0

По умолчанию 'DecimalFormat' использует [' RoundingMode.HALF_EVEN'] (https://docs.oracle.com/javase/7/docs/api/java/mound/RoundingMode.html#HALF_EVEN), который ведет себя неожиданно при округлении '5'. Чтобы исправить это, выполните 'df.setRoundingMode (RoundingMode.HALF_UP);' – 4castle

Смежные вопросы