Super-Nostalgia-Zone/Bevels/Extensions/Formatting.cs

94 lines
2.3 KiB
C#

using System.Globalization;
using System.Linq;
// This global class defines extension methods to numeric types
// where I don't want system globalization to come into play.
public static class Format
{
private const string decimalFmt = "0.00";
private static CultureInfo invariant => CultureInfo.InvariantCulture;
private static string filterNan(string value, string replace = decimalFmt)
{
if (value.ToLower() == "nan")
value = replace;
return value;
}
public static string ToInvariantString(this float value)
{
string result = value.ToString(decimalFmt, invariant);
return filterNan(result);
}
public static string ToInvariantString(this double value)
{
string result = value.ToString(decimalFmt, invariant);
return filterNan(result);
}
public static string ToInvariantString(this int value)
{
return value.ToString(invariant);
}
public static string ToInvariantString(this object value)
{
if (value is float)
{
float f = (float)value;
return f.ToInvariantString();
}
else if (value is double)
{
double d = (double)value;
return d.ToInvariantString();
}
else if (value is int)
{
int i = (int)value;
return i.ToInvariantString();
}
else
{
// Unhandled
return value.ToString();
}
}
public static float ParseFloat(string s)
{
return float.Parse(s, invariant);
}
public static double ParseDouble(string s)
{
return double.Parse(s, invariant);
}
public static int ParseInt(string s)
{
return int.Parse(s, invariant);
}
public static string FormatFloats(params float[] values)
{
string[] results = values
.Select(value => value.ToInvariantString())
.ToArray();
for (int i = 0; i < results.Length; i++)
{
string result = results[i];
while (result.Contains(".") && (result.EndsWith("0") || result.EndsWith(".")))
result = result.Substring(0, result.Length - 1);
results[i] = result;
}
return '[' + string.Join("][", results) + ']';
}
}