Làm thế nào để chuyển đổi một Int thành một chuỗi có độ dài nhất định với các số 0 ở đầu để căn chỉnh?


97

Làm cách nào để chuyển một Intký tự dài thành 7 ký tự String, để 123chuyển thành ký tự "0000123"?

Câu trả lời:


220

Thư viện Java có hỗ trợ định dạng số khá tốt (như là tuyệt vời) có thể truy cập được từ lớp String được làm giàu StringOps :

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

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

Chỉnh sửa bài đăng Scala 2.10 : theo đề xuất của fommil, từ 2.10 trở đi, cũng có bộ nội suy chuỗi định dạng (không hỗ trợ bản địa hóa):

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

Chỉnh sửa tháng 4 năm 2019:

  • Nếu bạn muốn khoảng trắng ở đầu chứ không phải số 0, chỉ cần bỏ đi 0từ công cụ định dạng. Trong trường hợp trên, nó sẽ được f"$expr%7d"Kiểm tra trong 2.12.8 REPL. Không cần thực hiện thay thế chuỗi như được đề xuất trong một nhận xét, hoặc thậm chí đặt một khoảng trắng rõ ràng trước 7như được đề xuất trong một nhận xét khác.
  • Nếu độ dài thay đổi, s"%${len}d".format("123")

6
Ben, dhg, cảm ơn vì sự ủng hộ, mặc dù vậy, các bạn là một đám đông cứng rắn! Tôi nghĩ rằng chúng ta vẫn có thể học được điều gì đó từ các câu trả lời khác và hệ thống bỏ phiếu sẽ xem xét câu trả lời nào phù hợp.
huynhjl 15/11/11

8
bạn không cần phải nói rõ điều này, bạn có thể viết f"$a%07d"(nếu bạn có val/ var atrong phạm vi).
fommil,

1
@fommil, thực sự, điều đó vẫn chưa có khi tôi đăng câu trả lời ban đầu, nhưng tôi cũng sẽ sử dụng bộ nội suy f khi nó tồn tại.
huynhjl

Nếu bạn muốn lãnh đạo không gian thay vì số không hàng đầu sau đó bạn có thể sử dụng regex string.replaceAll("\\G0", " ")để thay thế số không với không gian hàng đầu như đã nói ở đây
Y2K-Shubham

1
Nếu bạn muốn dấu cách ở đầu thay vì số 0 ở đầu thì hãy sử dụng "% 7d".format(123).
Erik van Oosten

36

Câu trả lời ngắn:

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

Câu trả lời dài:

Scala StringOps (chứa một tập hợp các phương thức tuyệt vời mà các đối tượng chuỗi Scala có được do các chuyển đổi ngầm định) có một padTophương thức gắn một lượng ký tự nhất định vào chuỗi của bạn. Ví dụ:

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

Sẽ trở lại "alohaaaaaa". Lưu ý rằng loại phần tử của Chuỗi là Char, do đó các dấu ngoặc kép xung quanh'a' .

Vấn đề của bạn hơi khác một chút vì bạn cần thêm các ký tự trước thay vì thêm vào chúng. Đó là lý do tại sao bạn cần đảo ngược chuỗi, nối các ký tự điền vào (bạn sẽ thêm chúng ngay bây giờ vì chuỗi được đảo ngược), rồi đảo ngược lại toàn bộ để có kết quả cuối cùng.

Hi vọng điêu nay co ich!


14
Sử dụng .mkString để biến trở lại thành một chuỗi
samthebest

2
hoặc sử dụng ký tự 'a'
Lawrence Wagerfield

28

paddinghiệu là %02dfor 0được đặt tiền tố để tạo độ dài 2:

scala> val i = 9 
i: Int = 9

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

scala> println(paddedVal)             
09

Trong dòng này val paddedVal = f"${num}%02d"nên được thay đổi numchoi
mjbsgll

f"$num%02d"(không cần dấu ngoặc ở đây)
Hartmut P.

9

huynhjl đánh cho tôi câu trả lời đúng, vì vậy đây là một giải pháp thay thế:

"0000000" + 123 takeRight 7

Điều này sẽ không thành công đối với các số lớn hơn 10M: "0000000" + Int.MaxValue takeRight 7=> 7483647. Mặc dù đúng "về mặt kỹ thuật" theo cách hiểu theo nghĩa đen của câu hỏi, nhưng không chắc người đọc không muốn số đệm kéo dài quá 7 chữ số nếu con số lớn như vậy.
Emil Lundberg

Bạn có thể nói giải pháp này tốt hơn vì ít nhất các chữ số vẫn được căn chỉnh chính xác trong trường hợp cụ thể đó, không giống như giải pháp được chấp nhận. Toàn bộ điểm của câu hỏi là làm cho các chữ số được căn chỉnh đúng cách.
Luigi Plinge

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

1

Trong trường hợp Câu hỏi & Đáp này trở thành bản tóm tắt chính tắc,

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

Bạn có cần phải đối phó với số âm không? Nếu không, tôi sẽ làm

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

hoặc là

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

Nếu không, bạn có thể sử dụng NumberFormat:

val nf = java.text.NumberFormat.getIntegerInstance(java.util.Locale.US)
nf.setMinimumIntegerDigits(7)
nf.setGroupingUsed(false)
nf.format(-123)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.