Biblioteka Java ma całkiem dobrą (jak w doskonałej) obsługę formatowania liczb, która jest dostępna z wzbogaconej klasy StringOps :
scala> "%07d".format(123)
res5: String = 0000123
scala> "%07d".formatLocal(java.util.Locale.US, 123)
res6: String = 0000123
Edytuj post Scala 2.10 : jak sugeruje fommil, od 2.10 istnieje również interpolator tekstu formatującego (nie obsługuje lokalizacji):
val expr = 123
f"$expr%07d"
f"${expr}%07d"
Edycja kwiecień 2019:
- Jeśli potrzebujesz spacji wiodących, a nie zera, po prostu pomiń znak
0
ze specyfikatora formatu. W powyższym przypadku byłoby to f"$expr%7d"
.Testowane w 2.12.8 REPL. Nie ma potrzeby zastępowania łańcucha, jak zasugerowano w komentarzu, ani nawet umieszczania wyraźnej spacji przed znakiem, 7
jak zasugerowano w innym komentarzu.
- Jeśli długość jest zmienna,
s"%${len}d".format("123")
f"$a%07d"
(jeśli maszval
/var
a
w zakresie).regex
string.replaceAll("\\G0", " ")
do zastąpienia wiodących zer spacjami, jak powiedziano tutaj"% 7d".format(123)
.Krótka odpowiedź:
"1234".reverse.padTo(7, '0').reverse
Długa odpowiedź:
Scala StringOps (która zawiera niezły zestaw metod, które obiekty łańcuchowe Scala mają ze względu na niejawne konwersje) ma
padTo
metodę, która dodaje pewną ilość znaków do twojego ciągu. Na przykład:"aloha".padTo(10,'a')
Zwróci „alohaaaaaa”. Zwróć uwagę, że typ elementu String to Char, stąd pojedyncze cudzysłowy wokół
'a'
.Twój problem jest nieco inny, ponieważ musisz dodawać znaki na początku zamiast je dołączać . Dlatego musisz odwrócić ciąg, dołączyć znaki wypełniające (będziesz je dodawać teraz, ponieważ ciąg jest odwrócony), a następnie ponownie odwrócić całość, aby uzyskać ostateczny wynik.
Mam nadzieję że to pomoże!
źródło
padding
Oznaczamy%02d
za0
być poprzedzona aby długość2
:scala> val i = 9 i: Int = 9 scala> val paddedVal = f"${num}%02d" paddedVal: String = 09 scala> println(paddedVal) 09
źródło
val paddedVal = f"${num}%02d"
należy zmienićnum
nai
f"$num%02d"
(tutaj nie ma nawiasów)huynhjl pokonał mnie w prawidłowej odpowiedzi, więc oto alternatywa:
"0000000" + 123 takeRight 7
źródło
"0000000" + Int.MaxValue takeRight 7
=>7483647
. Chociaż „technicznie” poprawne przez dosłowną interpretację pytania, jest mało prawdopodobne, aby czytelnik nie chciał, aby wypełniona liczba przekraczała 7 cyfr, jeśli liczba jest tak duża.def leftPad(s: String, len: Int, elem: Char): String = { elem.toString * (len - s.length()) + s }
źródło
Jeśli to pytanie i odpowiedź stanie się kompendium kanonicznym,
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
źródło
Czy musisz radzić sobie z liczbami ujemnymi? Jeśli nie, po prostu zrobię
def str(i: Int) = (i % 10000000 + 10000000).toString.substring(1)
lub
def str(i: Int) = { val f = "000000" + i; f.substring(f.length() - 7) }
W przeciwnym razie możesz użyć
NumberFormat
:val nf = java.text.NumberFormat.getIntegerInstance(java.util.Locale.US) nf.setMinimumIntegerDigits(7) nf.setGroupingUsed(false) nf.format(-123)
źródło