Java에서 문자열을 형식화하는 방법


답변:


140

String.format 외에도 살펴보십시오 java.text.MessageFormat. 형식이 덜 간결하고 제공 한 C # 예제에 조금 더 가깝고 구문 분석에도 사용할 수 있습니다.

예를 들면 다음과 같습니다.

int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));

더 좋은 예제는 Java 1.5의 varargs 및 autoboxing 개선 사항을 활용하고 위의 내용을 하나의 라이너로 만듭니다.

MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");

MessageFormat선택 수정 자로 i18nized 복수를 수행하는 데 조금 더 좋습니다. 변수가 1이고 복수가 아닌 경우 단수형을 올바르게 사용하는 메시지를 지정하려면 다음과 같이 할 수 있습니다.

String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });

21
MessageFormat은 현지화를위한 것이므로 사용시주의하십시오. 예를 들어 MessageFormat.format("Number {0}", 1234));기본 로케일에 따라 다음 코드가 Number 1,234대신에 생성 할 수 있습니다 Number 1234.
pavel_kazlou

@ ataylor : 안녕하세요, 미안하지만 조금 혼란 스럽습니다. 나는 데이터가 있고 & {0} it ll take firstname, when {1} then lastname, when 등의 Class 객체를 전달할 것 입니다. 가능 {0,choice,0.getFirstName()}합니까 아니면 그런 것입니까?
user3145373 ツ

@ user3145373 ツ 그렇게 생각하지 않습니다.
ataylor

좋아, 내가 원하는 것과 같은 하나의 .Net 프로젝트, codeproject.com/Articles/42310/… 을 참조했다. 그런 프로젝트 나 패키지를 알고 있다면 알려주십시오. 감사합니다
user3145373 ツ

233

String.format을 살펴보십시오 . 그러나 C의 printf 함수 계열과 유사한 형식 지정자를 사용합니다 (예 :

String.format("Hello %s, %d", "world", 42);

"Hello world, 42"를 반환합니다. 형식 지정자에 대해 배울 때 도움 될 수 있습니다 . Andy Thomas-Cramer는 링크를 아래의 주석 에 남겨 두어 공식 사양을 가리키는 것으로 충분히 친절했습니다 . 가장 일반적으로 사용되는 것은 다음과 같습니다.

  • % s-문자열 삽입
  • % d-부호있는 정수 삽입 (10 진수)
  • % f-실수, 표준 표기법 삽입

선택적 형식 지정자와 함께 위치 참조를 사용하는 C #과는 근본적으로 다릅니다. 즉, 다음과 같은 작업을 수행 할 수 없습니다.

String.format("The {0} is repeated again: {0}", "word");

... 실제로 printf / format에 전달 된 매개 변수를 반복하지 않고. (아래 스크럼 마이스터의 의견 참조)


결과를 직접 인쇄하려는 경우 원하는대로 System.out.printf ( PrintStream.printf )를 찾을 수 있습니다 .


2
다른 옵션은 java.text.MessageFormat이며, 이는 {1} 스타일 형식 기호를 허용합니다. String.format ()의 형식 기호는 C의 printf () 형식 기호와 유사하지만 다를 수 있습니다. 전체 구문 은 download.oracle.com/javase/6/docs/api/java/util/… 를 참조하십시오 .
Andy Thomas

53
String.format숫자 위치를 취할 수도 있습니다 : String.format("%2$s %1$s", "foo", "bar");출력bar foo
Scrum Meister

7

String.format을 사용하지 않기로 선택하면 다른 옵션은 + 이항 연산자입니다.

String str = "Step " + a + " of " + b;

이것은

new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));

어느 쪽을 사용하든 귀하의 선택입니다. StringBuilder는 빠르지 만 속도 차이는 미미합니다. 나는 +연산자 를 사용하는 것을 선호한다 StringBuilder.append(String.valueOf(X))).


5
당신이 저를 거부 할 경우, 이유를 설명하십시오.
라이언 아모스

11
1) 문자열 형식에 대한 질문에 대해 +연산자의 작동 방식을 설명합니다 . 2) 당신의 설명은 정확하지 않습니다. +사용에 해당 StringBuilder하지 String.concat. (이것에 관한 너무 많은 정보.)
Søren Løvborg

6

나는 그것에 대한 간단한 방법을 썼다.

public class SomeCommons {
    /** Message Format like 'Some String {0} / {1}' with arguments */
    public static String msgFormat(String s, Object... args) {
        return new MessageFormat(s).format(args);
    }
}

그래서 당신은 그것을 다음과 같이 사용할 수 있습니다 :

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");

5
public class StringFormat {

    public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            System.out.println("================================");
            for(int i=0;i<3;i++){
                String s1=sc.next();
                int x=sc.nextInt();
                System.out.println(String.format("%-15s%03d",s1,x));
            }
            System.out.println("================================");

    }
}

아웃 팟 "===============================
ved15space123 ved15space123 ved15space123"============ =====================

자바 솔루션

  • "-"는 들여 쓰기를하는 데 사용됩니다

  • "15"는 문자열의 최소 길이를 15로 만듭니다.

  • "s"(% 뒤에 몇 문자)는 문자열로 대체됩니다
  • 0은 정수를 왼쪽에 0으로 채 웁니다.
  • 3은 정수를 최소 길이 3으로 만듭니다.


1

이 솔루션은 저에게 효과적이었습니다. REST 클라이언트에 대한 URL을 동적으로 작성해야하므로이 메소드를 작성 했으므로 다음과 같이 restURL을 전달하면됩니다.

/customer/{0}/user/{1}/order

필요한만큼 많은 매개 변수를 추가하십시오.

public String createURL (String restURL, Object ... params) {       
    return new MessageFormat(restURL).format(params);
}

이 메소드를 다음과 같이 호출하면됩니다.

createURL("/customer/{0}/user/{1}/order", 123, 321);

출력

"/ 고객 / 123 / 사용자 / 321 / 주문"


0

나는이 기능을 썼다. $같은 이름의 변수 값으로 시작하는 단어를 보간하십시오 .

private static String interpol1(String x){
    Field[] ffield =  Main.class.getDeclaredFields();
    String[] test = x.split(" ") ;
    for (String v : test ) {
        for ( Field n: ffield ) {
            if(v.startsWith("$") && ( n.getName().equals(v.substring(1))  )){
                try {
                    x = x.replace("$" + v.substring(1), String.valueOf( n.get(null)));
                }catch (Exception e){
                    System.out.println("");
                }
            }
        }
    }
    return x;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.