Java에서 소수점 구분 기호로 사용되는 강제 점 (“.”)


103

현재 다음 코드를 사용하여 이중을 인쇄합니다.

return String.format("%.2f", someDouble);

이것은 Java가 내 로케일의 소수점 구분 기호 (쉼표)를 사용하고 점을 사용하고 싶은 점을 제외하면 잘 작동합니다. 이 작업을 수행하는 쉬운 방법이 있습니까?


정확한 소수와 함께 double 값을 사용해야하는 경우 double / Double 대신 BigDecimal을 사용해야합니다. 이중 변수를 사용할 때 발생할 수있는 문제는 이 링크 를 참조하십시오 . 시도해 볼 수도 있습니다 : System.out.println (5.1d + 1.1d); -결과는 6.2 대신 6.199999999999999가됩니다. 소수로 숫자를 String으로 포맷하는 방법을 찾는 사람은 이중 변수를 건너 뛰어야한다고 생각합니다.
razvanone

답변:


172

String.format로케일을 지정할 수 있는 오버로드를 사용하십시오 .

return String.format(Locale.ROOT, "%.2f", someDouble);

여기에있는 것처럼 숫자 형식 지정하는 경우 사용하는 NumberFormat것이 더 적절할 것입니다. 그러나의 나머지 서식 기능 String.format이 필요한 경우 제대로 작동합니다.


6
Locale.ROOT는 더 중립적입니다.
speedogoo

@speedogoo : 편집되었지만 숫자 형식이 아무 차이가 없다고 생각합니다.
존 소총

1
예,하지만 미국과 영국 중에서 선택할 필요는 없습니다. 😜
speedogoo

2
Locale.ROOT는 국가가 선택한 소수 구분 기호의 향후 변경 가능성에 대해서도 안전합니다.
Attila Tanyi

IMO 이것은 질문에 대한 대답이 아니라 Locale.setDefault (new Locale ( "en", "US")); 다른 답변에서 지적한대로 수행합니다. 글로벌이기 때문에 바람직하지 않은 부작용이있을 수 있지만 프로그래머로서 OTH는 내가 정말로 원하는 것은 글로벌 기본값이 US라는 것입니다. 로케일에 관심이있는 코드의 다른 모든 곳에서 명시 적으로 수행하기 때문입니다.
nyholku

21

보다 과감한 해결책은 main () 초기에 로케일을 설정하는 것입니다.

처럼:

Locale.setDefault(new Locale("en", "US"));

11
이것은 전체적인 영향을 미치므로 다른 많은 (아마도 바람직하지 않은) 변경을 일으킬 수 있기 때문에 매우 문제가되는 대답입니다.
sleske

2
IMO 이것은 질문에 대한 정답이며 프로그래머로서 이것이 내가 원하는 것입니다. 실제로 현지화가 필요한 코드의 모든 곳에서 Java가 기본적으로 미국 로케일을 사용하기를 원합니다. 내 습관은 아마도 printf / format이 내 로컬 로케일을 사용할 때 매우 성 가시고 소수점 '쉼표'는 내가 사용하는 다른 소프트웨어 (Matlab 누구든지)와 완전히 호환되지 않습니다.
nyholku 19.01.08

10

추가 로케일을 java.lang.String.format 및 java.io.PrintStream.printf (예 : System.out.printf ())에 전달할 수 있습니다.

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

결과는 다음과 같습니다 (내 PC에서).

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

Java API의 String.format 을 참조하십시오 .


4
당신은 또한 사용할 수 있습니다 out.printf((Locale)null, ...)또는 out.format((Locale)null, ...)로케일 독립적 인 표현을 얻을 수 있습니다. (그리고있다 Locale.ROOT)
eckes

10

너무 늦었지만 여기에 언급 된 다른 것은 NumberFormat(및 하위 클래스 DecimalFormat) 의 샘플 사용입니다.

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }

DecimalFormatSymbols이 방법을 사용하기 전에 구분선 을 만들고 설정하는 작업을 한 번만 수행해야한다고 생각합니다.
Line

0

NumberFormat 및 DecimalFormat을 사용할 수 있습니다.

Java Tutorials LocaleSpecific Formatting 에서이 링크를 살펴보십시오.

Locale-Sensitive Formatting이라는 섹션이 필요합니다.


-3

난 .. 같은 문제를 가지고 55.1로 변환 55,10. 내 빠른 (더러운?) 수정은 다음과 같습니다.

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


1
누군가 다른 로케일에서 코드를 실행하려고 할 때까지만 작동합니다. 실제 해결책이 아닙니다. -1
Marco Freudenberger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.