자바 통화 번호 형식


89

다음과 같이 십진수 형식을 지정하는 방법이 있습니까?

100   -> "100"  
100.1 -> "100.10"

반올림 숫자 인 경우 소수 부분을 생략하십시오. 그렇지 않으면 소수점 이하 두 자리로 형식을 지정하십시오.

답변:


48

나는 그것을 의심한다. 문제는 100이 float이면 100이 아니라, 일반적으로 99.9999999999 또는 100.0000001 또는 이와 비슷한 것입니다.

그런 식으로 서식을 지정하려면 엡실론, 즉 정수로부터의 최대 거리를 정의하고 차이가 더 작 으면 정수 서식을 사용하고 그렇지 않으면 부동 소수점을 사용해야합니다.

이와 같은 것이 트릭을 수행합니다.

public String formatDecimal(float number) {
  float epsilon = 0.004f; // 4 tenths of a cent
  if (Math.abs(Math.round(number) - number) < epsilon) {
     return String.format("%10.0f", number); // sdb
  } else {
     return String.format("%10.2f", number); // dj_segfault
  }
}

8
사소한 nitpick : float는 0x42c80000 비트 패턴으로 정확히 100이 될 수 있습니다.
Karol S

2
예, Karol S가 언급했듯이 많은 숫자가 부동 소수점과 정확히 일치 할 수 있습니다. 모든 숫자가 아닙니다. 100은 표현할 수있는 하나의 숫자이며, 불가능한 숫자 만 설명해야합니다.
csga5000 2015-08-29

160

java.text 패키지를 사용하는 것이 좋습니다.

double money = 100.1;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
String moneyString = formatter.format(money);
System.out.println(moneyString);

이것은 특정 로케일이라는 추가 이점이 있습니다.

그러나 필요한 경우 전체 달러 인 경우 반환되는 문자열을 자릅니다.

if (moneyString.endsWith(".00")) {
    int centsIndex = moneyString.lastIndexOf(".00");
    if (centsIndex != -1) {
        moneyString = moneyString.substring(1, centsIndex);
    }
}

17
통화를 나타내는 데 double을 사용해서는 안됩니다. long으로 변환하고 소수점을 직접 관리하거나 BigDecimal포맷터와 함께 사용하십시오 . joda-money.sourceforge.net 은 일단 완료되면 사용하기에 좋은 라이브러리 여야합니다.
gpampara 2010 년

5
나는 re : double! = money에 동의하지만 그 질문이 제기 된 방식은 아닙니다.
duffymo

3
통화가 작동하는 방식은 무엇을 의미합니까? $ 1.00가 아닌 $ 1이라고 말할 수 있습니다 .... 통화를 표시하는 다른 방법 (기본값 이외)이 있으며이 질문은 정수인 경우 소수 부분을 생략하는 방법을 묻습니다.
DD.

1
렌더링 문제입니다. 통화를 문자열로 받아들이고 정확한 달러 인 경우 소수와 센트를 자르도록 UI에 논리를 넣으십시오.
duffymo 2012

2
동의합니다. 이것이 제가 5.5 년 전에이 글을 썼을 때 Locale 사용을 권장 한 이유입니다. "하지만 그래야만한다면 ...."이 핵심 문구입니다.
duffymo 2015 년

124
double amount =200.0;
Locale locale = new Locale("en", "US");      
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
System.out.println(currencyFormatter.format(amount));

또는

double amount =200.0;
System.out.println(NumberFormat.getCurrencyInstance(new Locale("en", "US"))
        .format(amount));

통화를 표시하는 가장 좋은 방법

산출

$ 200.00

기호를 사용하지 않으려면이 방법을 사용하십시오.

double amount = 200;
DecimalFormat twoPlaces = new DecimalFormat("0.00");
System.out.println(twoPlaces.format(amount));

200.00

이것은 또한 사용할 수 있습니다 (천 단위 구분 기호 사용)

double amount = 2000000;    
System.out.println(String.format("%,.2f", amount));          

2,000,000.00


"통화"가 선언 된 후에 참조되거나 사용되지 않는 것 같습니다. 3 행의 부작용이 있습니까? 아니면 포함시킨 이유가 있나요?
Damian

