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(0.02565, space, 3 );
write(-0.12565, space, 2);
write(-0.12565, space, 3);
write(0.02565, space, 3 );
write(-0.178565, space, 3);
write(-0.99999, space, 3);
write(0.99999, space, 2);
write(0.99999, space, 5);
write(0.0000789, space, 3);
Console.WriteLine($"\n\n[{new String(' ', space)}] <--- needs to fit in here ({space} characters)");
write(0.02565, space, 3 );
write(-0.12565, space, 2);
write(-0.12565, space, 3);
write(0.02565, space, 3 );
write(-0.178565, space, 3);
write(-0.99999, space, 3);
write(0.99999, space, 2);
write(0.99999, space, 5);
write(0.0000789, space, 3);
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, 5);
write(0.0021999999, space, 7);
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 ? 1 : 0) - (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;
char roundingFormat = roundDecimalToDigits == null ? '#' : '0';
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);
avlDecimalSpaces = avlSpaceSciNotation - minSpaceNeededSciNotation - 1;
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)
if (absInputNum > 0 && absInputNum < 1)
avlDecimalSpaces = Math.Min(roundDecimalToDigits ?? avlSpace, avlSpace);
avlDecimalSpaces = (avlDecimalSpaces == avlSpace && Math.Round(absInputNum, avlDecimalSpaces) == 1) ? --avlDecimalSpaces : avlDecimalSpaces;
avlDecimalSpaces = avlDecimalSpaces < 0 ? 0 : avlDecimalSpaces;
fittedNumStr = inputNum.ToString("#." + new string(roundingFormat, avlDecimalSpaces), CultureInfo.InvariantCulture);
avlDecimalSpaces = avlSpace - numsBeforeDecPoint;
avlDecimalSpaces = Math.Min(roundDecimalToDigits ?? avlDecimalSpaces, avlDecimalSpaces);
avlDecimalSpaces = avlDecimalSpaces < 0 ? 0 : avlDecimalSpaces;
fittedNumStr = inputNum.ToString("0." + new string(roundingFormat, avlDecimalSpaces), CultureInfo.InvariantCulture);
bool hasDecimal = fittedNumStr.IndexOf('.') != -1;
if (!hasDecimal && !usingSciNot && !isNanOrInfinity) fittedNumStr = fittedNumStr + '.';
if (!isNegative && fittedNumStr.Substring(0,1) == "." && fittedNumStr.Length < space) fittedNumStr = '0' + fittedNumStr;
if (isNegative && fittedNumStr.Substring(1, 1) == "." && fittedNumStr.Length < space) fittedNumStr = fittedNumStr.Insert(1, "0");
if (fittedNumStr.Substring(fittedNumStr.Length - 1) == "." && fittedNumStr.Length < space) fittedNumStr = fittedNumStr + '0';
fittedNumStr = padRight ? fittedNumStr.PadRight(space) : fittedNumStr.PadLeft(space);