Bir Int'i hizalamak için önde gelen sıfırlarla belirli bir uzunluktaki bir String'e nasıl dönüştürebilirim?


101

IntBir 7 karakter uzunluğuna nasıl dönüştürebilirim Stringki 123bu hale dönüştürülür "0000123"?

Yanıtlar:


228

Java kitaplığı, StringOps ile zenginleştirilmiş String sınıfından erişilebilen oldukça iyi (mükemmel olduğu gibi) sayı biçimlendirme desteğine sahiptir :

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

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

Scala 2.10 postasını düzenle : fommil tarafından önerildiği gibi, 2.10'dan itibaren, bir biçimlendirme dizesi interpolatörü de vardır (yerelleştirmeyi desteklemez):

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

Nisan 2019'u düzenleyin:

  • Baştaki boşluklar istiyorsanız ve sıfır değil 0, biçim belirticisini atlayın. Yukarıdaki durumda, f"$expr%7d"2.12.8 REPL'de test edilecektir . Bir yorumda önerildiği gibi dize değişimini yapmaya veya hatta 7başka bir yorumda önerildiği gibi önüne açık bir boşluk koymaya gerek yoktur .
  • Uzunluk değişken ise, s"%${len}d".format("123")

6
Ben, dhg, olumlu oylar için teşekkürler, yine de zorlu bir kalabalıksınız! Sanırım diğer cevaplardan hala bir şeyler öğrenebiliriz ve oylama sistemi hangi cevabın alakalı olduğuna bakar.
huynhjl

8
bu kadar açık olmanıza gerek yok, yazabilirsiniz f"$a%07d"(eğer bir val/ var akapsamınız varsa).
fommil

1
@fommil, aslında, ilk cevabı gönderdiğimde henüz orada değildi, ama şimdi var olduğuna göre f interpolatörünü de kullanacağım.
huynhjl

İsterseniz lider boşluklar yerine gelen sıfırları o zaman kullanabilirsiniz regex string.replaceAll("\\G0", " ")söylediği gibi alanlar ile başta sıfırları yerine burada
y2k-Shubham

1
Baştaki sıfırlar yerine boşluklar istiyorsanız , o zaman kullanın . "% 7d".format(123)
Erik van Oosten

37

Kısa cevap:

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

Uzun cevap:

Scala StringOps (örtük dönüştürmeler nedeniyle Scala dize nesnelerinin sahip olduğu güzel bir yöntem kümesini içerir) dizenizepadTo belirli miktarda karakter ekleyen bir yönteme sahiptir . Örneğin:

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

"Alohaaaaaa" döndürür. Bir String öğesinin öğe türünün bir Char olduğuna dikkat edin, bu nedenle 'a'.

Gerekirse beri senin sorunun biraz farklı öne eklemek yerine karakterleri ekleme onları. Bu nedenle, dizeyi tersine çevirmeniz, doldurma karakterlerini eklemeniz (dize ters çevrildiği için şimdi bunları başına ekleyeceksiniz) ve ardından nihai sonucu almak için her şeyi yeniden tersine çevirmeniz gerekir.

Bu yardımcı olur umarım!


14
Bir dizeye geri dönmek için .mkString kullanın
samthebest

2
veya 'a' karakterini kullanın
Lawrence Wagerfield

30

paddingİle gösterilir %02diçin 0uzunluğunu yapmak için önceden sabitlenmiş olması 2:

scala> val i = 9 
i: Int = 9

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

scala> println(paddedVal)             
09

Bu satırda val paddedVal = f"${num}%02d"değişiklik olmalı numiçini
mjbsgll

f"$num%02d"(burada parantez yok)
Hartmut P.

9

huynhjl beni doğru cevaba kadar dövdü, işte bir alternatif:

"0000000" + 123 takeRight 7

Bu, 10M'den büyük sayılar için başarısız olur: "0000000" + Int.MaxValue takeRight 7=> 7483647. Sorunun gerçek yorumuyla "teknik olarak" doğru olsa da, okuyucunun sayı bu kadar büyükse doldurulmuş sayının 7 haneyi geçmesini istememesi olası değildir.
Emil Lundberg

Pekala, bu çözümün daha iyi olduğunu söyleyebilirsin, çünkü kabul edilen çözümün aksine, en azından rakamlar o özel durumda hala doğru şekilde hizalı. Sorunun tüm amacı, rakamların doğru şekilde hizalanmasıdır.
Luigi Plinge

3
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}

1

Bu Soru-Cevap kanonik özet haline gelirse,

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

1

Negatif sayılarla uğraşmanız gerekiyor mu? Değilse, sadece yapardım

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

veya

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

Aksi takdirde şunları kullanabilirsiniz NumberFormat:

val nf = java.text.NumberFormat.getIntegerInstance(java.util.Locale.US)
nf.setMinimumIntegerDigits(7)
nf.setGroupingUsed(false)
nf.format(-123)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.