Bagaimana cara mengubah Int menjadi String dengan panjang tertentu dengan nol di depan untuk menyelaraskan?

98

Bagaimana cara mengubah panjang Intmenjadi 7 karakter String, sehingga 123diubah menjadi "0000123"?

Ivan
sumber

Jawaban:

221

Pustaka Java memiliki dukungan pemformatan angka yang cukup bagus (seperti sangat baik) yang dapat diakses dari kelas String yang diperkaya StringOps :

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

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

Edit posting Scala 2.10 : seperti yang disarankan oleh fommil, dari 2.10 ke atas, ada juga interpolator string format (tidak mendukung pelokalan):

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

Sunting Apr 2019:

  • Jika Anda menginginkan spasi di depan, dan bukan nol, biarkan saja 0dari penentu format. Dalam kasus di atas, itu akan f"$expr%7d".Diuji di 2.12.8 REPL. Tidak perlu melakukan penggantian string seperti yang disarankan dalam komentar, atau bahkan meletakkan spasi eksplisit di depan 7seperti yang disarankan dalam komentar lain.
  • Jika panjangnya bervariasi, s"%${len}d".format("123")
huynhjl
sumber
6
Ben, dhg, terima kasih atas upvote-nya, kalian adalah orang yang tangguh! Saya pikir kita masih bisa belajar sesuatu dari jawaban lain, dan sistem pemungutan suara menangani jawaban mana yang relevan.
huynhjl
8
Anda tidak perlu terlalu eksplisit, Anda dapat menulis f"$a%07d"(jika Anda memiliki val/ var adalam cakupan).
fommil
1
@fommil, memang, itu belum ada ketika saya memposting jawaban awal, tetapi saya juga akan menggunakan interpolator f yang sekarang sudah ada.
huynhjl
Jika Anda ingin memimpin ruang bukan nol terkemuka maka Anda dapat menggunakan regex string.replaceAll("\\G0", " ")untuk menggantikan nol dengan spasi terkemuka seperti yang diceritakan di sini
y2k-shubham
1
Jika Anda ingin spasi di depan dan bukan di depan nol, maka gunakan "% 7d".format(123).
Erik van Oosten
36

Jawaban singkat:

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

Jawaban panjang:

Scala StringOps (yang berisi sekumpulan metode bagus yang dimiliki objek string Scala karena konversi implisit) memiliki padTometode, yang menambahkan sejumlah karakter ke string Anda. Sebagai contoh:

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

Akan mengembalikan "alohaaaaaa". Perhatikan jenis elemen String adalah Char, maka tanda kutip tunggal di sekitar 'a'.

Masalah Anda sedikit berbeda karena Anda perlu menambahkan karakter daripada menambahkannya . Itulah mengapa Anda perlu membalikkan string, menambahkan karakter pengisi (Anda akan membuatnya sekarang karena string dibalik), dan kemudian membalikkan semuanya lagi untuk mendapatkan hasil akhir.

Semoga ini membantu!

Pablo Fernandez
sumber
14
Gunakan .mkString untuk kembali ke dalam string
samthebest
2
atau gunakan karakter 'a'
Lawrence Wagerfield
29

Itu paddingdilambangkan dengan %02duntuk 0menjadi diawali untuk membuat panjang 2:

scala> val i = 9 
i: Int = 9

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

scala> println(paddedVal)             
09
maxmithun
sumber
Pada baris ini val paddedVal = f"${num}%02d"harus diubah numuntuki
mjbsgll
f"$num%02d"(tidak perlu tanda kurung di sini)
Hartmut P.
9

huynhjl mengalahkan saya dengan jawaban yang benar, jadi inilah alternatifnya:

"0000000" + 123 takeRight 7
Luigi Plinge
sumber
Ini akan gagal untuk angka yang lebih besar dari 10M: "0000000" + Int.MaxValue takeRight 7=> 7483647. Meskipun "secara teknis" benar dengan interpretasi literal dari pertanyaan tersebut, kecil kemungkinan pembaca tidak ingin nomor yang diisi melebihi 7 digit jika angkanya sebesar itu.
Emil Lundberg
Anda dapat mengatakan solusi ini lebih baik karena setidaknya angka masih selaras dengan benar dalam kasus tertentu, tidak seperti solusi yang diterima. Inti dari pertanyaan ini adalah membuat angka sejajar dengan benar.
Luigi Plinge
3
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}
zeromem
sumber
1

Jika Tanya Jawab ini menjadi ringkasan kanonik,

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
sumber
1

Apakah Anda perlu menangani angka negatif? Jika tidak, saya akan melakukannya

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

atau

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

Jika tidak, Anda dapat menggunakan NumberFormat:

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