String.format (), aby sformatować double w java


178

Jak mogę użyć String.format (format String, X) do sformatowania podwójnego, takiego jak następujący ???

2354548,235 -> 2,354,548,23

Dzięki!

Odpowiedzi:


295
String.format("%1$,.2f", myDouble);

String.format automatycznie używa domyślnych ustawień regionalnych.


36
Możesz również użyć określonego regionu, używającString.format(Locale.GERMAN, "%1$,.2f", myDouble);
Olivier Grégoire,

13
Jeśli do sformatowania jest więcej niż jedna podwójna, użyj% 1,% 2 i tak dalej. Na przykład String.format ("% 1 $ ,. 2f,% 2 $ ,. 2f", myDouble, aDouble)
Moesio

4
Uważam, że w tym przypadku „% 1 $” jest opcjonalne. U mnie działa tylko z „% ,. 2f” jako formatem String.
Matt Passell,

5
Tak, Matt ma rację. %1, %2i tak dalej można użyć do zmiany kolejności wyników na podstawie indeksu argumentów wejściowych. Zobacz to . Możesz pominąć indeks, a program formatujący przyjmie domyślną kolejność.
praneetloke

1
Powinieneś wyjaśnić, co oznaczają poszczególne części.
Mitulát báti

41
String.format("%4.3f" , x) ;

Oznacza to, że potrzebujemy łącznie 4 cyfr w ans, z których 3 powinny być po przecinku. A f jest specyfikatorem formatu double. x oznacza zmienną, dla której chcemy ją znaleźć. Pracował dla mnie. . .


1
Myślę, że oznacza to, że będzie to czwarta zmienna w argumentach, które następują i mają 3 miejsca po przecinku.
Michael Fulton

@MichaelFulton To nie takie proste: String.format("%014.3f" , 58.656565)-> 0000000058,657: łącznie 14 symboli: 8 zer, 5 liczb i 1 przecinek. Czyli w tym przypadku liczba 14 oznacza całkowitą liczbę symboli (dodatkowe są zastępowane wiodącym zerem, mogłyby się obejść bez, a następnie zostałyby zastąpione spacją) w ciągu wynikowym . .3Część jest tu całkowicie niezależny.
parsecer

Jednak tutaj: String.format("%014.3f" , 58.656565)-> 58,657. Biorę to, ponieważ preferencja dotyczy .3fczęści: najpierw drukuje liczbę z 3 miejscami po przecinku, a następnie, jeśli pozostały symbole , wypisuje początkowe spacje (lub zera / cokolwiek). W tym przypadku liczba to 2 + 3 + 1 = 6 symboli, a chcieliśmy wydrukować tylko 4, więc z pewnością nie ma dodatkowych spacji.
parsecer

24

Jeśli chcesz sformatować go ręcznie ustawionymi symbolami, użyj tego:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(',');
DecimalFormat decimalFormat = new DecimalFormat("#,##0.00", decimalFormatSymbols);
System.out.println(decimalFormat.format(1237516.2548)); //1,237,516.25

Preferowane jest jednak formatowanie lokalne.


3
Przydatna odpowiedź! Jednak ostatnie zdanie „Preferowane jest formatowanie oparte na ustawieniach regionalnych” nie ma sensu bez kontekstu. Są całkiem dobre przypadki użycia, w których NIE powinieneś używać formatowania opartego na ustawieniach regionalnych, gdy chcesz wygenerować określony format ciągu. Np. Realizujesz eksport swoich danych do zewnętrznego pliku i chcesz mieć pełną kontrolę nad formatem, niezależnym od aktualnej (lub jakiejkolwiek) lokalizacji.
Honza Zidek

20

kod wyodrębniony z tego linku ;

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + " " + 
                   currentLocale.toString());

Dane wyjściowe z tego przykładu pokazują, jak format tej samej liczby różni się w zależności od ustawień regionalnych:

345 987,246  fr_FR
345.987,246  de_DE
345,987.246  en_US

13
public class MainClass {
   public static void main(String args[]) {
    System.out.printf("%d %(d %+d %05d\n", 3, -3, 3, 3);

    System.out.printf("Default floating-point format: %f\n", 1234567.123);
    System.out.printf("Floating-point with commas: %,f\n", 1234567.123);
    System.out.printf("Negative floating-point default: %,f\n", -1234567.123);
    System.out.printf("Negative floating-point option: %,(f\n", -1234567.123);

    System.out.printf("Line-up positive and negative values:\n");
    System.out.printf("% ,.2f\n% ,.2f\n", 1234567.123, -1234567.123);
  }
}

I wydrukuj:

3 (3) +3 00003
Domyślny format zmiennoprzecinkowy: 1234567,123000 Liczba
zmiennoprzecinkowa z przecinkami: 1,234,567,123000 Wartość domyślna
ujemna zmiennoprzecinkowa: -1.234,567,123000
Negatywna opcja zmiennoprzecinkowa: (1.234.567, 123000)


Zestawienie wartości dodatnie i ujemne: 1.234.567,12
-1.234.567,12


2

Można to zrobić na wiele sposobów. Poniżej podano:

Załóżmy, że Twój oryginalny numer jest podany poniżej: podwójna liczba = 2354548.235;

Korzystanie NumberFormati tryb zaokrąglania

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
    DecimalFormat decimalFormatter = (DecimalFormat) nf;
    decimalFormatter.applyPattern("#,###,###.##");
    decimalFormatter.setRoundingMode(RoundingMode.CEILING);

    String fString = decimalFormatter.format(number);
    System.out.println(fString);

Korzystanie z programu formatującego ciąg

System.out.println(String.format("%1$,.2f", number));

We wszystkich przypadkach wynik będzie następujący: 2354548,24

Uwaga :

Podczas zaokrąglania możesz dodać RoundingModeswój formater. Oto kilka trybów zaokrąglania podanych poniżej:

    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

Oto import :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

1

Posługiwać się DecimalFormat

 NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
 DecimalFormat decimalFormatter = (DecimalFormat) nf;
 decimalFormatter.applyPattern("#,###,###.##");
 String fString = decimalFormatter.format(myDouble);
 System.out.println(fString);
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.