Respostas:
A biblioteca Java tem um suporte de formatação de número muito bom (como excelente) que é acessível a partir da classe String enriquecida com StringOps :
scala> "%07d".format(123)
res5: String = 0000123
scala> "%07d".formatLocal(java.util.Locale.US, 123)
res6: String = 0000123
Editar pós Scala 2.10 : conforme sugerido por fommil, a partir de 2.10, também existe um interpolador de string de formatação (não suporta localização):
val expr = 123
f"$expr%07d"
f"${expr}%07d"
Editar abril de 2019:
0
do especificador de formato. No caso acima, seria f"$expr%7d"
.Testado em 2.12.8 REPL. Não há necessidade de fazer a substituição da string como sugerido em um comentário, ou mesmo colocar um espaço explícito na frente de 7
como sugerido em outro comentário.s"%${len}d".format("123")
f"$a%07d"
(se tiver um val
/ var
a
no escopo).
regex
string.replaceAll("\\G0", " ")
para substituir zeros à esquerda com espaços como dito aqui
"% 7d".format(123)
.
Resposta curta:
"1234".reverse.padTo(7, '0').reverse
Resposta longa:
Scala StringOps (que contém um bom conjunto de métodos que os objetos string Scala possuem por causa das conversões implícitas) tem um padTo
método que anexa uma certa quantidade de caracteres à sua string. Por exemplo:
"aloha".padTo(10,'a')
Retornará "alohaaaaaa". Observe que o tipo de elemento de uma String é um Char, portanto, as aspas simples ao redor de 'a'
.
Seu problema é um pouco diferente, pois você precisa preceder caracteres em vez de acrescentar los. É por isso que você precisa inverter a string, acrescentar os caracteres de preenchimento (você os estaria acrescentando agora, já que a string está invertida) e, em seguida, reverter tudo novamente para obter o resultado final.
Espero que isto ajude!
O padding
é denotado por %02d
para 0
ser prefixado para fazer o comprimento 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"
deve ser alterado num
parai
f"$num%02d"
(sem colchetes necessários aqui)
huynhjl chegou antes de mim na resposta certa, então aqui está uma alternativa:
"0000000" + 123 takeRight 7
"0000000" + Int.MaxValue takeRight 7
=> 7483647
. Embora "tecnicamente" correto pela interpretação literal da pergunta, é improvável que o leitor não queira que o número preenchido ultrapasse 7 dígitos se o número for tão grande.
Caso este Q&A se torne o compêndio 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
Você precisa lidar com números negativos? Se não, eu apenas faria
def str(i: Int) = (i % 10000000 + 10000000).toString.substring(1)
ou
def str(i: Int) = { val f = "000000" + i; f.substring(f.length() - 7) }
Caso contrário, você pode usar NumberFormat
:
val nf = java.text.NumberFormat.getIntegerInstance(java.util.Locale.US)
nf.setMinimumIntegerDigits(7)
nf.setGroupingUsed(false)
nf.format(-123)