¿Cómo convertir un int en una cadena de una longitud determinada con ceros a la izquierda para alinear?

Respuestas:

221

La biblioteca de Java tiene bastante buen (como en excelente) soporte de formato de número al que se puede acceder desde la clase String enriquecida con StringOps :

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

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

Edite la publicación Scala 2.10 : como sugiere fommil, a partir de 2.10, también hay un interpolador de cadenas de formato (no admite la localización):

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

Editar abril de 2019:

  • Si desea espacios iniciales, y no cero, simplemente omita el 0del especificador de formato. En el caso anterior, se f"$expr%7d"probaría en 2.12.8 REPL. No es necesario hacer el reemplazo de la cadena como se sugiere en un comentario, o incluso poner un espacio explícito delante de 7como se sugiere en otro comentario.
  • Si la longitud es variable, s"%${len}d".format("123")
huynhjl
fuente
6
Ben, dhg, gracias por los votos a favor, ¡ustedes son una multitud difícil! Creo que todavía podemos aprender algo de las otras respuestas, y el sistema de votación se encarga de qué respuesta es relevante.
huynhjl
8
no necesita ser tan explícito, puede escribir f"$a%07d"(si tiene un alcance val/ var ain).
fommil
1
@fommil, de hecho, aún no estaba allí cuando publiqué la respuesta inicial, pero también usaría el interpolador f ahora que existe.
huynhjl
Si desea que conduce espacios en lugar de ceros a la izquierda , entonces puede utilizar regex string.replaceAll("\\G0", " ")para reemplazar ceros con espacios iniciales según lo dicho aquí
y2k-shubham
1
Si desea espacios iniciales en lugar de ceros iniciales , utilice "% 7d".format(123).
Erik van Oosten
36

Respuesta corta:

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

Respuesta larga:

Scala StringOps (que contiene un buen conjunto de métodos que tienen los objetos de cadena de Scala debido a conversiones implícitas) tiene un padTométodo que agrega una cierta cantidad de caracteres a su cadena. Por ejemplo:

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

Volverá "alohaaaaaa". Tenga en cuenta que el tipo de elemento de una cadena es un Char, de ahí las comillas simples alrededor de 'a'.

Su problema es un poco diferente ya que necesita anteponer caracteres en lugar de añadirlos . Es por eso que necesita revertir la cadena, agregar los caracteres de relleno (los estaría anteponiendo ahora ya que la cadena está invertida) y luego revertir todo nuevamente para obtener el resultado final.

¡Espero que esto ayude!

Pablo fernandez
fuente
14
Utilice .mkString para volver a convertirse en una cadena
samthebest
2
o use el carácter 'a'
Lawrence Wagerfield
29

El paddingse denota por %02dpara 0tener el prefijo para hacer la longitud 2:

scala> val i = 9 
i: Int = 9

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

scala> println(paddedVal)             
09
maxmithun
fuente
En esta línea val paddedVal = f"${num}%02d"debería cambiarse numpori
mjbsgll
f"$num%02d"(no se necesitan corchetes aquí)
Hartmut P.
9

huynhjl me adelantó para dar la respuesta correcta, así que aquí hay una alternativa:

"0000000" + 123 takeRight 7
Luigi Plinge
fuente
Esto fallará para números superiores a 10M: "0000000" + Int.MaxValue takeRight 7=> 7483647. Si bien es "técnicamente" correcto por la interpretación literal de la pregunta, es poco probable que el lector no quiera que el número rellenado se extienda más allá de los 7 dígitos si el número es tan grande.
Emil Lundberg
Bueno, se podría decir que esta solución es mejor porque al menos los dígitos todavía están alineados correctamente en ese caso particular, a diferencia de la solución aceptada. El objetivo de la pregunta es hacer que los dígitos se alineen correctamente.
Luigi Plinge
3
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}
zeromem
fuente
1

En caso de que estas preguntas y respuestas se conviertan en el compendio canónico,

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

¿Necesitas lidiar con números negativos? Si no, simplemente lo haría

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

o

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

De lo contrario, puede utilizar NumberFormat:

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