스칼라에서 java.String.format을 사용하는 방법은 무엇입니까?


322

.format문자열 의 메서드 를 사용하려고 합니다. 그러나 문자열에 % 1, % 2 등을 넣으면 혼란스러운 Java 소스 코드 조각을 가리키는 java.util.UnknownFormatConversionException이 발생합니다.

private void checkText(String s) {

    int idx;

    // If there are any '%' in the given string, we got a bad format
    // specifier.
    if ((idx = s.indexOf('%')) != -1) {
        char c = (idx > s.length() - 2 ? '%' : s.charAt(idx + 1));
        throw new UnknownFormatConversionException(String.valueOf(c));
    }
}

이것으로부터 나는 %숯이 금지 된다는 것을 이해합니다 . 그렇다면 인수 자리 표시 자에 무엇을 사용해야합니까?

스칼라 2.8을 사용 합니다.

답변:


302

이전의 모든 응답은 정확하지만 모두 Java로되어 있습니다. 스칼라 예제는 다음과 같습니다.

val placeholder = "Hello %s, isn't %s cool?"
val formatted = placeholder.format("Ivan", "Scala")

또한 파이썬 연산자 처럼 유용하게 만드는format% 것에 대한 블로그 게시물 이 있습니다.



1
format문자열 리터럴에 직접 적용하여 단순화 할 수 있습니다 ."Hello %s, isn't %s cool?".format("Ivan", "Scala")
sotrh

298

위치를 나타 내기 위해 숫자를 사용할 필요는 없습니다. 기본적으로 인수의 위치는 단순히 문자열에 나타나는 순서입니다.

이것을 사용하는 올바른 방법의 예는 다음과 같습니다.

String result = String.format("The format method is %s!", "great");
// result now equals  "The format method is great!".

%메소드는 문자열을 표시하는 방법을 알려주기 위해 항상 뒤에 다른 문자를 사용합니다. %s아마도 가장 일반적 일 것입니다. 인수가 문자열로 취급되어야한다는 것을 의미합니다.

모든 옵션을 나열하지는 않지만 몇 가지 예를 제시하여 아이디어를 제공합니다.

// we can specify the # of decimals we want to show for a floating point:
String result = String.format("10 / 3 = %.2f", 10.0 / 3.0);
// result now equals  "10 / 3 = 3.33"

// we can add commas to long numbers:
result = String.format("Today we processed %,d transactions.", 1000000);
// result now equals  "Today we processed 1,000,000 transactions."

String.format옵션 만 사용 java.util.Formatter하려면 Formatter javadocs를 볼 수 있습니다 .

BalusC에서 언급했듯이 필요한 경우 기본 인수 순서를 변경할 수있는 설명서를 볼 수 있습니다. 그러나 아마도 당신이 이것을 원할 때 / 같은 시간을 두 번 이상 사용하는 경우 일 것입니다.


127

소스 코드를 보지 않고 javadoc String.format ()Formatter 구문을 읽어야 합니다 .

% 뒤에 값의 형식을 지정합니다. 예를 들어 십진 정수의 경우는 d이고 문자열의 경우 다음과 s같습니다.

String aString = "world";
int aInt = 20;
String.format("Hello, %s on line %d",  aString, aInt );

산출:

Hello, world on line 20

시도한 것을 수행하려면 (인수 색인 사용) 다음을 사용하십시오 *n*$.

String.format("Line:%2$d. Value:%1$s. Result: Hello %1$s at line %2$d", aString, aInt );

산출:

Line:20. Value:world. Result: Hello world at line 20

70

이것을 사용할 수 있습니다.

String.format("%1$s %2$s %2$s %3$s", "a", "b", "c");

산출:

abbc


1
나는 이런 종류의 사용법을 본 적이 없다. 줄을 반복 할 때 매우 유용하다!
Domi.Zhang

8
+1 이것은 C # 개발자로 사용하는 것과 비슷합니다. 거기에서 {0}{1}대신에 %1$를 사용 %2$합니다.
ashes999

@ ashes999 저는 C #에서 왔어요. 나는 일을하는 표준 방법이 아닌 잊어 버린 대괄호에 익숙합니다. 백분율 기호를 보면 다시 돌아옵니다!
JonnyRaa

13

또한 Scala는 Predef에서 가져온 WrappedString으로의 암시 적 변환을 통해 여러 가지 방법으로 String을 확장하므로 다음을 수행 할 수도 있습니다.

val formattedString = "Hello %s, isn't %s cool?".format("Ivan", "Scala")


10

스칼라 2.10

val name = "Ivan"
val weather = "sunny"

s"Hello $name, it's $weather today!"

1
나는 이것이 문자열 연결의 특별한 구문이라는 것을 취합니다 ($ name과 $ weather는 이전에 정의 된 변수에 대한 하드 참조임을 의미합니다). 그러나 String.Format은 템플릿을 매개 변수로 사용하므로 속성 파일 등에서 템플릿을 검색 할 수 있습니다. -위의 구문으로 가능합니까?
chiccodoro

