C # Double – ToString () formatação com duas casas decimais, mas sem arredondamento

Como posso formatar um Double para um String em C #, de modo a ter apenas duas casas decimais?

Se eu usar String.Format("{0:0.00}%", myDoubleValue) o número será arredondado e eu quero um simples truncamento sem qualquer arredondamento. Eu também quero que a conversão para String seja sensível à cultura.

Eu uso o seguinte:

 double x = Math.Truncate(myDoubleValue * 100) / 100; 

Por exemplo:

Se o número for 50.947563 e você usar o seguinte, ocorrerá o seguinte:

 - Math.Truncate(50.947563 * 100) / 100; - Math.Truncate(5094.7563) / 100; - 5094 / 100 - 50.94 

E aí está sua resposta truncada, agora para formatar a string simplesmente faça o seguinte:

 string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format 

O seguinte arredonda os números, mas mostra apenas até 2 casas decimais (removendo quaisquer zeros à direita), graças a .## .

 decimal d0 = 24.154m; decimal d1 = 24.155m; decimal d2 = 24.1m; decimal d3 = 24.0m; d0.ToString("0.##"); //24.15 d1.ToString("0.##"); //24.16 (rounded up) d2.ToString("0.##"); //24.1 d3.ToString("0.##"); //24 

http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/

Sugiro que você trunque primeiro e depois formate:

 double a = 123.4567; double aTruncated = Math.Truncate(a * 100) / 100; CultureInfo ci = new CultureInfo("de-DE"); string s = string.Format(ci, "{0:0.00}%", aTruncated); 

Use a constante 100 para 2 dígitos truncar; use 1 seguido por quantos zeros como dígitos após o ponto decimal desejado. Use o nome da cultura que você precisa para ajustar o resultado da formatação.

Método mais simples, use strings de formato numérico:

 double total = "43.257" MessageBox.Show(total.ToString("F")); 

Eu uso price.ToString("0.00") para obter os 0s iniciais

Isso está funcionando para mim

 string prouctPrice = Convert.ToDecimal(String.Format("{0:0.00}", Convert.ToDecimal(yourString))).ToString(); 

A function c #, expressa por Kyle Rozendo:

 string DecimalPlaceNoRounding(double d, int decimalPlaces = 2) { d = d * Math.Pow(10, decimalPlaces); d = Math.Truncate(d); d = d / Math.Pow(10, decimalPlaces); return string.Format("{0:N" + Math.Abs(decimalPlaces) + "}", d); } 

Que tal adicionar um decimal extra que deve ser arredondado e depois descartado:

 var d = 0.241534545765; var result1 = d.ToString("0.###%"); var result2 = result1.Remove(result1.Length - 1); 

Eu sei que isso é um tópico antigo, mas eu só tive que fazer isso. Enquanto as outras abordagens aqui funcionam, eu queria uma maneira fácil de poder afetar muitas chamadas para string.format . Portanto, adicionar o Math.Truncate a todas as chamadas não era uma boa opção. Além disso, como parte da formatação é armazenada em um database, isso fica ainda pior.

Assim, criei um provedor de formato personalizado que me permitiria adicionar truncamento à string de formatação, por exemplo:

 string.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12 string.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123 string.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9 

A implementação é bastante simples e é facilmente extensível a outros requisitos.

 public class FormatProvider : IFormatProvider, ICustomFormatter { public object GetFormat(Type formatType) { if (formatType == typeof (ICustomFormatter)) { return this; } return null; } public string Format(string format, object arg, IFormatProvider formatProvider) { if (arg == null || arg.GetType() != typeof (double)) { try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(string.Format("The format of '{0}' is invalid.", format)); } } if (format.StartsWith("T")) { int dp = 2; int idx = 1; if (format.Length > 1) { if (format[1] == '(') { int closeIdx = format.IndexOf(')'); if (closeIdx > 0) { if (int.TryParse(format.Substring(2, closeIdx - 2), out dp)) { idx = closeIdx + 1; } } else { throw new FormatException(string.Format("The format of '{0}' is invalid.", format)); } } } double mult = Math.Pow(10, dp); arg = Math.Truncate((double)arg * mult) / mult; format = format.Substring(idx); } try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(string.Format("The format of '{0}' is invalid.", format)); } } private string HandleOtherFormats(string format, object arg) { if (arg is IFormattable) { return ((IFormattable) arg).ToString(format, CultureInfo.CurrentCulture); } return arg != null ? arg.ToString() : String.Empty; } } 

A seguir pode ser usado apenas para exibição que usa a propriedade de String ..

 double value = 123.456789; String.Format("{0:0.00}", value); 

Para o que vale a pena, para mostrar a moeda, você pode usar "C" :

 double cost = 1.99; m_CostText.text = cost.ToString("C"); /*C: format as currentcy */ 

Saída: $1.99

Você também pode escrever seu próprio IFormatProvider , embora eu suponha que, eventualmente, você teria que pensar em uma maneira de fazer o truncamento real.

O .NET Framework também suporta formatação personalizada. Isso normalmente envolve a criação de uma class de formatação que implementa o IFormatProvider e o ICustomFormatter . (msdn)

Pelo menos seria facilmente reutilizável.

Há um artigo sobre como implementar seu próprio IFormatProvider / ICustomFormatter aqui no CodeProject . Nesse caso, “estender” um formato numérico existente pode ser a melhor aposta. Não parece muito difícil.

Eu tive esse problema com xamarin e resolvi com:

 porcent.ToString("0.##"+"%")