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

我想这必须有条件地完成。

这是一种透明的方式,没有格式字符串(“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字符”。 因此我们可以将其简化为“x-1 digits”,并只编写显示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("######");

如果你不想要一个数字而不是零。