Двойное десятичное форматирование в Java


118

У меня проблемы с форматированием десятичных знаков двойного числа. Если у меня двойное значение, например 4.0, как мне отформатировать десятичные дроби, чтобы вместо них было 4.00?


Попробуйте использовать String.format()или java.text.Format.
Code-Apprentice


Ответы:


218

Один из способов - использовать NumberFormat .

NumberFormat formatter = new DecimalFormat("#0.00");     
System.out.println(formatter.format(4.0));

Вывод:

4,00


1
Да, но мне не нужна запятая, мне нужен десятичный знак.
Christoffer

Я получаю запятую. Вот что я сделал. "двойная переменная; NumberFormat formatter = new DecimalFormat (" # 0.00 "); System.out.println (formatter.format (variable));
Christoffer

вывод для этого - X, 00, а не X.00
Christoffer

9
Вы получаете запятую из-за языка по умолчанию, используемого вашей JVM, который, вероятно, отличается от языка Nambari. Взгляните на NumberFormat javadoc: docs.oracle.com/javase/1.4.2/docs/api/java/text/…
Майкл Зильберманн,

1
Как указал zim2001, ваш регион может быть другим. Прочтите ссылку в моем ответе. В конце вы найдете информацию об этом.
kosa

73

В Java 8 вы можете использовать formatметод ..: -

System.out.format("%.2f", 4.0); // OR

System.out.printf("%.2f", 4.0); 
  • fиспользуется для floatingбалла ..
  • 2 после десятичной дроби обозначает количество десятичных знаков после запятой .

Для большинства версий Java вы можете использовать DecimalFormat: -

    DecimalFormat formatter = new DecimalFormat("#0.00");
    double d = 4.0;
    System.out.println(formatter.format(d));

43

Используйте String.format :

String.format("%.2f", 4.52135);

Согласно документам:

Всегда используется языковой стандарт, возвращаемый Locale.getDefault().


8
String.format также принимает языковой стандарт в качестве первого параметра для учета форматирования десятичного знака.
Винсент Мимун-Прат,

4
Чтобы избежать знаков десятичной дроби (например, запятой), специфичных для локали, укажите локаль США: String.format (Locale.US, «%. 2f», 4.52135);
Alexander233

3
Я бы сказал: «использовать точку, специфичную для США, в качестве десятичного знака, указать регион для США» ... эта идея о том, что американские привычки - правильные, а все остальное - своего рода «народные» вещи, сводит меня с ума.
Simone Gianni

@SimoneGianni Не делайте глупых предположений, некоторым людям может понадобиться десятичная дробь в качестве точки. Например, я пишу функцию, которая экспортирует документ CSV, и у меня не может быть запятой, потому что символ запятой является разделителем.
Kaiser Keister

19

Используя String.format, вы можете сделать это:

double price = 52000;
String.format("$%,.2f", price);

Обратите внимание на запятую, которая отличает это от ответа @Vincent

Вывод:

$52,000.00

Хорошим ресурсом для форматирования является официальная страница java по этой теме.


6

Вы всегда можете использовать статический метод printf from System.out- тогда вы реализуете соответствующее средство форматирования; это экономит место в куче, которое требовалось от вас в других примерах.

Пример:

System.out.format("%.4f %n", 4.0); 

System.out.printf("%.2f %n", 4.0); 

Экономит место в куче, что является довольно большим бонусом, тем не менее, я считаю, что этот пример намного более управляем, чем любой другой ответ, тем более, что большинство программистов знают функцию printf из C (хотя Java немного меняет функцию / метод).


1
@Baz Я здесь упускаю важную деталь, о printStream не упоминается. OP запрашивает помощь по форматированию (которую можно было бы легче решить, просмотрев документы Java) для стандартного потока вывода. Объясните.
Льюис Роббинс,

Виноват. Искал неправильную версию javadoc (1.4). Кстати: outэто файл PrintStream.
Baz

@Baz Не беспокойся. Да, я предположил, что это класс, о котором вы говорили, во всех моих книгах printf называется статическим методом из System.out (поскольку эти методы статические).
Льюис Роббинс,

1
Если быть точным, printfэто статический метод PrintStream. Смотрите здесь ;) Но все же +1.
Baz

