Как я могу преобразовать Int
в 7-символьный String
, чтобы 123
он превратился в "0000123"
?
Ответы:
Библиотека 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")
f"$a%07d"
(если у вас есть val
/ var
a
in).
"% 7d".format(123)
.
Короткий ответ:
"1234".reverse.padTo(7, '0').reverse
Длинный ответ:
Scala StringOps (который содержит хороший набор методов, которые есть у строковых объектов Scala из-за неявных преобразований) имеет padTo
метод, который добавляет к вашей строке определенное количество символов. Например:
"aloha".padTo(10,'a')
Вернет "алохаааааа". Обратите внимание, что типом элемента String является Char, поэтому символы 'a'
.
Ваша проблема немного отличается, поскольку вам нужно добавлять символы вместо их добавления . Вот почему вам нужно перевернуть строку, добавить символы заполнения (вы бы добавили их сейчас, поскольку строка перевернута), а затем снова переверните все это, чтобы получить окончательный результат.
Надеюсь это поможет!
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
f"$num%02d"
(скобки здесь не нужны)
huynhjl опередил меня и дал правильный ответ, поэтому вот альтернатива:
"0000000" + 123 takeRight 7
"0000000" + Int.MaxValue takeRight 7
=> 7483647
. Хотя "технически" правильно с точки зрения буквального толкования вопроса, маловероятно, что читатель не захочет, чтобы дополненное число превышало 7 цифр, если число такое большое.
Если эти вопросы и ответы станут каноническим сборником,
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
Вам нужно иметь дело с отрицательными числами? Если нет, я бы просто сделал
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)