[Class Locale] [1] [1]에 대해 자세히 알아보기 : docs.oracle.com/javase/7/docs/api/java/util/…
Thilina Dharmasena

18

Google 검색 후 좋은 해결책을 찾지 못했습니다. 다른 사람이 참조 할 수 있도록 내 솔루션을 게시하십시오. priceToString 을 사용 하여 돈을 형식화하십시오.

public static String priceWithDecimal (Double price) {
    DecimalFormat formatter = new DecimalFormat("###,###,###.00");
    return formatter.format(price);
}

public static String priceWithoutDecimal (Double price) {
    DecimalFormat formatter = new DecimalFormat("###,###,###.##");
    return formatter.format(price);
}

public static String priceToString(Double price) {
    String toShow = priceWithoutDecimal(price);
    if (toShow.indexOf(".") > 0) {
        return priceWithDecimal(price);
    } else {
        return priceWithoutDecimal(price);
    }
}

그는 그것이 더 나은 것이라고 결코 말하지 않았습니다. 그는 다른 사람들이 참조 할 수 있도록 솔루션을 게시했습니다. 최소한 감사하다고 말할 수 있습니다.
Umang Desai

가격을 인도 형식으로 표시하려면 어떻게해야합니까? 소수없이. 형식-> ##, ##, ###
Bhuvan 2013

priceWithDecimal (Double) 메서드에서 값이 "0" "###,###,###.00""###,###,##0.00"
dellasavia

1
어떤 것 다시 두 번에 변환 된 포맷 통화에 반대 부사장
비벡 샨

6

예. java.util.formatter 를 사용할 수 있습니다 . "% 10.2f"와 같은 형식화 문자열을 사용할 수 있습니다.


String.format()이를위한 멋진 정적 래퍼입니다. 그래도 왜 '10'을 사용하는지 모르겠습니다.
Xr.

숫자의 크기에 대한 지침이 없으므로 10 Ex Recto를 선택했습니다. 이것이 캔디 바나 자동차의 가격인지 우리는 모릅니다. 전체 크기를 제한되지 않은 상태로 두려면 "% .2f"를 수행 할 수도 있습니다.
dj_segfault 2010 년

DD는 금액이 통화 단위의 반올림 인 경우 소수 부분을 생략하기를 원했습니다.
jarnbjo 2010 년

6

나는 이것을 사용하고 있습니다 (commons-lang의 StringUtils 사용).

Double qty = 1.01;
String res = String.format(Locale.GERMANY, "%.2f", qty);
String fmt = StringUtils.removeEnd(res, ",00");

절단 할 로케일 및 해당 문자열 만 관리해야합니다.


5

나는 이것이 통화를 인쇄하는 데 간단하고 명확하다고 생각합니다.

DecimalFormat df = new DecimalFormat("$###,###.##"); // or pattern "###,###.##$"
System.out.println(df.format(12345.678));

산출량 : $ 12,345.68

질문에 대한 가능한 해결책 중 하나 :

public static void twoDecimalsOrOmit(double d) {
    System.out.println(new DecimalFormat(d%1 == 0 ? "###.##" : "###.00").format(d));
}

twoDecimalsOrOmit((double) 100);
twoDecimalsOrOmit(100.1);

산출:

100

100.10


게시물의 요점을 놓쳤습니다. 숫자가 정수이면 소수를 표시하고 싶지 않습니다.
DD.

DD. 죄송합니다. 질문에 따라 답을 정정했습니다.
Andrew

5

json money field가 float이면 3.1, 3.15 또는 3으로 올 수 있습니다.

이 경우 적절한 표시를 위해 반올림해야 할 수 있습니다 (그리고 나중에 입력 필드에 마스크를 사용할 수 있도록 함).

floatvalue = 200.0; // it may be 200, 200.3 or 200.37, BigDecimal will take care
Locale locale = new Locale("en", "US");      
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);

BigDecimal valueAsBD = BigDecimal.valueOf(value);
    valueAsBD.setScale(2, BigDecimal.ROUND_HALF_UP); // add digits to match .00 pattern

System.out.println(currencyFormatter.format(amount));

5

그렇게하는 가장 좋은 방법입니다.

    public static String formatCurrency(String amount) {
        DecimalFormat formatter = new DecimalFormat("###,###,##0.00");
        return formatter.format(Double.parseDouble(amount));
    }

