Wie konvertiere ich ein Int in einen String einer bestimmten Länge mit führenden Nullen zum Ausrichten?

96

Wie kann ich ein Intin ein 7-Zeichen langes konvertieren String, damit daraus etwas 123wird "0000123"?

Ivan
quelle

Antworten:

219

Die Java-Bibliothek bietet eine ziemlich gute (wie auch hervorragende) Unterstützung für die Formatierung von Zahlen , auf die über die mit StringOps angereicherte String-Klasse zugegriffen werden kann :

scala> "%07d".format(123)
res5: String = 0000123

scala> "%07d".formatLocal(java.util.Locale.US, 123)
res6: String = 0000123

Beitrag bearbeiten Scala 2.10 : Wie von fommil vorgeschlagen, gibt es ab 2.10 auch einen Formatierungsstring-Interpolator (unterstützt keine Lokalisierung):

val expr = 123
f"$expr%07d"
f"${expr}%07d"

Bearbeiten April 2019:

  • Wenn Sie führende Leerzeichen und nicht Null möchten, lassen Sie 0das Format einfach aus dem Formatbezeichner weg . Im obigen Fall wäre es f"$expr%7d".Test in 2.12.8 REPL. Sie müssen die Zeichenfolge nicht wie in einem Kommentar vorgeschlagen ersetzen oder ein explizites Leerzeichen vor 7das in einem anderen Kommentar vorgeschlagene setzen.
  • Wenn die Länge variabel ist, s"%${len}d".format("123")
huynhjl
quelle
6
Ben, dhg, danke für die positiven Stimmen, ihr seid allerdings eine harte Menge! Ich denke, wir können noch etwas aus den anderen Antworten lernen, und das Abstimmungssystem kümmert sich darum, welche Antwort relevant ist.
Huynhjl
8
Sie müssen nicht so explizit sein, Sie können schreiben f"$a%07d"(wenn Sie einen val/ var ain-Bereich haben).
Fommil
1
@fommil, das war zwar noch nicht da, als ich die erste Antwort gepostet habe, aber ich würde jetzt auch den f-Interpolator verwenden, da er existiert.
Huynhjl
Wenn Sie führende Leerzeichen anstelle von führenden Nullen möchten , können Sie regex string.replaceAll("\\G0", " ")führende Nullen durch Leerzeichen ersetzen, wie hier angegeben
y2k-shubham
1
Wenn Sie führende Leerzeichen anstelle führender Nullen möchten , verwenden Sie "% 7d".format(123).
Erik van Oosten
36

Kurze Antwort:

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

Lange Antwort:

Scala StringOps (das eine Reihe von Methoden enthält, über die Scala-Zeichenfolgenobjekte aufgrund impliziter Konvertierungen verfügen) verfügt über eine padToMethode, mit der eine bestimmte Anzahl von Zeichen an Ihre Zeichenfolge angehängt wird. Beispielsweise:

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

Wird "alohaaaaaa" zurückgeben. Beachten Sie, dass der Elementtyp eines Strings ein Zeichen ist, daher die einfachen Anführungszeichen um das 'a'.

Ihr Problem ist etwas anders, da Sie Zeichen voranstellen müssen, anstatt sie anzuhängen . Aus diesem Grund müssen Sie die Zeichenfolge umkehren, die Füllzeichen anhängen (Sie würden sie jetzt voranstellen, da die Zeichenfolge umgekehrt ist) und dann das Ganze erneut umkehren, um das Endergebnis zu erhalten.

Hoffe das hilft!

Pablo Fernandez
quelle
14
Verwenden Sie .mkString, um sich wieder in einen String zu verwandeln
samthebest
2
oder benutze den Charakter 'a'
Lawrence Wagerfield
28

Das paddingwird mit bezeichnet, damit %02dfür 0die Länge ein Präfix vorangestellt wird 2:

scala> val i = 9 
i: Int = 9

scala> val paddedVal = f"${num}%02d"
paddedVal: String = 09

scala> println(paddedVal)             
09
Maxmithun
quelle
In dieser Zeile val paddedVal = f"${num}%02d"sollte numfüri
mjbsgll
f"$num%02d"(hier sind keine Klammern erforderlich)
Hartmut P.
9

huynhjl hat mich auf die richtige Antwort geschlagen, also hier eine Alternative:

"0000000" + 123 takeRight 7
Luigi Plinge
quelle
Dies schlägt bei Zahlen größer als 10M fehl: "0000000" + Int.MaxValue takeRight 7=> 7483647. Obwohl dies durch die wörtliche Interpretation der Frage "technisch" korrekt ist, ist es unwahrscheinlich, dass der Leser nicht möchte, dass die aufgefüllte Zahl über 7 Stellen hinausgeht, wenn die Zahl so groß ist.
Emil Lundberg
Man könnte sagen, diese Lösung ist besser, da zumindest die Ziffern in diesem speziellen Fall im Gegensatz zur akzeptierten Lösung immer noch korrekt ausgerichtet sind. Der springende Punkt der Frage ist, die Ziffern richtig auszurichten.
Luigi Plinge
3
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}
zeromem
quelle
1

Falls diese Fragen und Antworten zum kanonischen Kompendium werden,

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
quelle
1

Müssen Sie mit negativen Zahlen umgehen? Wenn nicht, würde ich es einfach tun

def str(i: Int) = (i % 10000000 + 10000000).toString.substring(1)

oder

def str(i: Int) = { val f = "000000" + i; f.substring(f.length() - 7) }

Andernfalls können Sie Folgendes verwenden NumberFormat:

val nf = java.text.NumberFormat.getIntegerInstance(java.util.Locale.US)
nf.setMinimumIntegerDigits(7)
nf.setGroupingUsed(false)
nf.format(-123)
0__
quelle