การแปลงจำนวนเต็มเป็นสตริงด้วยเครื่องหมายจุลภาคเป็นหลัก


182

ฉันต้องการแปลงจำนวนเต็ม 35634646 เพื่อให้มีค่าเป็นพัน "," ดังนั้นควรเป็น 35,634,646

อะไรจะเป็นวิธีที่รวดเร็วที่สุดในการทำสิ่งนั้น?

คำตอบ:


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

5
import java.text.NumberFormat;ผมต้องเพิ่ม
Mike S

6
นี่เป็นการบังคับให้จัดกลุ่มสไตล์ของสหรัฐอเมริกาซึ่งมักจะใช้,อย่างไรก็ตามยังมีภูมิภาคที่ใช้.สำหรับการจัดกลุ่มแทน คำหนึ่งการเข้ารหัสแบบโลแคลถือว่าเป็นวิธีปฏิบัติที่ไม่ดี
Hai จาง

4
@DreaminginCode การทำมันให้ดีLocale.getCurrent()คือทางออก
Roger RV

@RogerRV ไม่มี Locale.getCurrent () (อย่างน้อยสำหรับ Android)
E.Akio

ใช่นี่ไม่ใช่คำตอบที่ดีที่สุดสำหรับคน 96% ที่ไม่ได้อาศัยอยู่ในสหรัฐอเมริกา
รูปที่

152

คุณถามหาที่เร็วที่สุด แต่บางทีคุณอาจหมายถึง "ดีที่สุด" หรือ "ถูกต้อง" หรือ "ปกติ"?

คุณขอให้จุลภาคระบุจำนวนพันด้วย แต่บางทีคุณอาจหมายถึง "ในรูปแบบที่มนุษย์สามารถอ่านได้ตามประเพณีท้องถิ่นของผู้ใช้ของคุณ"?

คุณทำเช่นนั้น:

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

ชาวอเมริกันจะได้รับ "35,634,646"

ชาวเยอรมันจะได้รับ "35.634.646"

ชาวสวิสชาวเยอรมันจะได้รับ "35'634'646"


ฉันจะรับรูปแบบตัวเลขของแต่ละสถานที่ได้อย่างไร ฉันพยายามอ่านรหัส แต่หาไม่พบทุกที่
nhoxbypass


41

จำนวนเต็ม:

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

คู่ผสม:

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

String.format ค่อนข้างทรงพลัง

- แก้ไขต่อข้อเสนอแนะpsuzzi


1
ข้อได้เปรียบ: ไม่ "ใหม่" ไม่โหลดตัวรวบรวมขยะ (ไม่เหมือนกับ DecimalFormat)
Contango

String.formatได้ดูใน มันเริ่มต้นด้วยreturn new Formatter(l) ...ฯลฯ ดังนั้นอาร์กิวเมนต์ตัวรวบรวมขยะจึงไม่แข็งแรงเท่าที่ควร
Scheintod

2
นี่คือคำตอบที่ฉันโปรดปรานคำถามขอให้ทำงานกับ Integer ดังนั้นนี่คือรหัส: int value = 100000; String.format ("%, d", ค่า);
psuzzi

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

เอาท์พุท: 35,634,646


1
ไม่จำเป็นต้องมีรูปแบบของคุณจะมากกว่าถ้าคุณต้องการสไตล์ยุโรปการจัดรูปแบบแล้วคุณสามารถใช้#,### #,##,###
อาลี

7
@Ali: รูปแบบที่คุณอธิบายนั้นใช้เฉพาะในอินเดียและฉันอย่างน้อย 90% แน่ใจว่าอินเดียไม่ได้อยู่ในยุโรป
Cairnarvon

ฉันเข้าใจแล้ว ... ไม่เป็นไรถ้าคุณต้องการการจัดรูปแบบอินเดียนั่นคือวิธีที่คุณทำ
Ali

1
นี่คือสถานที่เกิดเหตุขึ้นและจะไม่ผลิตที่ถูกต้อง (ตามคำถาม) ,เอาท์พุถ้าวิ่งที่สถานที่เริ่มต้นไม่นับพันแยกต่างหากที่มี
antak

17

คำตอบอื่น ๆ นั้นถูกต้องอย่างไรก็ตามโปรดตรวจสอบสถานที่ของคุณอีกครั้งก่อนใช้"%,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);

ผลลัพธ์:

35,634,646
35 634 646



1

หากต้องทำสิ่งเดียวกันใน JSP ให้ใช้:

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

ofcourse สำหรับหลายค่าใช้:

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

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

1

นี่เป็นวิธีแก้ปัญหาสำหรับผู้ที่ไม่สามารถเข้าถึง "numberformat" หรือ "String.format" (โดยใช้จาวารุ่นที่ จำกัด ภายในกรอบงาน) หวังว่ามันจะมีประโยชน์

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

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

0

ใช้ส่วนขยาย

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)

ผลลัพธ์

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

คุณไม่สามารถใช้

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

เครื่องหมายจุลภาคใน the printfควรเพิ่มเครื่องหมายจุลภาคใน%dinter

ไม่ดีเลย แต่ได้ผลกับฉัน


ที่ไม่ได้รวบรวมสำหรับฉัน
Mishax

"ไม่เป็นบวกเกี่ยวกับเรื่องนี้" ไม่มีจุดหมาย
Rob Shepherd

-8

ก่อนอื่นคุณต้องรวมแท็ก JSTL: -

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

ที่จุดเริ่มต้นของหน้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.