100-> "100.00
"100.1-> "100.10"


5
NumberFormat currency = NumberFormat.getCurrencyInstance();
String myCurrency = currency.format(123.5);
System.out.println(myCurrency);

산출:

$123.50

통화를 변경하려면

NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.CHINA);
String myCurrency = currency.format(123.5);
System.out.println(myCurrency);

산출:

123.50

4

다음과 같이해야합니다.

public static void main(String[] args) {
    double d1 = 100d;
    double d2 = 100.1d;
    print(d1);
    print(d2);
}

private static void print(double d) {
    String s = null;
    if (Math.round(d) != d) {
        s = String.format("%.2f", d);
    } else {
        s = String.format("%.0f", d);
    }
    System.out.println(s);
}

인쇄 :

100

100,10


Math.round (d)! = d가 작동합니까? 수레를 사용하면 자주! = 생각하더라도.
extraneon

1
다른 방법으로 d가 100.000000000000001이면 여전히 100으로 인쇄됩니다
Stefan De Boey

4

나는 이것이 오래된 질문이라는 것을 알고 있지만 ...

import java.text.*;

public class FormatCurrency
{
    public static void main(String[] args)
    {
        double price = 123.4567;
        DecimalFormat df = new DecimalFormat("#.##");
        System.out.print(df.format(price));
    }
}

3
이것은하지 작업을 수행, 그것은 100.1 않습니다 -> "100.1"- 예를 들어, 참조 stackoverflow.com/questions/5033404/...
davnicwil

4

이런 식으로 정수를 전달한 다음 센트를 전달할 수 있습니다.

String.format("$%,d.%02d",wholeNum,change);

4

java.text.NumberFormat이런 종류의 방법 을 사용해야한다는 @duffymo에 동의합니다 . 실제로 문자열 비교를 수행하지 않고도 기본적으로 모든 형식을 지정할 수 있습니다.

private String formatPrice(final double priceAsDouble) 
{
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    if (Math.round(priceAsDouble * 100) % 100 == 0) {
        formatter.setMaximumFractionDigits(0);
    }
    return formatter.format(priceAsDouble);
}

지적해야 할 몇 가지 사항 :

  • 전체 Math.round(priceAsDouble * 100) % 100 가 복식 / 수로의 부정확성을 해결하고 있습니다. 기본적으로 우리가 수백 위까지 반올림하는지 (아마 이것은 미국 편향 일 수도 있음) 나머지 센트가 있는지 확인하는 것입니다.
  • 소수를 제거하는 setMaximumFractionDigits()방법은

소수점을자를 지 여부를 결정하는 논리가 무엇이든 setMaximumFractionDigits()사용해야합니다.


