Java에서 구분 기호없이 긴 정수를 문자열로 포맷하려면 어떻게해야합니까?


122

간단한 질문이지만 여기에 대한 질문은 문서를 이해하려는 것보다 더 간단 할 것입니다 MessageFormat.

long foo = 12345;
String s = MessageFormat.format("{0}", foo);

관찰 된 값은 "12,345"입니다.

원하는 값은 "12345"입니다.

답변:


62

그냥 사용 Long.toString(long foo)


12
또는String.valueOf(long)
rsp dec

6
String.valueOf ()가 Long.toString ()을 호출합니다.
Peter Lawrey

7
아마도 이것은 사소한 일이지만이 경우 Long.toString (foo)의 문서화되지 않은 동작에 의존하고 있습니다. 그런 이유로 Daniel Fortunov의 대답을 선호합니다.
John K

4
문서화되어 있지 않습니다. download.oracle.com/javase/6/docs/api/java/lang/…을 참조하십시오 .
Rob H

3
하지만이 솔루션은 ResourceBundle의 메시지 형식화에 적용 할 수 없습니다. Tuto i18n
Guillaume Husta 15.

332
MessageFormat.format("{0,number,#}", foo);

1
감사합니다. MessageFormat 속성 주입으로이 작업을 수행하려고했습니다. 한 가지 이상의 방법이 있습니다.
Philihp Busby

3
나는이 방법을 선호한다. 내 언어 속성 파일의 형식을 변경할 수 있기 때문입니다.
Pascal 2012 년

2
완벽한 솔루션! 코드 수준 대신 참조 데이터에서 형식 / 형식 해제 옵션을 유지하는 데 도움이되었습니다. 감사합니다! 그리고 @SebastianRoth가 말했듯이-이것은 받아 들여진 대답이어야합니다.
Ofer Lando 2015

9
나는 실제로 왜 예쁘게 숫자 문자열이 디폴트이고 포맷터 API로 명시적인 것이
아닌지 놀랐다

1
패턴을 인용하면 선택 형식 MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0

1

국제화 등으로 "실제"패턴을 만들려고 할 때 약간 고생했습니다. 특히 출력이 표시되는 값에 따라 달라지는 "선택"형식을 사용할 필요가 있습니다 java.text.ChoiceFormat.

이 작업을 수행하는 방법에 대한 예는 다음과 같습니다.

    MessageFormat fmt = new MessageFormat("{0,choice,0#zero!|1#one!|1<{0,number,'#'}|10000<big: {0}}");

    int[] nums = new int[] {
            0,
            1,
            100,
            1000,
            10000,
            100000,
            1000000,
            10000000
    };

    Object[] a = new Object[1];
    for(int num : nums) {
        a[0] = num;
        System.out.println(fmt.format(a));
    }

그러면 다음과 같은 출력이 생성됩니다. 동일한 유형의 작업을 수행하려는 다른 사용자에게 도움이되기를 바랍니다.

zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000

보시다시피 "choice"형식을 사용하면 형식을 지정하기 위해 전달되는 값에 따라 사용할 형식 유형을 선택할 수 있습니다. 작은 숫자는 텍스트로 바꿀 수 있습니다 (원래 값이 표시되지 않음). 중간 크기의 숫자는 그룹화 구분 기호없이 (쉼표없이) 표시됩니다. 가장 큰 숫자에는 다시 쉼표가 포함됩니다. 분명히 이것은의 유연성을 보여주기 위해 완전히 고안된 예제입니다 java.text.MessageFormat.

#형식 텍스트에 인용 된 내용에 대한 참고 : ChoiceFormat및 둘 다 MessageFormat사용 중이므로 둘 사이에 메타 문자간에 충돌이 있습니다. 기본적으로 "같음"을 의미하는 메타 문자로 ChoiceFormat사용 #하여 형식 지정 엔진이 예를 들어1#one! 들어와 비교 {0}하는 1경우를 인식하고 같으면 특정 "선택"을 사용합니다.

그러나 # 에 대한 또 다른 의미가 있습니다 . 그것은 MessageFormat의미 DecimalFormat가있는 메타 문자입니다. "여기에 숫자를 넣어 라"를 의미하는 메타 문자입니다.

ChoiceFormat문자열로 묶여 있기 때문에 #따옴표로 묶어야합니다. 언제ChoiceFormat 문자열을 구문 분석 완료에 서브 포맷을 통과 할 때, 그 따옴표가 제거됩니다 MessageFormat(다음에에 DecimalFormat).

따라서를 사용할 때 {0,choice,...}해당 #문자와 다른 문자 를 인용해야 합니다.


0

가장 짧은 방법은

long foo = 12345;
String s = ""+foo;

3
그리고 항상 그렇듯이 이것은 확장되어 new StringBuilder("").append(foo).toString()실제로 최적이 아닙니다.
RAnders00

1
@ RAnders00 단일 문자열로 숫자를 변환하면 일반적으로 완전히 피할 수 있습니다 상황에 따라 최적의 옵션이 될 가능성이 있지만 가장 간단한 패턴 당신이 사용할 수있는""+
피터 Lawrey

1
당신 말이 맞지만 사람들이 항상 지적하는 경향이 있기 때문에 나는 단지 그것을 지적하고 싶었습니다.
RAnders00

1
메시지 형식을 사용하는 @ RAnders00 btw는이 경우 훨씬 더 비싸고 더 복잡합니다.
Peter Lawrey

예, Long.toString()이 솔루션이 어쨌든 백그라운드에서 사용하는 것이기 때문에 대신 사용해야 합니다. :)
RAnders00

-1

대안으로 String.format하고 java.util.Formatter뿐만 아니라 당신을 위해 힘 작업 ...


-6

시도해 볼 수 있습니다.

String s = new Long(foo).toString();

8
불필요한 개체 생성. 래퍼 클래스와 함께 new를 사용하지 마십시오.
keiki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.