@Baz Из документации класс printStream унаследовал System.out. Возможно, я ошибаюсь - хотя унаследовать статический метод довольно странно (возможно ли это вообще)? Вы, я полагаю, правы.
Льюис Роббинс,



1

Альтернативный метод - использовать setMinimumFractionDigitsметод из NumberFormatкласса.

Здесь вы в основном указываете, сколько чисел должно появиться после десятичной точки.

Таким образом, ввод 4.0будет производить 4.00, если ваша указанная сумма равна 2.

Но, если ваш Doubleввод содержит больше, чем указанная сумма, потребуется минимальная указанная сумма, а затем добавить еще одну цифру, округленную вверх / вниз.

Например, 4.15465454при указании минимального количества 2 будет произведено4.155

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
Double myVal = 4.15465454;
System.out.println(nf.format(myVal));

Попробуйте онлайн


1

Есть много способов сделать это. Они приведены ниже:

Предположим, что ваш исходный номер указан ниже:

 double number = 2354548.235;

Использование NumberFormat:

NumberFormat formatter = new DecimalFormat("#0.00");
    System.out.println(formatter.format(number));

Использование String.format:

System.out.println(String.format("%,.2f", number));

Использование DecimalFormat и шаблона:

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
        DecimalFormat decimalFormatter = (DecimalFormat) nf;
        decimalFormatter.applyPattern("#,###,###.##");
        String fString = decimalFormatter.format(number);
        System.out.println(fString);

Использование DecimalFormat и шаблона

DecimalFormat decimalFormat = new DecimalFormat("############.##");
        BigDecimal formattedOutput = new BigDecimal(decimalFormat.format(number));
        System.out.println(formattedOutput);

Во всех случаях вывод будет: 2354548.23

Примечание :

Во время округления вы можете добавить RoundingModeв свой форматер. Ниже приведены некоторые режимы округления:

    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

Вот импорт :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

1

Вы можете использовать любой из следующих методов

  1. Если вы используете java.text.DecimalFormat

    DecimalFormat decimalFormat = NumberFormat.getCurrencyInstance(); 
    decimalFormat.setMinimumFractionDigits(2); 
    System.out.println(decimalFormat.format(4.0));

    ИЛИ

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
  2. Если вы хотите преобразовать его в простой строковый формат

    System.out.println(String.format("%.2f", 4.0)); 

Весь приведенный выше код будет печатать 4.00


0

Работает на 100%.

import java.text.DecimalFormat;

public class Formatting {

    public static void main(String[] args) {
        double value = 22.2323242434342;
        // or  value = Math.round(value*100) / 100.0;

        System.out.println("this is before formatting: "+value);
        DecimalFormat df = new DecimalFormat("####0.00");

        System.out.println("Value: " + df.format(value));
    }

}

-3

Первый импорт NumberFormat. Затем добавьте это:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

Это даст вам два десятичных разряда и знак доллара, если он имеет дело с валютой.

import java.text.NumberFormat;
public class Payroll 
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
    int hoursWorked = 80;
    double hourlyPay = 15.52;

    double grossPay = hoursWorked * hourlyPay;
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

    System.out.println("Your gross pay is " + currencyFormatter.format(grossPay));
    }

}

1
Вопрос не в отображении валюты, и на него можно более точно ответить с помощью функций форматирования (как описано в других ответах).
yacc

-4

Сделать это можно следующим образом:

double d = 4.0;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));

1
Не работает, потому что используется ##вместо00
Хоакин Юрчук

-4

Я знаю, что это старая тема, но если вам действительно нравится использовать точку вместо запятой, просто сохраните результат как X, 00 в String, а затем просто измените его на период, чтобы получить X.00

Самый простой способ - просто заменить.

String var = "X,00";
String newVar = var.replace(",",".");

Результатом будет желаемый X.00 . Также, чтобы упростить задачу, вы можете сделать все это за один раз и сохранить в переменной типа double:

Double var = Double.parseDouble(("X,00").replace(",",".");

Я знаю, что этот ответ сейчас бесполезен, но, возможно, кто-то, кто проверяет этот форум, будет искать быстрое решение, подобное этому.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.