정렬을 위해 선행 0을 사용하여 지정된 길이의 문자열로 Int를 변환하는 방법은 무엇입니까?


97

어떻게는 변환 할 수 있습니다 Int긴 7 문자 String즉, 그래서 123으로 설정되어 "0000123"?

답변:


220

Java 라이브러리는 StringOps가 풍부한 String 클래스 에서 액세스 할 있는 (훌륭한 것처럼) 숫자 형식화 지원 이 꽤 좋습니다 .

scala> "%07d".format(123)
res5: String = 0000123

scala> "%07d".formatLocal(java.util.Locale.US, 123)
res6: String = 0000123

Scala 2.10 이후 편집 : fommil에서 제안한대로 2.10 부터 서식 지정 문자열 보간 기 (현지화를 지원하지 않음)도 있습니다.

val expr = 123
f"$expr%07d"
f"${expr}%07d"

2019 년 4 월 수정 :

  • 0이 아닌 선행 공백을 원하면 0형식 지정자에서를 생략하십시오 . 위의 경우 f"$expr%7d"2.12.8 REPL에서 .Tested입니다. 주석에서 제안 된대로 문자열 대체를 수행하거나 7다른 주석에서 제안 된대로 앞에 명시적인 공백을 둘 필요가 없습니다 .
  • 길이가 가변적이면 s"%${len}d".format("123")

6
Ben, dhg, upvotes 덕분에, 너희들은 힘든 군중입니다! 나는 우리가 여전히 다른 답변에서 무언가를 배울 수 있다고 생각하며, 투표 시스템은 어떤 답변이 적절한 지 처리합니다.
huynhjl 2011

8
이렇게 명시적일 필요는 없습니다 . (범위에 / f"$a%07d"가있는 경우) 쓸 수 있습니다 . valvar a
fommil

1
@fommil, 실제로 초기 답변을 게시했을 때는 아직 없었지만 이제 f 보간 기가 존재하므로 사용합니다.
huynhjl 2013-08-08

당신이 원한다면 최고의 공백을 대신 앞에 0 당신은 사용할 수 있습니다 regex string.replaceAll("\\G0", " ")말했다으로 공백 앞에 0을 대체하기 위해 여기
Y2K-하기 Shubham

1
당신이 원하는 경우 공백을 선도하는 대신 앞에 0 을 누른 후 "% 7d".format(123).
Erik van Oosten

36

짧은 답변:

"1234".reverse.padTo(7, '0').reverse

긴 대답 :

Scala StringOps (암시 적 변환으로 인해 Scala 문자열 개체가 갖는 멋진 메서드 집합을 포함 함)에는 문자열 padTo에 특정 양의 문자를 추가하는 메서드가 있습니다. 예를 들면 :

"aloha".padTo(10,'a')

"alohaaaaaa"를 반환합니다. String의 요소 유형은 Char이므로 'a'.

문자를 추가 하는 대신 앞에 추가 해야하므로 문제가 약간 다릅니다 . 그렇기 때문에 문자열을 반전하고 채우기 문자를 추가 한 다음 (문자열이 반전되었으므로 지금 앞에 추가해야 함) 전체를 다시 반전하여 최종 결과를 얻어야합니다.

도움이 되었기를 바랍니다!


14
.mkString을 사용하여 문자열로 다시 변환
samthebest 2013 년

2
또는 문자 'A'사용
로렌스 Wagerfield

29

padding로 표시됩니다 %02d에 대한 0길이를 만들기 위해 접두어하기 2:

scala> val i = 9 
i: Int = 9

scala> val paddedVal = f"${num}%02d"
paddedVal: String = 09

scala> println(paddedVal)             
09

이 라인에서 val paddedVal = f"${num}%02d"변화해야한다 num에 대한i
mjbsgll

f"$num%02d"(여기에 괄호가 필요하지 않음)
Hartmut P.

9

huynhjl이 저를 정답으로 이겼으므로 여기에 대안이 있습니다.

"0000000" + 123 takeRight 7

10M보다 큰 숫자에 대해서는 실패합니다 : "0000000" + Int.MaxValue takeRight 7=> 7483647. 질문을 문자 그대로 해석하면 "기술적으로"정확하지만, 숫자가 그렇게 크면 패딩 된 숫자가 7 자리 이상으로 확장되는 것을 독자가 원하지 않을 것입니다.
Emil Lundberg

이 솔루션이 더 낫다고 말할 수 있습니다. 그 이유는 허용되는 솔루션과 달리 적어도 숫자가 특정 경우에 여전히 올바르게 정렬되어 있기 때문입니다. 질문의 요점은 숫자를 올바르게 정렬하는 것입니다.
Luigi Plinge

3
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}

1

이 Q & A가 정식 개요가 될 경우

scala> import java.text._
import java.text._

scala> NumberFormat.getIntegerInstance.asInstanceOf[DecimalFormat]
res0: java.text.DecimalFormat = java.text.DecimalFormat@674dc

scala> .applyPattern("0000000")

scala> res0.format(123)
res2: String = 0000123

1

음수를 처리해야합니까? 그렇지 않다면 그냥 할 것입니다

def str(i: Int) = (i % 10000000 + 10000000).toString.substring(1)

또는

def str(i: Int) = { val f = "000000" + i; f.substring(f.length() - 7) }

그렇지 않으면 다음을 사용할 수 있습니다 NumberFormat.

val nf = java.text.NumberFormat.getIntegerInstance(java.util.Locale.US)
nf.setMinimumIntegerDigits(7)
nf.setGroupingUsed(false)
nf.format(-123)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.