Binlerce tamsayıyı virgülle dizeye dönüştürme


182

Tamsayı 35634646'yı bin "," değerine dönüştürmek istiyorum, bu yüzden 35,634,646 olmalıdır.

Bunu yapmanın en hızlı yolu ne olurdu?

Yanıtlar:


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

5
Eklemek zorundaydım import java.text.NumberFormat;.
Mike S

6
Bu, her zaman kullanılan ABD tarzı gruplamayı zorlar ,, ancak .bunun yerine gruplama için kullanılan bölgeler de vardır . Tek kelimeyle, bir yerel ayarı zor kodlamak kötü bir uygulama olarak kabul edilir.
Hai Zhang

4
@DreaminginCode İyi Locale.getCurrent()yapmak için çözüm
Roger RV

@RogerRV Locale.getCurrent () (en azından android'de)
E.Akio

Evet, bu ABD'de yaşamayanların% 96'sı için en iyi cevap değil
incir

152

En çabuk istersiniz, ama belki de "en iyi" veya "doğru" veya "tipik" demek istersiniz?

Ayrıca virgüllerin binlerce göstermesini istersiniz, ancak "kullanıcılarınızın yerel geleneklerine göre normal insan tarafından okunabilir formda" demek istersiniz?

Bunu şöyle yapın:

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

Amerikalılar "35.634.646" alacak

Almanlar "35.634.646" alacak

İsviçre Almanları "35'634'646" alacak


Her bir yerel ayarın sayı düzenini nereden alabilirim? Kodu okumaya çalıştım ama hiçbir yerde bulamıyorum
nhoxbypass


41

tamsayılar:

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

Çiftler:

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

String.format oldukça güçlü.

- psuzzi geri bildirimi başına düzenlendi .


1
Avantajı: "Yeni" yok, çöp toplayıcısını yüklemez (DecimalFormat'ın aksine).
Contango

Auna bir bak String.format. O ile başlayan return new Formatter(l) ...çöp toplayıcı argüman göründüğü itibariyle güçlü değil Yani vb.
Scheintod

2
Bu benim en sevdiğim cevap, soru Integer ile çalışmayı istiyor, bu yüzden kod: int value = 100000; String.format ("%, d", değer);
psuzzi

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

Çıktı: 35,634,646


1
Sizin desen ihtiyacı fazla olamaz #,###o zaman kullanabilirsiniz biçimlendirme avrupa tarzı istiyorsanız, #,##,###.
Ali

7
@Ali: Açıkladığınız biçim sadece Hindistan'da kullanılıyor ve Hindistan'ın Avrupa'da olmadığından en az% 90 eminim.
Cairnarvon

Anlıyorum ... güzel, Hint biçimlendirmeye ihtiyacınız varsa, bunu böyle yaparsınız.
Ali

1
Bu, yerel ayara bağlıdır ve varsayılan yerel ayarın bin ile a'yı ayırmadığı durumlarda çalıştırıldığında doğru (soruya göre) çıktı üretmez ,.
antak

17

Diğer yanıtlar doğrudur, ancak kullanmadan önce yerel ayarınızı iki kez kontrol edin "%,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);

Sonuç:

35,634,646
35 634 646

3

Bu çözüm benim için çalıştı:

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


1

Aynı şeyin JSP'de yapılması gerekiyorsa, şunu kullanın:

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

birden çok değer kullanımı için tabii:

<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" ya da "String.format" a erişemeyenler için (bir çerçeve içinde java'nın sınırlı bir sürümünü kullanarak) bir çözüm bulabilirsiniz. Umarım faydalıdır.

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

Uzantıyı kullan

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)

sonuç

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

kullanamaz mısın

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

İçindeki virgül printf, virgüllerin arasına virgül eklemelidir %d.

Bu konuda olumlu değil, ama benim için çalışıyor.


benim için
derlemiyor

"Bu konuda olumlu değil." Anlamsız.
Rob Shepherd

-8

Öncelikle JSTL etiketlerini eklemeniz gerekir: -

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

sayfanın başında

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.