그것은 문자열 보간입니다. scala에는 s ""와 f ""의 두 가지 유형이 있습니다. 's'는 간단한 문자열이고 'f'는와 비슷합니다. printf심지어 자신의 보간을 정의 할 수도 있습니다 시험). $name는 변수의 값으로 대체해야한다는 의미는 name, 당신은 또한 예를 들어, 보간에서 작업을 할 수s"Hello ${name.toUpperCase}, it's $weather today!"
론도

3

이것은 String.format할 수있는 일의 목록입니다 . 동일printf

int i = 123;
o.printf( "|%d|%d|%n" ,       i, -i );      // |123|-123|
o.printf( "|%5d|%5d|%n" ,     i, -i );      // |  123| –123|
o.printf( "|%-5d|%-5d|%n" ,   i, -i );      // |123  |-123 |
o.printf( "|%+-5d|%+-5d|%n" , i, -i );      // |+123 |-123 |
o.printf( "|%05d|%05d|%n%n",  i, -i );      // |00123|-0123|

o.printf( "|%X|%x|%n", 0xabc, 0xabc );      // |ABC|abc|
o.printf( "|%04x|%#x|%n%n", 0xabc, 0xabc ); // |0abc|0xabc|

double d = 12345.678;
o.printf( "|%f|%f|%n" ,         d, -d );    // |12345,678000|     |-12345,678000|
o.printf( "|%+f|%+f|%n" ,       d, -d );    // |+12345,678000| |-12345,678000|
o.printf( "|% f|% f|%n" ,       d, -d );    // | 12345,678000| |-12345,678000|
o.printf( "|%.2f|%.2f|%n" ,     d, -d );    // |12345,68| |-12345,68|
o.printf( "|%,.2f|%,.2f|%n" ,   d, -d );    // |12.345,68| |-12.345,68|
o.printf( "|%.2f|%(.2f|%n",     d, -d );    // |12345,68| |(12345,68)|
o.printf( "|%10.2f|%10.2f|%n" , d, -d );    // |  12345,68| | –12345,68|
o.printf( "|%010.2f|%010.2f|%n",d, -d );    // |0012345,68| |-012345,68|

String s = "Monsterbacke";
o.printf( "%n|%s|%n", s );                  // |Monsterbacke|
o.printf( "|%S|%n", s );                    // |MONSTERBACKE|
o.printf( "|%20s|%n", s );                  // |        Monsterbacke|
o.printf( "|%-20s|%n", s );                 // |Monsterbacke        |
o.printf( "|%7s|%n", s );                   // |Monsterbacke|
o.printf( "|%.7s|%n", s );                  // |Monster|
o.printf( "|%20.7s|%n", s );                // |             Monster|

Date t = new Date();
o.printf( "%tT%n", t );                     // 11:01:39
o.printf( "%tD%n", t );                     // 04/18/08
o.printf( "%1$te. %1$tb%n", t );            // 18. Apr


1

@Londo는 Scala의 "s"문자열 보간기를 언급했지만 Scala의 "f"문자열 보간 기는 원래 질문과 더 관련이 있다고 생각 합니다. 다른 응답에서 몇 시간 동안 사용한 예제는 다음과 같이 (Scala 2.10부터) 작성할 수 있습니다.

scala> val name = "Ivan"
name: String = Ivan
scala> val thing = "Scala"
thing: String = Scala
scala> val formatted = f"Hello $name%s, isn't $thing%s cool?"
formatted: String = Hello Ivan, isn't Scala cool?

원래 질문에 대한 연결은 다음을 인식해야합니다.

  • formatted문자 "f"가 앞에 붙는 문자열로 정의됩니다. "f"(포맷) 문자열 보간 기입니다.
  • "f"문자열 보간 기는 java.util.Formatter
  • java.lang.String.format 같은 것을 사용 java.util.Formatter

문자열 보간의 좋은 점은 변수를 String.format메소드 의 인수와 일치시키지 않고 문자열로 직접 대체되는 변수를 볼 수 있다는 것 입니다.


0

스칼라에서 문자열 보간에 대해 $ 를 사용하면 하루를 절약하고 인생을 훨씬 쉽게 만들 수 있습니다.

예를 들어 : 입력 이름과 연령을 사용하고 이름과 함께 Hello라고 말하고 나이를 나타내는 함수를 정의하려고합니다. 다음과 같이 쓸 수 있습니다.

def funcStringInterpolationDemo(name:String,age:Int)=s"Hey ! my name is $name and my age is $age"

따라서이 함수를 호출하면 다음과 같이됩니다.

funcStringInterpolationDemo("Shivansh",22)

출력은 다음과 같습니다.

Hey ! my name is Shivansh and my age is 22

나이에 10 년을 더하고 싶다면 같은 줄로 바꾸는 코드를 작성할 수 있습니다!

그런 다음 기능은 다음과 같습니다.

def funcStringInterpolationDemo(name:String,age:Int)=s"Hey ! my name is $name and my age is ${age+10}"

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

Hey ! my name is Shivansh and my age is 32
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.