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.