¿Cómo puedo convertir un Int
a 7 caracteres de largo String
, para que 123
se 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:
0
del 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 7
como se sugiere en otro comentario.s"%${len}d".format("123")
f"$a%07d"
(si tiene un alcance val
/ var
a
in).
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 padTo
mé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 padding
se denota por %02d
para 0
tener 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 num
pori
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)