using System.Collections.Generic;
using System.Globalization;
public static void Main()
var str = FitNumberToSize(d, space);
Console.WriteLine($"[ ] <--- needs to fit in here ({space} characters)");
write(FitNumberToSize(-0.00000000000123456, space));
write(FitNumberToSize(0.0021989234, space));
write(FitNumberToSize(0.0021999999, space));
static void write(string str)
public static string FitNumberToSize(double inputNum, int displaySize)
if (displaySize < 1) return "";
double absNum = Math.Abs(inputNum);
string numStr = inputNum.ToString("0." + new String('#', 339));
string absNumStr = absNum.ToString("0." + new String('#', 339));
bool isNegative = inputNum < 0;
bool hasDecimal = absNumStr.IndexOf('.') != -1;
string fittedNumStr = numStr;
int absNumLen = absNumStr.Length;
int avlSize = isNegative ? displaySize - 2 : displaySize - 1;
int numLenBeforeDec = hasDecimal ? absNumStr.IndexOf('.') : absNumLen;
if (numLenBeforeDec > avlSize) return new string('#', displaySize);
if (!hasDecimal) fittedNumStr = fittedNumStr + '.';
if (!hasDecimal && fittedNumStr.Length < displaySize) fittedNumStr = fittedNumStr + '0';
if (absNum < Math.Pow(10, -(avlSize-1)))
int avlSizeExpNot = isNegative ? displaySize - 1 : displaySize;
char firstNon0char = absNumStr.First<char>(c => c != '.' && c > '0');
bool twoDigitExp = absNumStr.IndexOf(firstNon0char)-1 > 9;
int minSizeNeededExpNot = twoDigitExp ? 5 : 4;
if (avlSizeExpNot < minSizeNeededExpNot) return new string('#', displaySize);
int avlDecimalSpaces = avlSizeExpNot - minSizeNeededExpNot - 1;
avlDecimalSpaces = avlDecimalSpaces < 0 ? 0 : avlDecimalSpaces;
fittedNumStr = inputNum.ToString("0." + new string('#', avlDecimalSpaces) + "E-0", CultureInfo.InvariantCulture);
fittedNumStr = inputNum.ToString("0." + new string('#', avlSize - 1), CultureInfo.InvariantCulture);
if (!fittedNumStr.ToUpper().Contains("E"))
if (displaySize > fittedNumStr.Length)
fittedNumStr = fittedNumStr.PadLeft(fittedNumStr.Length + (displaySize - fittedNumStr.Length));