Як перетворити Int у рядок заданої довжини з початковими нулями для вирівнювання?


98

Як я можу перетворити Intсимвол на 7 символів String, щоб у 123нього перетворили "0000123"?

Відповіді:


221

Бібліотека 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")

6
Бен, dhg, спасибі за голоси, хоч ви, хлопці, жорстка натовп! Я думаю, ми все ще можемо навчитися чомусь з інших відповідей, і система голосування дбає про те, яка відповідь є доречною.
huynhjl

8
вам не потрібно бути таким явним, ви можете писати f"$a%07d"(якщо у вас є val/ var ain scope).
fommil

1
@fommil, справді, цього ще не було, коли я розмістив початкову відповідь, але я б також використовував інтерполятор f тепер, коли він існує.
huynhjl

Якщо ви хочете провідні пробіли замість провідних нулів, тоді ви можете використовувати regex string.replaceAll("\\G0", " ")для заміни провідних нулів пробілами, як сказано тут
y2k-shubham

1
Якщо вам потрібні пробіли замість нулів, тоді використовуйте "% 7d".format(123).
Ерік ван Остен

36

Коротка відповідь:

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

Довга відповідь:

Scala StringOps (який містить гарний набір методів, які мають рядкові об'єкти Scala через неявні перетворення) має padToметод, який додає певну кількість символів до вашого рядка. Наприклад:

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

Повернеться "alohaaaaaa". Зверніть увагу, що елементом типу String є Char, отже, одинарні лапки навколо 'a'.

Ваша проблема дещо інша, оскільки вам потрібно додавати символи, а не додавати їх. Ось чому вам потрібно змінити рядок, додати символи заповнення (ви б додавали їх зараз, оскільки рядок зворотний), а потім знову змінити все, щоб отримати кінцевий результат.

Сподіваюся, це допомагає!


14
Використовуйте .mkString, щоб перетворитися назад у рядок
samthebest

2
або використовувати символ "а"
Лоуренс Вагерфілд,

29

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

f"$num%02d"(тут не потрібні дужки)
Хартмут П.

9

huynhjl побив мене на правильну відповідь, тому ось альтернатива:

"0000000" + 123 takeRight 7

Це не вдасться для чисел більше 10M: "0000000" + Int.MaxValue takeRight 7=> 7483647. Незважаючи на те, що "технічно" виправлено буквальним тлумаченням питання, навряд чи читач не хоче, щоб заповнене число перевищувало 7 цифр, якщо число настільки велике.
Еміль Лундберг

Ну, можна сказати, це рішення краще, оскільки принаймні цифри все ще правильно вирівняні в цьому конкретному випадку, на відміну від прийнятого рішення. Вся суть питання в тому, щоб розрядити цифри належним чином.
Луїджі Плінге


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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.