1
[정보 요점 재 *100%100미국 바이어스되고, 당신이 사용할 수있는 Math.pow(10, formatter.getMaximumFractionDigits())대신에 하드 코딩의 100로케일에 대한 올바른 번호를 사용 ...
daiscog

3

통화 작업을하려면 BigDecimal 클래스를 사용해야합니다. 문제는 일부 부동 숫자를 메모리에 저장할 방법이 없다는 것입니다 (예 : 5.3456을 저장할 수 있지만 5.3455는 저장할 수 없음). 이는 잘못된 계산에 영향을 미칠 수 있습니다.

BigDecimal 및 통화와 협력하는 방법에 대한 멋진 기사가 있습니다.

http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html


2
이것은 내가 물어 본 질문과 완전히 관련이 없습니다.
DD.

3

1000000.2에서 1,000,000,20까지 형식

private static final DecimalFormat DF = new DecimalFormat();

public static String toCurrency(Double d) {
    if (d == null || "".equals(d) || "NaN".equals(d)) {
        return " - ";
    }
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
    DecimalFormatSymbols symbols = DF.getDecimalFormatSymbols();
    symbols.setGroupingSeparator(' ');
    String ret = DF.format(bd) + "";
    if (ret.indexOf(",") == -1) {
        ret += ",00";
    }
    if (ret.split(",")[1].length() != 2) {
        ret += "0";
    }
    return ret;
}

2

이 게시물은 내가 원하는 것을 마침내 얻는 데 정말로 도움이되었습니다. 그래서 나는 다른 사람들을 돕기 위해 여기에 내 코드를 기여하고 싶었습니다. 여기에 몇 가지 설명이있는 코드가 있습니다.

다음 코드 :

double moneyWithDecimals = 5.50;
double moneyNoDecimals = 5.00;
System.out.println(jeroensFormat(moneyWithDecimals));
System.out.println(jeroensFormat(moneyNoDecimals));

반환 :

5,-
€ 5,50

실제 jeroensFormat () 메서드 :

public String jeroensFormat(double money)//Wants to receive value of type double
{
        NumberFormat dutchFormat = NumberFormat.getCurrencyInstance();
        money = money;
        String twoDecimals = dutchFormat.format(money); //Format to string
        if(tweeDecimalen.matches(".*[.]...[,]00$")){
            String zeroDecimals = twoDecimals.substring(0, twoDecimals.length() -3);
                return zeroDecimals;
        }
        if(twoDecimals.endsWith(",00")){
            String zeroDecimals = String.format("€ %.0f,-", money);
            return zeroDecimals; //Return with ,00 replaced to ,-
        }
        else{ //If endsWith != ,00 the actual twoDecimals string can be returned
            return twoDecimals;
        }
}

jeroensFormat () 메소드를 호출하는 displayJeroensFormat 메소드

    public void displayJeroensFormat()//@parameter double:
    {
        System.out.println(jeroensFormat(10.5)); //Example for two decimals
        System.out.println(jeroensFormat(10.95)); //Example for two decimals
        System.out.println(jeroensFormat(10.00)); //Example for zero decimals
        System.out.println(jeroensFormat(100.000)); //Example for zero decimals
    }

다음과 같은 출력이 있습니다.

10,5010,9510,-
€ 100.000 (In Holland numbers bigger than € 999,- and wit no decimals don't have ,-)

이 코드는 현재 통화를 사용합니다. 제 경우에는 네덜란드이므로 형식화 된 문자열이 미국에있는 사람과 다를 것입니다.

  • 네덜란드 : 999.999,99
  • 미국 : 999,999.99

그 숫자의 마지막 3 자만보십시오. 내 코드에는 마지막 3 개의 문자가 ", 00"과 같은지 확인하는 if 문이 있습니다. 미국에서 사용하려면 아직 작동하지 않는 경우 ".00"으로 변경해야 할 수 있습니다.


2

나는 내 자신의 함수를 작성하기에 충분히 미쳤다.

이렇게하면 정수를 통화 형식으로 변환합니다 (소수점에서도 수정할 수 있음).

 String getCurrencyFormat(int v){
        String toReturn = "";
        String s =  String.valueOf(v);
        int length = s.length();
        for(int i = length; i >0 ; --i){
            toReturn += s.charAt(i - 1);
            if((i - length - 1) % 3 == 0 && i != 1) toReturn += ',';
        }
        return "$" + new StringBuilder(toReturn).reverse().toString();
    }

2
  public static String formatPrice(double value) {
        DecimalFormat formatter;
        if (value<=99999)
          formatter = new DecimalFormat("###,###,##0.00");
        else
            formatter = new DecimalFormat("#,##,##,###.00");

        return formatter.format(value);
    }

1

대신 정수를 사용하여 금액을 센트로 표시했습니다.

public static String format(int moneyInCents) {
    String format;
    Number value;
    if (moneyInCents % 100 == 0) {
        format = "%d";
        value = moneyInCents / 100;
    } else {
        format = "%.2f";
        value = moneyInCents / 100.0;
    }
    return String.format(Locale.US, format, value);
}

문제 NumberFormat.getCurrencyInstance()는 때때로 $ 20이 $ 20이되기를 원한다는 것입니다. $ 20.00보다 낫습니다.

누군가 NumberFormat을 사용하여 더 나은 방법을 찾으면 모두 귀를 기울입니다.


1

통화 형식을 지정하고 싶지만 현지 통화를 기반으로하지 않으려는 사람들을 위해 다음과 같이 할 수 있습니다.

val numberFormat = NumberFormat.getCurrencyInstance() // Default local currency
val currency = Currency.getInstance("USD")            // This make the format not locale specific 
numberFormat.setCurrency(currency)

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