ฉันจะแปลงความInt
ยาว 7 อักขระString
ให้123
กลายเป็นอักขระได้"0000123"
อย่างไร
ฉันจะแปลงความInt
ยาว 7 อักขระString
ให้123
กลายเป็นอักขระได้"0000123"
อย่างไร
คำตอบ:
ไลบรารี 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")
f"$a%07d"
(ถ้าคุณมีval
/ var
a
อยู่ในขอบเขต)
regex
string.replaceAll("\\G0", " ")
เพื่อแทนที่ศูนย์ที่มีช่องว่างนำบอกว่าที่นี่
"% 7d".format(123)
แล้วการใช้งาน
คำตอบสั้น ๆ :
"1234".reverse.padTo(7, '0').reverse
คำตอบยาว:
Scala StringOps (ซึ่งมีชุดวิธีการที่ดีที่อ็อบเจ็กต์สตริง Scala มีเนื่องจากการแปลงโดยนัย) มีpadTo
วิธีการซึ่งผนวกอักขระจำนวนหนึ่งเข้ากับสตริงของคุณ ตัวอย่างเช่น:
"aloha".padTo(10,'a')
จะกลับมา "alohaaaaaa". โปรดสังเกตว่าประเภทองค์ประกอบของ String คือ Char ดังนั้นเครื่องหมายคำพูดเดี่ยวรอบ ๆ'a'
.
ปัญหาของคุณคือที่แตกต่างกันเล็กน้อยเนื่องจากคุณจำเป็นต้องย่อหน้าตัวอักษรแทนการผนวกพวกเขา นั่นเป็นเหตุผลที่คุณต้องย้อนกลับสตริงเพิ่มอักขระเติมต่อท้าย (คุณจะต้องเติมอักขระไว้ล่วงหน้าในตอนนี้เนื่องจากสตริงถูกย้อนกลับ) จากนั้นย้อนกลับสิ่งทั้งหมดอีกครั้งเพื่อให้ได้ผลลัพธ์สุดท้าย
หวังว่านี่จะช่วยได้!
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
f"$num%02d"
(ไม่มีวงเล็บอยู่ที่นี่)
huynhjl เอาชนะฉันให้ได้คำตอบที่ถูกต้องดังนั้นนี่คือทางเลือก:
"0000000" + 123 takeRight 7
"0000000" + Int.MaxValue takeRight 7
7483647
แม้ว่า "ในทางเทคนิค" จะถูกต้องโดยการตีความตามตัวอักษรของคำถาม แต่ก็ไม่น่าเป็นไปได้ที่ผู้อ่านไม่ต้องการให้หมายเลขเบาะขยายเกิน 7 หลักหากตัวเลขมีขนาดใหญ่
def leftPad(s: String, len: Int, elem: Char): String = {
elem.toString * (len - s.length()) + s
}
ในกรณีที่ถาม & ตอบนี้กลายเป็นเอกสารสรุปตามรูปแบบบัญญัติ
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
คุณจำเป็นต้องจัดการกับจำนวนลบหรือไม่? ถ้าไม่ฉันก็จะทำ
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)