Java에서 숫자 형식을 어떻게 지정합니까?


114

Java에서 숫자 형식을 어떻게 지정합니까?
"모범 사례"는 무엇입니까?

서식을 지정하기 전에 숫자를 반올림해야합니까?

32.302342342342343 => 32.30

.7323 => 0.73

기타

답변:


124

이 스레드 에서 이를 수행하는 여러 가지 방법이 있습니다.

double r = 5.1234;
System.out.println(r); // r is 5.1234

int decimalPlaces = 2;
BigDecimal bd = new BigDecimal(r);

// setScale is immutable
bd = bd.setScale(decimalPlaces, BigDecimal.ROUND_HALF_UP);
r = bd.doubleValue();

System.out.println(r); // r is 5.12

f = (float) (Math.round(n*100.0f)/100.0f);

DecimalFormat df2 = new DecimalFormat( "#,###,###,##0.00" );
double dd = 100.2397;
double dd2dec = new Double(df2.format(dd)).doubleValue();

// The value of dd2dec will be 100.24

DecimalFormat는, () 를 할 수있는 가장 역동적 인 방법이 될 것 같다, 그리고 다른 사람의 코드를 읽을 때 이해하기 매우 쉽게이기도합니다.


이 설명에 감사드립니다. 그러나 Intellij Double.valueOfnew Double(number).doubleValue(). 마지막 예제의 마지막 행은 그 때문에 것double dd2dec = Double.valueOf(df2.format(dd));
kumaheiyama

이 답변의 DecimalFormat 패턴은 미국에는 좋지만 전 세계 대부분의 다른 로케일에서는 잘못되었습니다. 그룹화 문자 (미국에서는 쉼표, 다른 로케일에서는 공백 또는 점), 그룹화 크기 (미국 및 대부분의 로케일에서는 3이지만 인도에서는 다름), 10 진수 문자 (미국에서는 점, 다른 로케일에서는 쉼표) . 사용해 DecimalFormat의 인스턴스를 얻을 수있는 올바른 방법은 다음과 같습니다에 DecimalFormat DF = (경우에 DecimalFormat) NumberFormat.getNumberInstance (로케일)
vonWippersnap

74

당신 String.format()은 새로운 가장 친한 친구가 될 것입니다!

https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax

 String.format("%.2f", (double)value);

29
이 답변이 다른 사람에게서 온다면 그렇게 많은 찬성표를 얻지 못했을 것입니다. String.format숫자가 아닌 문자열을 형식화하기위한 것입니다.
Dónal

4
실제로 String.format은 C의 printf와 같습니다. 여러 종류의 데이터 유형을 형식화 할 수 있습니다.
cesarse

3
반올림 된 값을 문자열로 변환하려면 이것이 방법 중 하나입니다. 기타는 DecimalFormat. 그리고 DecimalFormat빨리보다 약간이다 String.format. 단순 System.currentTimeMillis비교는 그것을 보여줍니다.
manikanta

문자열 값에만 해당
T8Z

이것이 최고의 답변입니다. 소수점 뒤의 자릿수는 완전히 도메인별로 다르지만 숫자는 로케일 인식 방식으로 표시되어야합니다. String.format ()은 기본 로케일에 대해 올바른 숫자 기호와 10 진수 문자를 사용합니다. 더 나은 것은 그것을 명시하기 위해 format ()에 대한 첫 번째 매개 변수로 필요한 로케일을 전달하는 것입니다.
vonWippersnap

14

NumberFormat (및 대부분의 다른 Format 하위 항목)의 하위 클래스는 동기화되지 않습니다. 형식 개체를 만들고 util 클래스의 정적 변수에 저장하는 것은 일반적이지만 위험한 방법입니다. 실제로는 상당한 부하가 발생할 때까지 거의 항상 작동합니다.


1
감사합니다! 당신은 나를 구했습니다.
David Thielen

11

네, 반올림합니다. 이것이 주요 예제 소스 입니다.

/*
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */ 


import java.util.*;
import java.text.*;

public class DecimalFormatDemo {

    static public void customFormat(String pattern, double value ) {
        DecimalFormat myFormatter = new DecimalFormat(pattern);
        String output = myFormatter.format(value);
        System.out.println(value + "  " + pattern + "  " + output);
    }

    static public void localizedFormat(String pattern, double value,                                       Locale loc ) {
        NumberFormat nf = NumberFormat.getNumberInstance(loc);
        DecimalFormat df = (DecimalFormat)nf;
        df.applyPattern(pattern);
        String output = df.format(value);
        System.out.println(pattern + "  " + output + "  " + loc.toString());
    }

    static public void main(String[] args) {

        customFormat("###,###.###", 123456.789);
        customFormat("###.##", 123456.789);
        customFormat("000000.000", 123.78);
        customFormat("$###,###.###", 12345.67);
        customFormat("\u00a5###,###.###", 12345.67);

        Locale currentLocale = new Locale("en", "US");

        DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(currentLocale);
        unusualSymbols.setDecimalSeparator('|');
        unusualSymbols.setGroupingSeparator('^');
        String strange = "#,##0.###";
        DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols);
        weirdFormatter.setGroupingSize(4);
        String bizarre = weirdFormatter.format(12345.678);
        System.out.println(bizarre);

        Locale[] locales = {
            new Locale("en", "US"),
            new Locale("de", "DE"),
            new Locale("fr", "FR")
        };

        for (int i = 0; i < locales.length; i++) {
            localizedFormat("###,###.###", 123456.789, locales[i]);
        }
     }
 }

8

이 시도:

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

간단하고 효율적입니다.



4

표준 라이브러리에는 두 가지 접근 방식이 있습니다. 하나는 java.text.DecimalFormat을 사용하는 것입니다. java.util.Formatter를 기반으로하는 다른 더 비밀스러운 메서드 (String.format, PrintStream.printf 등)는 C 프로그래머를 행복하게 유지해야합니다 (ish).


2

Robert가 그의 답변에서 지적했듯이 DecimalFormat은 동기화되지 않았고 API가 스레드 안전성을 보장하지도 않습니다 (사용중인 JVM 버전 / 공급 업체에 따라 달라질 수 있음).

대신 스레드로부터 안전한 Spring의 Numberformatter 를 사용하십시오 .


2
public static void formatDouble(double myDouble){
 NumberFormat numberFormatter = new DecimalFormat("##.000");
 String result = numberFormatter.format(myDouble);
 System.out.println(result);
}

예를 들어 formatDouble () 메서드에 전달 된 double 값이 345.9372이면 결과는 다음과 같습니다. 345.937 마찬가지로 값 .7697이 메서드에 전달되면 결과는 .770입니다.

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