web-dev-qa-db-fra.com

Comment convertir un Int en String d'une longueur donnée avec des zéros non significatifs à aligner?

Comment puis-je convertir un Int en un String de 7 caractères, de sorte que 123 est transformé en "0000123"?

81
Ivan

La bibliothèque Java a une très bonne qualité - comme excellent) support du formatage de nombre qui est accessible depuis StringOps enrichi par la classe String:

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

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

Modifier le message Scala 2.10: comme suggéré par fommil, à partir de la version 2.10, il existe également un interpolateur de formatage (ne supporte pas la localisation):

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

Éditer avril 2019:

  • Si vous voulez des espaces de début, et non zéro, laissez simplement le 0 Dans le spécificateur de format. Dans le cas ci-dessus, il s'agirait de f"$expr%7d". Testé dans 2.12.8 REPL. Pas besoin de remplacer la chaîne comme suggéré dans un commentaire, ni même de mettre un espace explicite devant 7 Comme suggéré dans un autre commentaire.
  • Si la longueur est variable, s"%${len}d".format("123")
196
huynhjl

Réponse courte:

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

Réponse longue:

Scala StringOps (qui contient un ensemble de méthodes de Nice qui Scala en raison de conversions implicites) a une méthode padTo, qui ajoute un certain nombre de caractères de votre chaîne, par exemple:

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

Je reviendrai "alohaaaaaa". Notez que le type d'élément d'une chaîne est un caractère, d'où les guillemets simples autour du 'a'.

Votre problème est un peu différent car vous devez ajouter des caractères au lieu de ajouter leur. C'est pourquoi vous devez inverser la chaîne, ajouter les caractères de remplissage (vous les ajouterez maintenant puisque la chaîne est inversée), puis inverser le tout pour obtenir le résultat final.

J'espère que cela t'aides!

31
Pablo Fernandez

Le padding est noté par %02d pour 0 à préfixer pour obtenir la longueur 2:

scala> val i = 9 
i: Int = 9

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

scala> println(paddedVal)             
09
24
maxmithun

huynhjl m'a battu à la bonne réponse, alors voici une alternative:

"0000000" + 123 takeRight 7
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}
2
zeromem

Avez-vous besoin de composer avec des nombres négatifs? Si non, je ferais juste

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

ou

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

Sinon, vous pouvez utiliser NumberFormat:

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

Au cas où ce Q & A deviendrait le compendium canonique,

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
som-snytt