Подвійне десяткове форматування на Java


118

У мене виникають деякі проблеми з форматуванням десяткових знаків подвійного. Якщо у мене є подвійне значення, наприклад, 4.0, як я відформатую десяткові знаки так, щоб натомість було 4,00?


Спробуйте використовувати String.format()або java.text.Format.
Код-учень


Відповіді:


218

Одним із способів було б використання NumberFormat .

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

Вихід:

4.00


1
Так, але я не хочу кома, я хочу десятковий знак.
Крістофер

Я отримую кому. Це те, що я зробив. "подвійна змінна; формат номер NumberFormat = новий DecimalFormat (" # 0,00 "); System.out.println (formatter.format (змінна));
Крістофер

вихід для цього - X, 00, а не X.00
Крістофер

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

1
Як вказувало zim2001, ваша локальність може бути різною. Прочитайте посилання, надане у моїй відповіді. Наприкінці ви знайдете інформацію про це.
коса

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
Я б сказав: "використовувати точку США, яка визначається для місцевих знаків, як десятковий знак, вкажіть локальний пункт США". Ця думка про те, що звички США є правильними, а все інше є "народним" предметом, зводить мене з розуму.
Симоне Джанні

@SimoneGianni Не робіть дурних припущень, деяким людям може знадобитися десятковий знак, щоб бути крапкою. Наприклад, я пишу функцію, яка експортує документ CSV, і я не можу мати коми, тому що символ знака є комою.
Кайзер Кейстер

19

Використовуючи String.format, ви можете це зробити:

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

Зауважте, що кома відрізняється від відповіді @ Вінсента

Вихід:

$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. ОП просить допомогти щодо форматування (що можна було б вирішити простіше, переглянувши документи Java) у стандартний вихідний потік. Поясніть.
Льюїс Роббінс

Моє ліжко. Переглядав неправильну версію javadoc (1.4). ДО РЕЧІ: outє PrintStream.
Баз

@Baz Не хвилюйся. Так, я припускав, що це клас, на який ви посилалися, у всіх моїх книгах printf називається статичним методом з System.out (оскільки ці методи є статичними).
Льюїс Роббінс

1
Якщо бути точним, printfце статичний метод PrintStream. Дивіться тут ;) Але все-таки +1.
Баз

@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 var = Double.parseDouble(("X,00").replace(",",".");

Я знаю, що ця відповідь зараз не корисна, але, можливо, хтось, хто перевіряє цей форум, шукатиме швидке рішення, як це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.