String.Format - Как я могу отформатировать до x цифр (независимо от десятичной точки)?
Мне нужно отформатировать число с плавающей запятой до x символов (6 в моем случае, включая десятичную точку). Мой вывод также должен содержать знак числа
Таким образом, учитывая входные данные, вот ожидаемые выходы
1.23456 => +1.2345
-12.34567 => -12.345
-0.123456 => -0.1234
1234.567 => +1234.5
Предположим, что перед последним символом всегда есть десятичное место. То есть номер входного сигнала 12345.6
не будет - вход всегда будет меньше или равен 9999.9
.
Я думаю, что это нужно делать условно.
Ответы
Ответ 1
Здесь прозрачный способ сделать это без форматирования строк (кроме "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
EDIT
Обратите внимание, что он не прерывает завершающие нули.
Ответ 2
Вы указываете "x символы". Поэтому мы можем упростить это до "x-1 цифр" и просто написать код, который показывает цифры x.
Я думаю, передавая "спецификатор числового формата" для Double.ToString()
находится так же близко к встроенному, как вы можете получить.
double d = 1234.56789;
string s = d.ToString("G6"); // "1234.57"
Итак, мы просто расширим это, чтобы вручную добавить "+" спереди:
if (d > 0)
s = "+" + s;
Объединяя все вместе в методе расширения:
EDIT: включает необязательный параметр для усечения
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"
Ответ 3
Если вы хотите усечь:
string str = number.ToString("+0.00000;-0.00000").Substring(0,7);
Если вы хотите округлить:
string str = number.ToString("+0.0000;-0.0000");
EDIT: если вы хотите, вы можете написать простую оболочку, которая принимает число цифр в качестве параметра:
string FormatDecimal(decimal value, int digits )
{
return value
.ToString(String.Format("+0.{0};-0.{0}", new string('0',digits - 2)))
.Substring(0,digits+1);
}
Ответ 4
Я считаю, что если вы хотите вывести на 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 символов (дополнительные для знака) из выведенной строки.
В этом случае нет округления и соответствует вашим потребностям, надеюсь, что это то, что вы ищете.
Ответ 5
Попробуйте следующее:
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('.');
}
Ответ 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 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
Ответ 7
Как указано здесь по MSDN, "0" является держателем места для цифры. Итак, все, что вам нужно, это:
myDecimal.ToString("000000");
или
myDecimal.ToString("######");
если вам не нужна цифра вместо нуля.