Як я можу перетворити Int
символ на 7 символів String
, щоб у 123
нього перетворили "0000123"
?
Відповіді:
Бібліотека 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")
f"$a%07d"
(якщо у вас є val
/ var
a
in scope).
regex
string.replaceAll("\\G0", " ")
для заміни провідних нулів пробілами, як сказано тут
"% 7d".format(123)
.
Коротка відповідь:
"1234".reverse.padTo(7, '0').reverse
Довга відповідь:
Scala StringOps (який містить гарний набір методів, які мають рядкові об'єкти Scala через неявні перетворення) має padTo
метод, який додає певну кількість символів до вашого рядка. Наприклад:
"aloha".padTo(10,'a')
Повернеться "alohaaaaaa". Зверніть увагу, що елементом типу 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)