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