Как преобразовать Int в String заданной длины с ведущими нулями для выравнивания?

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

Ответ 1

Библиотека Java имеет довольно хорошую (как и в отличной) поддержку форматирования чисел, которая доступна из String класса, обогащенного StringOps:

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 как предложено в другом комментарии.
  • Если длина переменная, экранируйте % в спецификаторе формата, а затем вызовите format для него. Например, f"%%${len}d".format("123")

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

scala> val i = 9 
i: Int = 9

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

scala> println(paddedVal)             
09

Ответ 4

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

"0000000" + 123 takeRight 7

Ответ 5

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

Ответ 6

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

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)

Ответ 7

В случае, если этот Q & A становится каноническим компендиумом,

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

scala> NumberFormat.getIntegerInstance.asInstanceOf[DecimalFormat]
res0: java.text.DecimalFormat = [email protected]

scala> .applyPattern("0000000")

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