Konwersja liczby całkowitej na ciąg z przecinkiem dla tysięcy


189

Chcę przekonwertować liczbę całkowitą 35634646 na liczbę tysięcy, więc powinna wynosić 35,634,646.

Jaki byłby najszybszy sposób na zrobienie tego?

Odpowiedzi:


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

6
Musiałem dodać import java.text.NumberFormat;.
Mike S

6
To wymusza grupowanie w stylu amerykańskim, które zawsze używa ,, jednak .zamiast tego są też regiony używające do grupowania. Jednym słowem, zakodowanie ustawień regionalnych na stałe jest uważane za złą praktykę.
Hai Zhang

4
@DreaminginCode Aby zrobić to dobrze, Locale.getCurrent()jest rozwiązaniem
Roger RV

@RogerRV Nie ma Locale.getCurrent () (przynajmniej na
Androidzie

Tak, to nie jest najlepsza odpowiedź dla 96% ludzi, którzy nie mieszkają w USA
fig.

154

Pytasz o najszybsze, ale może masz na myśli „najlepsze”, „poprawne” lub „typowe”?

Prosisz także o przecinki, aby wskazać tysiące, ale może masz na myśli „w normalnej, czytelnej dla człowieka formie, zgodnie z lokalnymi zwyczajami Twojego użytkownika”?

Robisz to tak:

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

Amerykanie otrzymają „35,634,646”

Niemcy otrzymają „35.634.646”

Niemcy otrzymają „35'634'646”


Gdzie mogę znaleźć wzór numeryczny dla każdego regionu? Próbowałem odczytać kod, ale nie mogę go nigdzie znaleźć
nhoxbypass


44

Liczby całkowite:

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

Debel:

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

String.format jest dość potężny.

- Edytowane na podstawie opinii psuzzi .


1
Zaleta: brak "nowego", nie ładuje garbage collectora (w przeciwieństwie do DecimalFormat).
Contango

Zajrzyj do środka String.format. Zaczyna się od return new Formatter(l) ...itd. Więc argument od śmieciarza nie jest tak silny, jak się wydaje.
Scheintod

2
To moja ulubiona odpowiedź, pytanie dotyczy pracy z liczbą Integer, więc oto kod: int value = 100000; String.format ("%, d", wartość);
psuzzi

Podoba mi się ten.
Sam Chen

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

Wynik: 35,634,646


1
Twój wzór nie musi być większy niż #,###, jeśli chcesz formatowania w stylu europejskim, możesz użyć #,##,###.
Ali

7
@Ali: Format, który opisujesz, jest używany tylko w Indiach i jestem co najmniej w 90% pewien, że Indii nie ma w Europie.
Cairnarvon

Rozumiem ... dobrze, jeśli potrzebujesz formatowania indyjskiego, to tak to robisz.
Ali

1
Jest to zależne od ustawień regionalnych i nie da poprawnych (jak na pytanie) danych wyjściowych, jeśli zostanie uruchomione, gdy domyślne ustawienia regionalne nie oddzielają tysięcy za pomocą rozszerzenia ,.
antak

17

Pozostałe odpowiedzi są poprawne, jednak przed użyciem dokładnie sprawdź ustawienia regionalne "%,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);

Wynik:

35,634,646
35 634 646


3

To rozwiązanie zadziałało dla mnie:

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

2

użyj rozszerzenia

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)

wynik

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

Jeśli to samo trzeba zrobić na stronie JSP, użyj:

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

oczywiście dla wielu wartości użyj:

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

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

1

tutaj jest rozwiązanie dla tych z Was, którzy nie mają dostępu do „numberformat” ani „String.format” (używając ograniczonej wersji Java wewnątrz frameworka). Mam nadzieję, że to przydatne.

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

Rozważ edycję swojej odpowiedzi, dodając kilka komentarzy do kodu (i może opakuj ją w metodę, aby była bardziej użyteczna)
noiaverbale

-1

nie możesz użyć

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

Przecinek w tagu printfpowinien dodać przecinki do %dinter.

Nie jest to pozytywne, ale działa na mnie.


to nie kompilacja dla mnie
Mishax

„Nie jest to pozytywne”. Bezcelowy.
Rob Shepherd

-8

Najpierw musisz dołączyć tagi JSTL: -

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

na początku strony

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.