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.