С# Double - ToString() форматирование с двумя десятичными знаками, но без округления
Как отформатировать Double
до String
на С#, чтобы иметь только два десятичных знака?
Если я использую String.Format("{0:0.00}%", myDoubleValue)
, тогда число округляется, и я хочу простой усекать без округления. Я также хочу, чтобы преобразование в String
было чувствительным к культуре.
Ответы
Ответ 1
Я использую следующее:
double x = Math.Truncate(myDoubleValue * 100) / 100;
Например:
Если число равно 50.947563, и вы используете следующее, произойдет следующее:
- Math.Truncate(50.947563 * 100) / 100;
- Math.Truncate(5094.7563) / 100;
- 5094 / 100
- 50.94
И там ваш ответ усечен, теперь для форматирования строки просто выполните следующее:
string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format
Ответ 2
Следующий округляет числа, но показывает только до двух знаков после запятой (удаление любых завершающих нулей), благодаря .##
.
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/
Ответ 3
Я предлагаю вам сначала усечь, а затем отформатировать:
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);
Используйте константу 100 для усечения двух цифр; используйте 1, за которым следует столько нулей, сколько цифр после десятичной точки, которую вы хотели бы. Используйте имя культуры, которое необходимо настроить для результата форматирования.
Ответ 4
Простейший метод, используйте строки числового формата:
double total = "43.257"
MessageBox.Show(total.ToString("F"));
Ответ 5
Я использую price.ToString("0.00")
для получения начальных 0s
Ответ 6
Это работает для меня
string prouctPrice = Convert.ToDecimal(String.Format("{0:0.00}", Convert.ToDecimal(yourString))).ToString();
Ответ 7
Функция С#, выраженная Кайлом Розендо:
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);
}
Ответ 8
Как добавить один дополнительный десятичный знак, который должен быть округлен, а затем отброшен:
var d = 0.241534545765;
var result1 = d.ToString("0.###%");
var result2 = result1.Remove(result1.Length - 1);
Ответ 9
Я знаю, что это старый поток, но я просто должен был это сделать. В то время как другие подходы здесь работают, мне нужен простой способ повлиять на множество вызовов string.format
. Поэтому добавление Math.Truncate
ко всем вызовам не было действительно хорошим вариантом. Кроме того, поскольку некоторые форматирования хранятся в базе данных, это еще хуже.
Таким образом, я создал поставщика настраиваемого формата, который позволил бы мне добавить усечение в строку форматирования, например:
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
Реализация довольно проста и легко распространяется на другие требования.
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;
}
}
Ответ 10
Следующие могут использоваться только для отображения, в котором используется свойство String..
double value = 123.456789;
String.Format("{0:0.00}", value);
Ответ 11
К тому, что стоит, для отображения валюты вы можете использовать "C"
:
double cost = 1.99;
m_CostText.text = cost.ToString("C"); /*C: format as currentcy */
Выход: $1.99
Ответ 12
Вы также можете написать свой собственный IFormatProvider, хотя я полагаю, что в конечном итоге вам придется подумать о способе сделать фактический усечение.
.NET Framework также поддерживает настраиваемое форматирование. Обычно это связано с созданием класса форматирования, который реализует как IFormatProvider, так и ICustomFormatter. (MSDN)
По крайней мере, это было бы легко повторно использовать.
Существует статья о том, как реализовать свой собственный IFormatProvider/ICustomFormatter здесь, в CodeProject. В этом случае лучшим вариантом будет "расширение" существующего числового формата. Это не выглядит слишком тяжелым.
Ответ 13
У меня была эта проблема с xamarin и я решил:
porcent.ToString("0.##"+"%")
Ответ 14
Решение:
var d = 0.123345678;
var stringD = d.ToString();
int indexOfP = stringD.IndexOf(".");
var result = stringD.Remove((indexOfP+1)+2);
(indexOfP + 1) +2 (это число зависит от количества, которое вы хотите сохранить. Я даю ему два, потому что владелец вопроса хочет.)