String.Format - Как я могу отформатировать до х цифр (независимо от десятичного знака)?
Мне нужно отформатировать число с плавающей запятой в x символов (6 в моем случае, включая десятичную точку). Мой вывод также должен включать знак числа
Таким образом, учитывая входные данные, вот ожидаемые результаты
1.23456 => +1.2345
-12.34567 => -12.345
-0.123456 => -0.1234
1234.567 => +1234.5
Пожалуйста, предположите, что перед последним символом всегда стоит десятичный знак. Т.е. не будет 12345.6
ввод числа - ввод всегда будет меньше или равен 9999.9
,
Я думаю, что это должно быть сделано условно.
7 ответов
Вот прозрачный способ сделать это без форматных строк (кроме "F"):
static void Main()
{
double y = 1.23456;
Console.WriteLine(FormatNumDigits(y,5));
y= -12.34567;
Console.WriteLine(FormatNumDigits(y,5));
y = -0.123456;
Console.WriteLine(FormatNumDigits(y,5));
y = 1234.567;
Console.WriteLine(FormatNumDigits(y,5));
y = 0.00000234;
Console.WriteLine(FormatNumDigits(y,5));
y = 1.1;
Console.WriteLine(FormatNumDigits(y,5));
}
public string FormatNumDigits(double number, int x) {
string asString = (number >= 0? "+":"") + number.ToString("F50",System.Globalization.CultureInfo.InvariantCulture);
if (asString.Contains('.')) {
if (asString.Length > x + 2) {
return asString.Substring(0, x + 2);
} else {
// Pad with zeros
return asString.Insert(asString.Length, new String('0', x + 2 - asString.Length));
}
} else {
if (asString.Length > x + 1) {
return asString.Substring(0, x + 1);
} else {
// Pad with zeros
return asString.Insert(1, new String('0', x + 1 - asString.Length));
}
}
}
Выход:
+1.2345
-12.345
-0.1234
+1234.5
+0.0000
+1.1000
РЕДАКТИРОВАТЬ
Обратите внимание, что он не отсекает конечные нули.
Вы упоминаете "х символов". Таким образом, мы можем упростить это до "x-1 цифр" и просто написать код, который показывает x цифр.
Я думаю, что передача спецификатора числового формата "G" Double.ToString()
настолько близко к встроенному, насколько это возможно.
double d = 1234.56789;
string s = d.ToString("G6"); // "1234.57"
Поэтому мы просто расширяем это, чтобы вручную добавить "+" в начале:
if (d > 0)
s = "+" + s;
Собираем все вместе в методе расширения:
РЕДАКТИРОВАТЬ: Включает необязательный параметр для усечения
public static string ToStringWithSign(this double d, int digits, bool truncate = false)
{
if (truncate) {
double factor = Math.Pow(10, digits - 1);
d = Math.Truncate(d * factor) / factor;
}
string s = d.ToString("G" + digits);
if (d > 0)
s = "+" + s;
return s;
}
Результаты:
(1234.56789).ToStringWithSign(4); // "+1235"
(1234.56789).ToStringWithSign(5); // "+1234.6"
(1234.56789).ToStringWithSign(6); // "+1234.57"
(-1234.56789).ToStringWithSign(6); // "-1234.57"
(1.2345678).ToStringWithSign(6); // "+1.23457"
(1.2345678).ToStringWithSign(6, true); // "+1.23456"
Если вы хотите усечение:
string str = number.ToString("+0.00000;-0.00000").Substring(0,7);
Если вы хотите округлить:
string str = number.ToString("+0.0000;-0.0000");
РЕДАКТИРОВАТЬ: если вы хотите, вы можете написать простую оболочку, которая принимает количество цифр в качестве параметра:
string FormatDecimal(decimal value, int digits )
{
return value
.ToString(String.Format("+0.{0};-0.{0}", new string('0',digits - 2)))
.Substring(0,digits+1);
}
Я считаю, что если вы хотите вывести до 6 символов, включая десятичную точку, вы можете посмотреть на это
double val1 = -99.56789;
//string strval = val1.ToString("+#.######;-#.######");// add # for additional decimal places
string strval = val1.ToString("+#.000000;-#.000000");
Console.WriteLine(strval.Substring(0,strval.Length >= 7 ? 7 : strval.Length));
//output -99.567 if positive would output +99.567
Вам просто нужно преобразовать значение в строку, а затем выбрать соответствующие 6 символов (дополнительный для знака) из выведенной строки.
В этом случае нет округления, которое соответствует вашим потребностям, надеюсь, это то, что вы ищете.
Это должно делать то, что вы хотите. Это действительно вокруг последней цифры, хотя.
static string Format(double d)
{
// define how many number should be visible
int digits = 5;
// Get the left part of the number (ignore negative sign for now)
int s = Math.Abs(d).ToString("####0").Length;
// Total size minus the amount of numbers left of the decimal point
int precision = digits - s;
// Left side for positive, right side for negative.
// All it's doing is generating as many 0s as we need for precision.
string format = String.Format("+###0.{0};-###0.{0}", new String('0', precision));
return d.ToString(format);
}
Учитывая ваш вклад, это возвращает:
+1.2346
-12.346
-0.1235
+1234.6
Это будет обрабатывать нули без проблем:
+0.1000
+0.0000
+1000.0
Попробуй это:
double myDouble = 1546.25469874;
string myStr = string.Empty;
if (myDouble > 0)
{
myStr = myDouble.ToString("+0.0###");
}
else
{
myStr = myDouble.ToString("0.0####");
}
if (myStr.Length > 7)
{
myStr = myStr.Remove(7).TrimEnd('.');
}
Как указано здесь в MSDN, "0" - это место для цифры. Итак, все что вам нужно это:
myDecimal.ToString("000000");
или же
myDecimal.ToString("######");
если вам не нужна цифра вместо нуля.