Jak przekonwertować Int na String o określonej długości z wiodącymi zerami do wyrównania?

99

Jak mogę zamienić an Intna 7-znakowe String, aby 123zostało zamienione na "0000123"?

Ivan
źródło

Odpowiedzi:

224

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 0ze 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, 7jak zasugerowano w innym komentarzu.
  • Jeśli długość jest zmienna, s"%${len}d".format("123")
huynhjl
źródło
6
Ben, dhg, dzięki za głosy poparcia, jesteście jednak twardym tłumem! Myślę, że nadal możemy się czegoś nauczyć z innych odpowiedzi, a system głosowania dba o to, która odpowiedź jest odpowiednia.
huynhjl
8
nie musisz być tak wyraźny, możesz pisać f"$a%07d"(jeśli masz val/ var aw zakresie).
fommil
1
@fommil, rzeczywiście, nie było go tam, kiedy opublikowałem początkową odpowiedź, ale użyłbym również interpolatora f teraz, gdy istnieje.
huynhjl
Jeśli chcesz początkowe spacje zamiast wiodących zer , możesz użyć regex string.replaceAll("\\G0", " ")do zastąpienia wiodących zer spacjami, jak powiedziano tutaj
y2k-shubham
1
Jeśli chcesz używać spacji wiodących zamiast zer wiodących, użyj "% 7d".format(123).
Erik van Oosten
36

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 padTometodę, 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!

Pablo Fernandez
źródło
14
Użyj .mkString, aby zamienić się z powrotem w ciąg
samthebest
2
lub użyj znaku „a”
Lawrence Wagerfield
30

paddingOznaczamy %02dza 0być 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
maxmithun
źródło
W tej linii val paddedVal = f"${num}%02d"należy zmienić numnai
mjbsgll
f"$num%02d"(tutaj nie ma nawiasów)
Hartmut P.
9

huynhjl pokonał mnie w prawidłowej odpowiedzi, więc oto alternatywa:

"0000000" + 123 takeRight 7
Luigi Plinge
źródło
To się nie powiedzie dla liczb większych niż 10M: "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.
Emil Lundberg
Cóż, można powiedzieć, że to rozwiązanie jest lepsze, ponieważ przynajmniej cyfry są nadal poprawnie wyrównane w tym konkretnym przypadku, w przeciwieństwie do przyjętego rozwiązania. Cały problem polega na tym, aby cyfry były odpowiednio wyrównane.
Luigi Plinge
3
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}
zeromem
źródło
1

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
som-snytt
źródło
1

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)
0__
źródło