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?

Dominik
źródło

Odpowiedzi:

309
System.out.println(NumberFormat.getNumberInstance(Locale.US).format(35634646));
Output: 35,634,646
Eng. Fouad
źródło
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”

Steve McLeod
źródło
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 .

Frankie
źródło
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

Bala R
źródło
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
Grzegorz Szpetkowski
źródło
4

Użyj specyfikatora %dformatu z przecinkiem:%,d

To zdecydowanie najłatwiejszy sposób.

Annie Johnson
źródło
3

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

NumberFormat.getNumberInstance(Locale.US).format(Integer.valueOf("String Your Number"));
TAK JAK
źródło
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
Changhoon
źródło
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>
Navankur Chauhan
źródło
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
user1807050
źródło
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.

Josh
źródło
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

Ankur
źródło