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

Ответы:

226

Библиотека 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как предлагается в другом комментарии.
  • Если длина переменная, s"%${len}d".format("123")
Huynhjl
источник
6
Бен, dhg, спасибо за положительные голоса, но вы, ребята, крутая толпа! Я думаю, что мы все еще можем кое-что узнать из других ответов, и система голосования позаботится о том, какой ответ является актуальным.
huynhjl
8
вам не нужно быть таким явным, вы можете написать f"$a%07d"(если у вас есть val/ var ain).
fommil
1
@fommil, действительно, этого еще не было, когда я опубликовал первоначальный ответ, но я бы также использовал интерполятор f теперь, когда он существует.
huynhjl 08
Если вам нужны начальные пробелы вместо regex string.replaceAll("\\G0", " ")
начальных
1
Если вам нужны ведущие пробелы вместо ведущих нулей, используйте "% 7d".format(123).
Эрик ван Остен
36

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

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

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

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

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

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

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

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

Пабло Фернандес
источник
14
Используйте .mkString, чтобы превратить обратно в строку
samthebest
2
или используйте
букву
30

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 06
f"$num%02d"(скобки здесь не нужны)
Хартмут П.
9

huynhjl опередил меня и дал правильный ответ, поэтому вот альтернатива:

"0000000" + 123 takeRight 7
Луиджи Плиндж
источник
Это не сработает для чисел больше 10M: "0000000" + Int.MaxValue takeRight 7=> 7483647. Хотя "технически" правильно с точки зрения буквального толкования вопроса, маловероятно, что читатель не захочет, чтобы дополненное число превышало 7 цифр, если число такое большое.
Эмиль Лундберг
Что ж, можно сказать, что это решение лучше, потому что, по крайней мере, цифры все еще правильно выровнены в этом конкретном случае, в отличие от принятого решения. Весь смысл вопроса в том, чтобы цифры правильно выровнялись.
Луиджи Плиндж
3
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}
зеромем
источник
1

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

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)
0__
источник