String.format () para formatar o dobro em java

178

Como posso usar String.format (formato String, X) para formatar um duplo como segue ???

2354548.235 -> 2.354.548,23

Obrigado!

kike
fonte

Respostas:

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

String.format usa automaticamente o código do idioma padrão.

David Tang
fonte
36
Você também pode usar um código de idioma específico usandoString.format(Locale.GERMAN, "%1$,.2f", myDouble);
Olivier Grégoire
13
Se houver mais de uma duplicação para formatar, use% 1,% 2 e assim por diante. Por exemplo String.format ( "% 1 $ ,. 2f, 2% $ ,. 2f", myDouble, adouble)
Moesio
4
Eu acredito que o "% 1 $" é opcional neste caso. Funciona para mim com apenas "%, 2f" como o formato String.
Matt Passell
5
Sim, Matt está certo. %1, %2e assim por diante podem ser usados ​​para reordenar a saída com base no índice de seus argumentos de entrada. Veja isso . Você pode omitir o índice e a ordem padrão será assumida pelo formatador.
Praneetloke 14/05
1
Você deve dar uma explicação do significado das diferentes partes.
Mitulát Bati
41
String.format("%4.3f" , x) ;

Isso significa que precisamos de um total de 4 dígitos em ans, dos quais 3 devem estar após o decimal. E f é o especificador de formato double. x significa a variável para a qual queremos encontrá-la. Trabalhou para mim. . .

user3304797
fonte
1
Eu acho que isso significa que será a quarta variável nos argumentos a seguir e terá 3 casas após o decimal.
Michael Fulton
@MichaelFulton Não é tão fácil: String.format("%014.3f" , 58.656565)-> 0000000058,657: 14 símbolos no total: 8 zeros e 5 números e 1 vírgula. Portanto, nesse caso, número 14 significa o número total de símbolos (os extras são substituídos pelo zero à esquerda, podem ficar sem, e substituem pelo espaço) na sequência de resultados . A .3parte é completamente independente aqui.
parsecer 5/03
No entanto aqui: String.format("%014.3f" , 58.656565)-> 58,657. Entendo porque a preferência vai para a .3fparte: primeiro imprime o número com 3 casas decimais e depois, se houver símbolos restantes , imprime espaços à esquerda (ou zeros / o que for). Nesse caso, o número é 2 + 3 + 1 = 6 símbolos e queríamos apenas imprimir 4, portanto, certamente não há espaços extras.
parsecer 5/03
24

Se você deseja formatá-lo com símbolos definidos manualmente, use o seguinte:

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

A formatação baseada em local é a preferida.

mdrg
fonte
3
Resposta útil! No entanto, a última frase "A formatação baseada em localidade é preferida" não faz sentido sem o contexto. Existem casos de uso muito bons em que você NÃO deve usar a formatação com base no código do idioma, quando desejar gerar um formato específico da String. Por exemplo, você está implementando a exportação de seus dados para um arquivo externo e deseja ter controle total sobre o formato, não depende da localidade atual (ou qualquer).
Honza Zidek
20

código extraído deste link ;

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

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

A saída deste exemplo mostra como o formato do mesmo número varia com o código de idioma:

345 987,246  fr_FR
345.987,246  de_DE
345,987.246  en_US
Gursel Koca
fonte
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);
  }
}

E imprima:

3 (3) +3 00003
Formato de ponto flutuante padrão: 1234567,123000 Ponto
flutuante com vírgulas: 1.234.567,123000
Padrão de ponto
flutuante negativo : -1.234.567,123000 Opção de ponto flutuante negativo: (1.234.567, 123000)

Valores positivos e negativos de
alinhamento : 1.234.567,12
-1.234.567,12

Torres
fonte
2

Há muitas maneiras de fazer isso. Estes são dados abaixo:

Suponha que seu número original seja fornecido abaixo: número duplo = 2354548.235;

Usando NumberFormate modo de arredondamento

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);

Usando o formatador de String

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

Em todos os casos, a saída será: 2354548.24

Nota :

Durante o arredondamento, você pode adicionar RoundingModeseu formatador. Aqui estão alguns modos de arredondamento abaixo:

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

Aqui estão as importações :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
Md. Sajedul Karim
fonte
1

Usar DecimalFormat

 NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
 DecimalFormat decimalFormatter = (DecimalFormat) nf;
 decimalFormatter.applyPattern("#,###,###.##");
 String fString = decimalFormatter.format(myDouble);
 System.out.println(fString);
Anisuzzaman Babla
fonte