Come convertire un Int in una stringa di una determinata lunghezza con zeri iniziali da allineare?


97

Come posso convertire una Intlunghezza di 7 caratteri String, in modo che 123venga trasformata in "0000123"?

Risposte:


220

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:

  • Se vuoi spazi iniziali, e non zero, lascia fuori 0dall'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 7come suggerito in un altro commento.
  • Se la lunghezza è variabile, s"%${len}d".format("123")

6
Ben, dhg, grazie per i voti positivi, voi ragazzi siete una folla dura però! Penso che possiamo ancora imparare qualcosa dalle altre risposte e il sistema di voto si occupa di quale risposta è rilevante.
huynhjl

8
non è necessario che tu sia così esplicito, puoi scrivere f"$a%07d"(se hai un ambito val/ var a).
fommil

1
@fommil, infatti, non c'era ancora quando ho postato la risposta iniziale, ma userei anche l'interpolatore f ora che esiste.
huynhjl

Se si vuole che porta gli spazi invece di zeri quindi è possibile utilizzare regex string.replaceAll("\\G0", " ")per sostituire gli zeri con gli spazi che porta come detto qui
Y2K-shubham

1
Se vuoi spazi iniziali invece di zeri iniziali, usa "% 7d".format(123).
Erik van Oosten

36

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 padTometodo, 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!


14
Usa .mkString per trasformare nuovamente in una stringa
samthebest

2
oppure usa il carattere "a"
Lawrence Wagerfield

29

Il paddingè indicato da %02dper 0essere 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

In questa riga val paddedVal = f"${num}%02d"dovrebbe essere il cambio numperi
mjbsgll

f"$num%02d"(non sono necessarie parentesi qui)
Hartmut P.

9

huynhjl mi ha battuto alla risposta giusta, quindi ecco un'alternativa:

"0000000" + 123 takeRight 7

Questo fallirà per i numeri maggiori di 10M: "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.
Emil Lundberg

Bene, potresti dire che questa soluzione è migliore perché almeno le cifre sono ancora correttamente allineate in quel caso particolare, a differenza della soluzione accettata. Il punto centrale della domanda è allineare correttamente le cifre.
Luigi Plinge

3
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}

1

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

1

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.