วิธีการแปลง Int เป็นสตริงของความยาวที่กำหนดโดยมีศูนย์นำหน้าเพื่อจัดแนว?


คำตอบ:


228

ไลบรารี Java มีการสนับสนุนการจัดรูปแบบตัวเลขที่ค่อนข้างดี (เช่นเดียวกับที่ยอดเยี่ยม) ซึ่งสามารถเข้าถึงได้จากคลาส StringOps ที่เสริมสร้าง:

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

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

แก้ไขโพสต์ Scala 2.10 : ตามที่ fommil แนะนำตั้งแต่ 2.10 เป็นต้นไปนอกจากนี้ยังมีตัวแปลสตริงการจัดรูปแบบ (ไม่รองรับการแปล):

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

แก้ไขเมษายน 2019:

  • หากคุณต้องการเว้นวรรคนำหน้าไม่ใช่ศูนย์ให้เว้น0จากตัวระบุรูปแบบ ในกรณีข้างต้นจะเป็นf"$expr%7d". ทดสอบใน 2.12.8 REPL ไม่จำเป็นต้องทำการแทนที่สตริงตามที่แนะนำในความคิดเห็นหรือแม้แต่ใส่ช่องว่างที่ชัดเจนไว้ข้างหน้า7ตามที่แนะนำในความคิดเห็นอื่น
  • หากความยาวเป็นตัวแปร s"%${len}d".format("123")

6
เบ็น dhg ขอบคุณสำหรับการโหวตเพิ่มพวกคุณเป็นฝูงชนที่แข็งแกร่ง! ฉันคิดว่าเรายังสามารถเรียนรู้บางอย่างจากคำตอบอื่น ๆ ได้และระบบการลงคะแนนจะดูแลว่าคำตอบใดเกี่ยวข้อง
huynhjl

8
คุณไม่จำเป็นต้องชัดเจนขนาดนี้คุณสามารถเขียนได้f"$a%07d"(ถ้าคุณมีval/ var aอยู่ในขอบเขต)
fommil

1
@fommil นั่นยังไม่มีตอนที่ฉันโพสต์คำตอบเริ่มต้น แต่ตอนนี้ฉันก็จะใช้ f interpolator ด้วยเช่นกัน
huynhjl

หากคุณต้องการนำพื้นที่แทนศูนย์ชั้นนำแล้วคุณสามารถใช้regex string.replaceAll("\\G0", " ")เพื่อแทนที่ศูนย์ที่มีช่องว่างนำบอกว่าที่นี่
Y2K-shubham

1
หากคุณต้องการช่องว่างนำแทนศูนย์ชั้นนำ"% 7d".format(123)แล้วการใช้งาน
Erik van Oosten

37

คำตอบสั้น ๆ :

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

คำตอบยาว:

Scala StringOps (ซึ่งมีชุดวิธีการที่ดีที่อ็อบเจ็กต์สตริง Scala มีเนื่องจากการแปลงโดยนัย) มีpadToวิธีการซึ่งผนวกอักขระจำนวนหนึ่งเข้ากับสตริงของคุณ ตัวอย่างเช่น:

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

จะกลับมา "alohaaaaaa". โปรดสังเกตว่าประเภทองค์ประกอบของ String คือ Char ดังนั้นเครื่องหมายคำพูดเดี่ยวรอบ ๆ'a'.

ปัญหาของคุณคือที่แตกต่างกันเล็กน้อยเนื่องจากคุณจำเป็นต้องย่อหน้าตัวอักษรแทนการผนวกพวกเขา นั่นเป็นเหตุผลที่คุณต้องย้อนกลับสตริงเพิ่มอักขระเติมต่อท้าย (คุณจะต้องเติมอักขระไว้ล่วงหน้าในตอนนี้เนื่องจากสตริงถูกย้อนกลับ) จากนั้นย้อนกลับสิ่งทั้งหมดอีกครั้งเพื่อให้ได้ผลลัพธ์สุดท้าย

หวังว่านี่จะช่วยได้!


14
ใช้. mkString เพื่อเปลี่ยนกลับเป็นสตริง
samthebest

2
หรือใช้อักขระ 'a'
Lawrence Wagerfield

30

paddingจะเขียนแทนด้วย%02dสำหรับการ0ที่จะนำหน้าเพื่อให้ความยาว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"ควรเปลี่ยนnumสำหรับi
mjbsgll

f"$num%02d"(ไม่มีวงเล็บอยู่ที่นี่)
Hartmut P.

9

huynhjl เอาชนะฉันให้ได้คำตอบที่ถูกต้องดังนั้นนี่คือทางเลือก:

"0000000" + 123 takeRight 7

นี้จะล้มเหลวสำหรับตัวเลขที่มากกว่า 10M: =>"0000000" + Int.MaxValue takeRight 7 7483647แม้ว่า "ในทางเทคนิค" จะถูกต้องโดยการตีความตามตัวอักษรของคำถาม แต่ก็ไม่น่าเป็นไปได้ที่ผู้อ่านไม่ต้องการให้หมายเลขเบาะขยายเกิน 7 หลักหากตัวเลขมีขนาดใหญ่
Emil Lundberg

คุณสามารถพูดได้ว่าโซลูชันนี้ดีกว่าเพราะอย่างน้อยตัวเลขก็ยังคงถูกจัดตำแหน่งอย่างถูกต้องในกรณีนั้นซึ่งแตกต่างจากโซลูชันที่ยอมรับ ประเด็นทั้งหมดของคำถามคือการทำให้ตัวเลขอยู่ในแนวเดียวกัน
Luigi Plinge


1

ในกรณีที่ถาม & ตอบนี้กลายเป็นเอกสารสรุปตามรูปแบบบัญญัติ

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

คุณจำเป็นต้องจัดการกับจำนวนลบหรือไม่? ถ้าไม่ฉันก็จะทำ

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

หรือ

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

มิฉะนั้นคุณสามารถใช้NumberFormat:

val nf = java.text.NumberFormat.getIntegerInstance(java.util.Locale.US)
nf.setMinimumIntegerDigits(7)
nf.setGroupingUsed(false)
nf.format(-123)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.