Antworten:
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:
0
das 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 7
das in einem anderen Kommentar vorgeschlagene setzen.s"%${len}d".format("123")
f"$a%07d"
(wenn Sie einen val
/ var
a
in-Bereich haben).
regex
string.replaceAll("\\G0", " ")
führende Nullen durch Leerzeichen ersetzen, wie hier angegeben
"% 7d".format(123)
.
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 padTo
Methode, 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!
Das padding
wird mit bezeichnet, damit %02d
für 0
die 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
val paddedVal = f"${num}%02d"
sollte num
füri
f"$num%02d"
(hier sind keine Klammern erforderlich)
huynhjl hat mich auf die richtige Antwort geschlagen, also hier eine Alternative:
"0000000" + 123 takeRight 7
"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.
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
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)