Как преобразовать Int в строку заданной длины с ведущими нулями для выравнивания? - PullRequest
80 голосов
/ 15 ноября 2011

Как я могу преобразовать Int в 7-символьную длину String, чтобы 123 превратился в "0000123"?

Ответы [ 7 ]

193 голосов
/ 15 ноября 2011

Библиотека 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 года:

  • Если вам нужны начальные пробелы, а не ноль, просто пропустите 0 из спецификатора формата.В приведенном выше случае это будет f"$expr%7d". Испытано в 2.12.8 REPL.Нет необходимости выполнять замену строки, как предлагается в комментарии, или даже ставить явный пробел перед 7, как предлагается в другом комментарии.
  • Если длина переменная, s"%${len}d".format("123")
30 голосов
/ 15 ноября 2011

Краткий ответ:

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

Длинный ответ:

Scala StringOps (который содержит хороший наборметодов, которые имеют строковые объекты Scala из-за неявных преобразований), имеет метод padTo, который добавляет определенное количество символов к вашей строке.Например:

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

Вернет "alohaaaaaa".Обратите внимание, что типом элемента String является Char, поэтому одинарные кавычки вокруг 'a'.

Ваша проблема немного другая, так как вам нужно предварять символов вместо добавив им.Вот почему вам нужно перевернуть строку, добавить символы заполнения (вы бы добавили их сейчас, так как строка перевернута), а затем снова перевернуть все, чтобы получить окончательный результат.

Надеюсь, этопомогает!

21 голосов
/ 13 апреля 2015

padding обозначается %02d для 0 с префиксом для длины 2:

scala> val i = 9 
i: Int = 9

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

scala> println(paddedVal)             
09
9 голосов
/ 15 ноября 2011

huynhjl избил меня до правильного ответа, так что вот альтернатива:

"0000000" + 123 takeRight 7
2 голосов
/ 03 января 2018
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}
1 голос
/ 25 июня 2013

В случае, если эти вопросы и ответы становятся каноническим сборником,

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 голос
/ 15 ноября 2011

Вам нужно иметь дело с отрицательными числами?Если нет, я бы просто сделал

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)
...