문제

Decimalformat (또는 다른 표준 포맷터)을 사용하여 다음과 같은 숫자를 형식화하는 방법이 있습니까?

1,000,000 => 1.00m

1,234,567 => 1.23m

1,234,567,890 => 1234.57m

기본적으로 일부 숫자를 백만으로 나누고, 소수점 이하 2 자리를 유지하고, 끝에 'M'을 때렸습니다. NumberFormat의 새로운 서브 클래스를 만드는 것에 대해 생각했지만 상상했던 것보다 까다로워 보입니다.

나는 다음과 같은 것처럼 보이는 형식 메소드가있는 API를 작성하고 있습니다.

public String format(double value, Unit unit); // Unit is an enum

내부적으로, 나는 단위 객체를 numberformatter에 매핑하고 있습니다. 구현은 다음과 같습니다.

public String format(double value, Unit unit)
{
    NumberFormatter formatter = formatters.get(unit);
    return formatter.format(value);
}

이로 인해 클라이언트가 백만으로 나눌 것으로 기대할 수 없으며, Numberformatter로 감지하지 않고 String.Format () 만 사용할 수 없습니다.

도움이 되었습니까?

해결책

String.format("%.2fM", theNumber/ 1000000.0);

자세한 내용은 참조하십시오 string.format javadocs.

다른 팁

당신이있는 경우에 주목하십시오 BigDecimal, 당신은 그것을 사용할 수 있습니다 movePointLeft 방법:

new DecimalFormat("#.00").format(value.movePointLeft(6));

다음은 내가 채찍질 한 숫자 format의 서브 클래스입니다. 그것은 일을하는 것처럼 보이지만 그것이 가장 좋은 방법이라고 확실하지는 않습니다.

private static final NumberFormat MILLIONS = new NumberFormat()
{
    private NumberFormat LOCAL_REAL = new DecimalFormat("#,##0.00M");

    public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos)
    {
        double millions = number / 1000000D;
        if(millions > 0.1) LOCAL_REAL.format(millions, toAppendTo, pos);

        return toAppendTo;
    }

    public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos)
    {
        return format((double) number, toAppendTo, pos);
    }

    public Number parse(String source, ParsePosition parsePosition)
    {
        throw new UnsupportedOperationException("Not implemented...");
    }
};

왜 간단하지 않습니까?

DecimalFormat df = new DecimalFormat("0.00M");
System.out.println(df.format(n / 1000000));

보세요 ChoiseFormat.

더 단순한 방법은 자동으로 1m로 나눈 래퍼를 사용하는 것입니다.

지금은 ICU를 사용해야합니다 CompactDecimalFormat, 영어 이외의 지역의 서식 결과를 현지화합니다. 다른 지역은 "수백만"접미사를 사용하지 않을 수 있습니다.

이 기능은 JDK 12의 표준 Java입니다 ~와 함께 CompactNumberFormat.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top