Comment puis-je convertir un Int
en un String
de 7 caractères, de sorte que 123
est transformé en "0000123"
?
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:
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.s"%${len}d".format("123")
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!
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
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
}
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)
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