using System.Collections.Generic;
using System.Globalization;
public static void Main()
Console.WriteLine($"[{new String(' ', space)}] <--- needs to fit in here ({space} characters)");
write(Double.NaN, space);
write(Double.MaxValue, space);
write(Double.MinValue, space);
write(Double.PositiveInfinity, space);
write(Double.NegativeInfinity, space);
Console.WriteLine($"\n\n[{new String(' ', space)}] <--- needs to fit in here ({space} characters)");
write(Double.NaN, space);
write(Double.MaxValue, space);
write(Double.MinValue, space);
write(Double.PositiveInfinity, space);
write(Double.NegativeInfinity, space);
Console.WriteLine($"\n\n[{new String(' ', space)}] <--- needs to fit in here ({space} characters)");
write(Double.NaN, space);
write(Double.MaxValue, space);
write(Double.MinValue, space);
write(Double.PositiveInfinity, space);
write(Double.NegativeInfinity, space);
Console.WriteLine($"\n\n[{new String(' ', space)}] <--- needs to fit in here ({space} characters)");
write(26.6700000762939, space);
write(26.67123456, space);
write(12345678901, space);
write(-0.00000000000123456, space);
write(0.0021989234, space);
write(0.0021999999, space);
write(-0.0021999999, space);
write(8888888888, space);
write(-0.00000567, space);
write(Double.NaN, space);
write(Double.MaxValue, space);
write(Double.MinValue, space);
write(Double.PositiveInfinity, space);
write(Double.NegativeInfinity, space);
Console.WriteLine("\n\n--- Rounding Cases---\n\n");
write(88888888888.1, space, 3);
write(12345678901, space, -3);
write(-0.00000000000123456, space, -3);
write(0.0021989234, space, 300);
write(0.0021999999, space, 300);
write(88888888888.1, space, 3);
write(12345678901, space, 3);
write(-0.00000000000123456, space, 3);
write(0.0021989234, space, 3);
write(0.0021999999, space, 3);
write(-0.0021999999, space, 3);
write(8888888888, space, 3);
write(9234567, space, 3);
write(-0.00000567, space, 3);
write(Double.NaN, space, 3);
write(Double.MaxValue, space, 3);
write(Double.MinValue, space, 3);
write(Double.PositiveInfinity, space, 3);
write(Double.NegativeInfinity, space, 3);
static void write(double inputNum, int space, int? roundDecimalToDigits = null)
if (roundDecimalToDigits == null)
Console.Write(FitNumberToSpace(inputNum, space));
Console.Write(FitNumberToSpace(inputNum, space, roundDecimalToDigits));
Console.WriteLine($"] <-- Input= {inputNum} Space= {space} Round = {roundDecimalToDigits}");
public static string FitNumberToSpace(double inputNum, int space, int? roundDecimalToDigits = null, bool padRight = false)
if (space < 1) return "";
double absInputNum = Math.Abs(inputNum);
string numStr = inputNum.ToString("0." + new String('#', 339));
string absInputNumStr = absInputNum.ToString("0." + new String('#', 339));
bool isNegative = inputNum < 0;
bool inputNumHasDecimal = absInputNumStr.IndexOf('.') != -1;
string fittedNumStr = numStr;
bool isNanOrInfinity = (double.IsNaN(absInputNum) || double.IsInfinity(absInputNum))? true : false;
int avlSpace = space - (isNanOrInfinity ? 0 : 1) - (isNegative ? 1 : 0);
int numsBeforeDecPoint = inputNumHasDecimal ? absInputNumStr.IndexOf('.') : absInputNumStr.Length;
bool largeNum = numsBeforeDecPoint > avlSpace;
bool tinyNum = absInputNum > 0 && absInputNum < 5 * Math.Pow(10, - (avlSpace));
bool usingSciNot = false;
int avlSpaceSciNotation = isNegative ? space - 1 : space;
int noOfExpDigits = (tinyNum ? (absInputNumStr.IndexOf(absInputNumStr.First<char>(c => c != '.' && c > '0')) - 1) : (numsBeforeDecPoint - 1 )).ToString().Length;
int minSpaceNeededSciNotation = (tinyNum ? 3 : 2) + noOfExpDigits;
if (avlSpaceSciNotation < minSpaceNeededSciNotation) return new string('#', space);
int avlDecimalSpaces = avlSpaceSciNotation - minSpaceNeededSciNotation - 1;
avlDecimalSpaces = Math.Min(roundDecimalToDigits ?? avlDecimalSpaces, avlDecimalSpaces);
avlDecimalSpaces = avlDecimalSpaces < 0 ? 0 : avlDecimalSpaces;
fittedNumStr = inputNum.ToString("0." + new string('#', avlDecimalSpaces) + "E-0", CultureInfo.InvariantCulture);
if (fittedNumStr.Length > space) return new string('#', space);
else if (!isNanOrInfinity)
int avlDecimalSpaces = avlSpace - numsBeforeDecPoint;
avlDecimalSpaces = Math.Min(roundDecimalToDigits ?? avlDecimalSpaces, avlDecimalSpaces);
avlDecimalSpaces = avlDecimalSpaces < 0 ? 0 : avlDecimalSpaces;
if (absInputNum > 0 && absInputNum < 1)
fittedNumStr = inputNum.ToString("0." + new string('#', avlDecimalSpaces), CultureInfo.InvariantCulture);
fittedNumStr = inputNum.ToString("0." + new string('#', avlDecimalSpaces), CultureInfo.InvariantCulture);
bool hasDecimal = fittedNumStr.IndexOf('.') != -1;
if (!hasDecimal && !usingSciNot && !isNanOrInfinity) fittedNumStr = fittedNumStr + '.';
if (fittedNumStr.Substring(fittedNumStr.Length - 1) == "." && fittedNumStr.Length < space) fittedNumStr = fittedNumStr + '0';
fittedNumStr = padRight ? fittedNumStr.PadRight(space) : fittedNumStr.PadLeft(space);