Java의 이중 십진수 형식


118

double의 소수를 형식화하는 데 문제가 있습니다. 예를 들어 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

쉼표가 생겼습니다. 이것이 내가 한 일입니다. "double variable; NumberFormat formatter = new DecimalFormat ("# 0.00 "); System.out.println (formatter.format (variable));
Christoffer

그것의 출력은 X, 00 아닌 X.00
크리스토퍼

9
JVM에서 사용하는 기본 언어로 인해 쉼표가 표시됩니다. 이는 아마도 Nambari와 다를 수 있습니다. NumberFormat javadoc : docs.oracle.com/javase/1.4.2/docs/api/java/text/…를
Michael Zilbermann

1
zim2001이 지적했듯이 로케일이 다를 수 있습니다. 내 대답에 제공된 링크를 읽으십시오. 마지막에 이것에 대한 정보를 찾을 수 있습니다.
kosa

73

Java 8에서는 format방법 을 사용할 수 있습니다 .. :-

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

System.out.printf("%.2f", 4.0); 
  • ffloating포인트 가치 로 사용됩니다 ..
  • 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은 또한 소수점 형식을 설명하는 첫 번째 매개 변수로 로케일을 허용합니다.
Vincent Mimoun-Prat

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); 

꽤 큰 보너스 인 힙 공간을 절약합니다. 그럼에도 불구하고 저는이 예제가 다른 어떤 답변보다 훨씬 더 관리하기 쉽다고 생각합니다. 특히 대부분의 프로그래머가 C에서 printf 함수를 알고 있기 때문에 (Java는 함수 / 메소드를 약간 변경합니다).


1
@Baz 여기에 중요한 세부 사항이 누락 되었습니까? printStream이 언급되지 않았습니다. OP는 표준 출력 스트림에 대한 형식화 도움말 (Java 문서를 보면 더 쉽게 해결할 수 있음)을 요청하고 있습니다. 설명.
Lewis Robbins

내 잘못이야. 잘못된 javadoc 버전 (1.4)을보고있었습니다. BTW : outPrintStream.
Baz

@Baz 걱정 마세요. 예, 나는 그것이 당신이 언급 한 클래스라고 가정했습니다. 내 모든 책에서 printf는 System.out의 정적 메소드로 참조됩니다 (이 메소드는 정적이기 때문에).
Lewis Robbins 2012 년

1
정확히 말하면 printf의 정적 메서드입니다 PrintStream. 여기를 참조 하십시오 ;) 그럼에도 불구하고 +1.
Baz

@Baz 문서에서 printStream 클래스는 System.out을 상속했습니다. 정적 메서드를 상속하는 것이 매우 이상하지만 (가능할 수도 있음) 내가 틀릴 수 있습니다. 당신은 맞아요.
Lewis Robbins

4
double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));


1

다른 방법은 클래스 의 setMinimumFractionDigits방법을 사용하는 것입니다 NumberFormat.

여기서 기본적으로 소수점 뒤에 표시 할 숫자 수를 지정합니다.

따라서 입력은 지정된 금액이 2라고 가정하여 4.0생성 4.00됩니다.

그러나 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
호아킨 Iurchuk

-4

나는 이것이 오래된 주제라는 것을 알고 있지만 쉼표 대신 마침표를 사용하고 싶다면 결과를 X, 00으로 문자열에 저장 한 다음 기간 동안 변경하여 X.00을 얻습니다.

가장 간단한 방법은 교체를 사용하는 것입니다.

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

출력은 원하는 X.00 입니다. 또한 쉽게하기 위해 모든 것을 한꺼번에 수행하고 이중 변수에 저장할 수 있습니다.

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

이 답변이 지금은 유용하지 않다는 것을 알고 있지만이 포럼을 확인하는 누군가가 이와 같은 빠른 해결책을 찾고있을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.