¿Cómo puedo convertir un Inta 7 caracteres de largo String, para que 123se convierta en "0000123"?
Respuestas:
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:
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.s"%${len}d".format("123")f"$a%07d"(si tiene un alcance val/ var ain).
regex string.replaceAll("\\G0", " ")para reemplazar ceros con espacios iniciales según lo dicho aquí
"% 7d".format(123).
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!
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
val paddedVal = f"${num}%02d"debería cambiarse numpori
f"$num%02d"(no se necesitan corchetes aquí)
huynhjl me adelantó para dar la respuesta correcta, así que aquí hay una alternativa:
"0000000" + 123 takeRight 7
"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.
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
¿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)