Formatar um ponto flutuante com 2 casas decimais

210

Atualmente, estou construindo um módulo de vendas para um site de clientes. Até agora, eu tenho o preço de venda para calcular perfeitamente, mas onde eu fiquei preso está formatando a saída para 2 casas decimais.

Atualmente, estou chamando isso de uma variável para que eu possa vincular os resultados a uma exibição de lista.

Sale = float.Parse(((x.Sale_Price - (x.Sale_Price * (x.Discount_Price / 100))).ToString())),

Alguém pode me mostrar como formatar a saída para 2 casas decimais? Muito Obrigado!

Callum
fonte
Verifique isso, não tenho certeza, mas pode ser que funcione ToString ("#. ##");
21311

Respostas:

467

Você pode passar o formato para o ToStringmétodo, por exemplo:

myFloatVariable.ToString("0.00"); //2dp Number

myFloatVariable.ToString("n2"); // 2dp Number

myFloatVariable.ToString("c2"); // 2dp currency

Sequências de formato de número padrão

WraithNath
fonte
38
"N2" e "C2" adicionarão mil separadores, enquanto "0,00" não.
Marc K
5
Caso você não tenha certeza (eu estava), todas essas maneiras de formatar um valor flutuante fornecem arredondamento.
RenniePet
46

A primeira coisa que você precisa fazer é usar o decimaltipo em vez dos floatpreços. O uso floaté absolutamente inaceitável para isso, porque não pode representar com precisão a maioria das frações decimais.

Depois de ter feito isso, Decimal.Round()pode ser usado para arredondar para 2 lugares.

Michael Borgwardt
fonte
36

String.Format("{0:#,###.##}", value)

Um exemplo mais complexo de String Formatting in C # :

String.Format("{0:$#,##0.00;($#,##0.00);Zero}", value);

Isso produzirá "$ 1.240,00" se for aprovado em 1243,50. Ele exibirá o mesmo formato, mas entre parênteses, se o número for negativo, e a string "Zero", se o número for zero.

alexandrul
fonte
4
string outString= number.ToString("####0.00");
danyolgiax
fonte
1
Existem diferentes entre "0" e "#" no formato personalizado. "0": Substitui o zero pelo dígito correspondente, se houver um; caso contrário, zero aparecerá na sequência de resultados. "#": Substitui o símbolo "#" pelo dígito correspondente, se houver um; caso contrário, nenhum dígito aparecerá na sequência de resultados. Referência
劉鎮 瑲 12/04/19
3

Como já mencionado, você precisará usar um resultado formatado; que é feito através das Write(), WriteLine(), Format(), e ToString()métodos.

O que não foi mencionado é o formato de ponto fixo, que permite um número especificado de casas decimais. Ele usa um 'F' e o número após o 'F' é o número de casas decimais emitidas, conforme mostrado nos exemplos.

Console.WriteLine("{0:F2}", 12);    // 12.00 - two decimal places
Console.WriteLine("{0:F0}", 12.3);  // 12 - ommiting fractions
Jackson
fonte
2

Isso é para os casos em que você deseja usar seqüências de caracteres interpoladas . Na verdade, estou postando isso porque estou cansado de tentativa e erro e, eventualmente, percorrendo vários documentos toda vez que preciso formatar alguns escalares.

$"{1234.5678:0.00}"        "1234.57"        2 decimal places, notice that value is rounded
$"{1234.5678,10:0.00}"     "   1234.57"     right-aligned
$"{1234.5678,-10:0.00}"    "1234.57   "     left-aligned
$"{1234.5678:0.#####}"     "1234.5678"      5 optional digits after the decimal point
$"{1234.5678:0.00000}"     "1234.56780"     5 forced digits AFTER the decimal point, notice the trailing zero
$"{1234.5678:00000.00}"    "01234.57"       5 forced digits BEFORE the decimal point, notice the leading zero
$"{1234.5612:0}"           "1235"           as integer, notice that value is rounded
$"{1234.5678:F2}"          "1234.57"        standard fixed-point
$"{1234.5678:F5}"          "1234.56780"     5 digits after the decimal point, notice the trailing zero
$"{1234.5678:g2}"          "1.2e+03"        standard general with 2 meaningful digits, notice "e"
$"{1234.5678:G2}"          "1.2E+03"        standard general with 2 meaningful digits, notice "E"
$"{1234.5678:G3}"          "1.23E+03"       standard general with 3 meaningful digits
$"{1234.5678:G5}"          "1234.6"         standard general with 5 meaningful digits
$"{1234.5678:e2}"          "1.23e+003"      standard exponential with 2 digits after the decimal point, notice "e"
$"{1234.5678:E3}"          "1.235E+003"     standard exponential with 3 digits after the decimal point, notice "E"
$"{1234.5678:N2}"          "1,234.57"       standard numeric, notice the comma
$"{1234.5678:C2}"          "$1,234.57"      standard currency, notice the dollar sign
$"{1234.5678:P2}"          "123,456.78 %"   standard percent, notice that value is multiplied by 100
$"{1234.5678:2}"           "2"              :)

Aviso de desempenho

Sequências interpoladas são lentas. Na minha experiência, esta é a ordem (rápida a lenta):

  1. value.ToString(format)+" blah blah"
  2. string.Format("{0:format} blah blah", value)
  3. $"{value:format} blah blah"
saastn
fonte