Risposte:
La libreria Java ha un supporto per la formattazione dei numeri abbastanza buono (come in eccellente) accessibile dalla classe String arricchita di StringOps :
scala> "%07d".format(123)
res5: String = 0000123
scala> "%07d".formatLocal(java.util.Locale.US, 123)
res6: String = 0000123
Modifica post Scala 2.10 : come suggerito da fommil, dalla 2.10 in poi, c'è anche un interpolatore di stringhe di formattazione (non supporta la localizzazione):
val expr = 123
f"$expr%07d"
f"${expr}%07d"
Modifica aprile 2019:
0
dall'identificatore di formato. Nel caso precedente, sarebbe f"$expr%7d"
.Testato in 2.12.8 REPL. Non è necessario eseguire la sostituzione della stringa come suggerito in un commento, o anche mettere uno spazio esplicito davanti 7
come suggerito in un altro commento.s"%${len}d".format("123")
f"$a%07d"
(se hai un ambito val
/ var
a
).
regex
string.replaceAll("\\G0", " ")
per sostituire gli zeri con gli spazi che porta come detto qui
"% 7d".format(123)
.
Risposta breve:
"1234".reverse.padTo(7, '0').reverse
Risposta lunga:
Scala StringOps (che contiene un bel set di metodi che gli oggetti stringa Scala hanno a causa delle conversioni implicite) ha un padTo
metodo, che aggiunge una certa quantità di caratteri alla stringa. Per esempio:
"aloha".padTo(10,'a')
Ritorneremo "alohaaaaaa". Nota che il tipo di elemento di una stringa è un carattere, quindi le virgolette singole attorno a 'a'
.
Il tuo problema è leggermente diverso poiché devi anteporre i caratteri invece di aggiungerli . Ecco perché è necessario invertire la stringa, aggiungere i caratteri di riempimento (li dovresti anteporre ora poiché la stringa è invertita), quindi invertire di nuovo l'intera cosa per ottenere il risultato finale.
Spero che questo ti aiuti!
Il padding
è indicato da %02d
per 0
essere prefisso per rendere la lunghezza 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"
dovrebbe essere il cambio num
peri
f"$num%02d"
(non sono necessarie parentesi qui)
huynhjl mi ha battuto alla risposta giusta, quindi ecco un'alternativa:
"0000000" + 123 takeRight 7
"0000000" + Int.MaxValue takeRight 7
=> 7483647
. Sebbene "tecnicamente" corretto dall'interpretazione letterale della domanda, è improbabile che il lettore non voglia che il numero riempito si estenda oltre le 7 cifre se il numero è così grande.
Nel caso in cui questa domanda e risposta diventi il compendio canonico,
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
Hai bisogno di gestire numeri negativi? In caso contrario, lo farei e basta
def str(i: Int) = (i % 10000000 + 10000000).toString.substring(1)
o
def str(i: Int) = { val f = "000000" + i; f.substring(f.length() - 7) }
Altrimenti puoi usare NumberFormat
:
val nf = java.text.NumberFormat.getIntegerInstance(java.util.Locale.US)
nf.setMinimumIntegerDigits(7)
nf.setGroupingUsed(false)
nf.format(-123)