Chuyển đổi số nguyên thành chuỗi bằng dấu phẩy cho hàng ngàn


181

Tôi muốn chuyển đổi một số nguyên 35634646 để có một nghìn "," vì vậy nó phải là 35.634.646.

Điều gì sẽ là cách nhanh nhất để làm điều đó?

Câu trả lời:


289
System.out.println(NumberFormat.getNumberInstance(Locale.US).format(35634646));
Output: 35,634,646

5
Tôi đã phải thêm import java.text.NumberFormat;.
Mike S

6
Điều này buộc nhóm theo kiểu Mỹ luôn sử dụng ,, tuy nhiên cũng có các khu vực sử dụng .để nhóm. Nói một cách dễ hiểu, mã hóa cứng một miền địa phương được coi là một thực tiễn xấu.
Hai Zhang

4
@DreaminginCode Để làm tốt điều đó Locale.getCurrent()là giải pháp
Roger RV

@RogerRV Không có Locale.getCản () (ít nhất là trên Android)
E.Akio

Yeh đây không phải là câu trả lời tốt nhất cho 96% những người không sống ở Hoa Kỳ
fig

152

Bạn yêu cầu nhanh nhất, nhưng có lẽ bạn có nghĩa là "tốt nhất" hoặc "chính xác" hoặc "điển hình"?

Bạn cũng yêu cầu dấu phẩy để chỉ hàng ngàn, nhưng có lẽ bạn có nghĩa là "ở dạng người có thể đọc được bình thường theo phong tục địa phương của người dùng của bạn"?

Bạn làm như vậy:

    int i = 35634646;
    String s = NumberFormat.getIntegerInstance().format(i);

Người Mỹ sẽ nhận được "35.634.646"

Người Đức sẽ nhận được "35.634.646"

Người Đức Thụy Sĩ sẽ nhận được "35'634'646"


Tôi có thể lấy mẫu số của từng miền ở đâu? Tôi đã cố đọc mã nhưng không thể tìm thấy nó ở bất cứ đâu
nhoxbypass


41

Số nguyên:

int value = 100000; 
String.format("%,d", value); // outputs 100,000

Đôi:

double value = 21403.3144d;
String.format("%,.2f", value); // outputs 21,403.31

String.format khá mạnh mẽ.

- Chỉnh sửa theo phản hồi psuzzi .


1
Ưu điểm: Không "mới", không tải lên trình thu gom rác (không giống như DecimalFormat).
Contango

Có một cái nhìn trong String.format. Nó bắt đầu bằng return new Formatter(l) ...vv. Vì vậy, đối số người thu gom rác dường như không mạnh bằng.
Scheintod

2
Đây là câu trả lời yêu thích của tôi, câu hỏi yêu cầu làm việc với Integer, vì vậy đây là mã: int value = 100000; String.format ("%, d", giá trị);
psuzzi

20
 int value = 35634646;
 DecimalFormat myFormatter = new DecimalFormat("#,###");
 String output = myFormatter.format(value);
 System.out.println(output);

Đầu ra: 35,634,646


1
Mẫu của bạn không cần nhiều hơn #,###, nếu bạn muốn định dạng kiểu châu Âu thì bạn có thể sử dụng #,##,###.
Ali

7
@Ali: Định dạng bạn mô tả chỉ được sử dụng ở Ấn Độ và tôi chắc chắn ít nhất 90% Ấn Độ không ở Châu Âu.
Cairnarvon

Tôi hiểu rồi ... tốt thôi, nếu bạn cần định dạng Ấn Độ thì đó là cách bạn làm.
Ali

1
Điều này phụ thuộc vào miền địa phương và sẽ không tạo ra đầu ra chính xác (theo câu hỏi) nếu chạy trong đó miền địa phương mặc định không tách hàng nghìn với a ,.
antak

17

Các câu trả lời khác là chính xác, tuy nhiên hãy kiểm tra lại ngôn ngữ của bạn trước khi sử dụng "%,d":

Locale.setDefault(Locale.US);
int bigNumber = 35634646;
String formattedNumber = String.format("%,d", bigNumber);
System.out.println(formattedNumber);

Locale.setDefault(new Locale("pl", "PL"));
formattedNumber = String.format("%,d", bigNumber);
System.out.println(formattedNumber);

Kết quả:

35,634,646
35 634 646

3

Giải pháp này hiệu quả với tôi:

NumberFormat.getNumberInstance(Locale.US).format(Integer.valueOf("String Your Number"));

3

Sử dụng công %dcụ xác định định dạng bằng dấu phẩy:%,d

Đây là cách dễ nhất.


1

Nếu điều tương tự phải được thực hiện trong JSP, hãy sử dụng:

<fmt:formatNumber pattern="#,##0" value="${yourlist.yourintvalue}" var="formattedVariable" />
<c:out value="${formattedVariable}"></c:out>

Tất nhiên cho nhiều giá trị sử dụng:

<c:forEach items="${yourlist}" var="yourlist">

    <fmt:formatNumber pattern="#,##0" value="${yourlist.yourintvalue}" var="formattedVariable" />
    <c:out value="${formattedVariable}"></c:out>
</c:forEach>

1

đây là giải pháp cho những bạn không thể truy cập "numberformat" hay "String.format" (sử dụng phiên bản giới hạn của java trong khung). Hy vọng nó hữu ích.

number= 123456789;
thousandsSeparator=",";
myNumberString=number.toString();   
numberLength=myNumberString.length;
howManySeparators=Math.floor((numberLength-1)/3)
formattedString=myNumberString.substring(0,numberLength-(howManySeparators*3))
while (howManySeparators>0)    {
formattedString=formattedString+thousandsSeparator+myNumberString.substring(numberLength-(howManySeparators*3),numberLength-((howManySeparators-1)*3));
howManySeparators=howManySeparators-1;    }

formattedString

Xem xét để chỉnh sửa câu trả lời của bạn thêm một số nhận xét vào mã của bạn (và có thể gói nó trong một phương thức, vì vậy nó có thể hữu ích hơn)
noiaverbale

0

sử dụng tiện ích mở rộng

import java.text.NumberFormat

val Int.commaString: String
  get() = NumberFormat.getInstance().format(this)

val String.commaString: String
  get() = NumberFormat.getNumberInstance().format(this.toDouble())

val Long.commaString: String
  get() = NumberFormat.getInstance().format(this)

val Double.commaString: String
  get() = NumberFormat.getInstance().format(this)

kết quả

1234.commaString => 1,234
"1234.456".commaString => 1,234.456
1234567890123456789.commaString => 1,234,567,890,123,456,789
1234.456.commaString => 1,234.456

-1

bạn không thể sử dụng một

System.out.printf("%n%,d",int name);

Dấu phẩy trong printfnên thêm dấu phẩy vào %dliên.

Không tích cực về nó, nhưng làm việc cho tôi.


điều đó không được biên dịch cho tôi
Mishax

"Không tích cực về nó." Vô nghĩa.
Rob chăn cừu

-8

Trước tiên, bạn cần bao gồm các thẻ JSTL: -

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 

ở đầu trang

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.