C# Double - ToString() форматирование с двумя десятичными знаками, но без округления
как мне форматировать Double до String В C#, чтобы иметь только два десятичных знака?
если я использую String.Format("{0:0.00}%", myDoubleValue) число затем округляется, и я хочу просто усечь без округления. Я также хочу преобразование в String чтобы быть чувствительным к культуре.
13 ответов:
Я использую следующий:
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.##"); //24http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/
Я предлагаю вам сначала усечь, а затем форматировать:
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 для усечения 2 цифр; используйте 1, за которым следует столько нулей, сколько цифр после десятичной точки, которую вы хотите. Используйте имя языка и региональных параметров, необходимое для настройки результата форматирования.
самый простой метод, используйте строки числового формата:
double total = "43.257" MessageBox.Show(total.ToString("F"));
это работает для меня
string prouctPrice = Convert.ToDecimal(String.Format("{0:0.00}", Convert.ToDecimal(yourString))).ToString();
функция c#, выраженная Кайлом Розендо:
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); }
Как насчет добавления одного дополнительного десятичного знака, который должен быть округлен, а затем отброшен:
var d = 0.241534545765; var result1 = d.ToString("0.###%"); var result2 = result1.Remove(result1.Length - 1);
Я знаю, что это старый нить, но я просто должен был сделать это. В то время как другие подходы здесь работают, я хотел простой способ, чтобы иметь возможность влиять на много вызовов
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; } }
Following может использоваться только для отображения, которое использует свойство String ..
double value = 123.456789; String.Format("{0:0.00}", value);
к тому, что стоит, для показа валюты, вы можете использовать
"C":double cost = 1.99; m_CostText.text = cost.ToString("C"); /*C: format as currentcy */выход:
.99
вы также можете написать свой собственный IFormatProvider, хотя я полагаю, что в конечном итоге вам придется придумать способ сделать фактическое усечение.
платформа .NET Framework также поддерживает пользовательское форматирование. Обычно это включает в себя создание класса форматирования, который реализует как IFormatProvider, так и ICustomFormatter. (msdn)
по крайней мере, это было бы легко повторно использовать.
есть статья о том, как реализации собственного объекта iformatprovider/использованием интерфейса icustomformatter здесь в CodeProject. В этом случае "расширение" существующего числового формата может быть лучшим выбором. Это выглядит не слишком сложно.
Comments