Roblox-File-Format/Utility/Formatting.cs
CloneTrooper1019 de8df15d3f Large scale refactor to add class support!
Instance classes are now strongly typed with real property fields that
are derived from the JSON API Dump! This required a lot of reworking
across the board:

- Classes and Enums are auto-generated in the 'Generated' folder now.
This is done using a custom built-in plugin, which can be found in
the Plugins folder of this project.
- Property objects are now tied to .NET's reflection system. Reading
and writing from them will try to redirect into a field of the
Instance they are bound to.
- Property types that were loosely defined now have proper data types
(such as Color3uint8, Content, ProtectedString, SharedString, etc)
- Fixed an error with the CFrame directional vectors.
- The binary PRNT chunk now writes instances in child->parent order.
- Enums are now generated correctly, with up-to-date values.
- INST chunks are now referred to as 'Classes' instead of 'Types'.
- Unary operator added to Vector2 and Vector3.
- CollectionService tags can now be manipulated per-instance using
the Instance.Tags member.
- The Instance.Archivable property now works correctly.
- XML files now save/load metadata correctly.
- Cleaned up the property tokens directory.

I probably missed a few things, but that's a general overview of
everything that changed.
2019-06-30 17:01:19 -05:00

115 lines
2.7 KiB
C#

using System;
using System.Globalization;
internal static class Formatting
{
private static CultureInfo invariant => CultureInfo.InvariantCulture;
public static string ToInvariantString(this float value)
{
string result;
if (float.IsPositiveInfinity(value))
result = "INF";
else if (float.IsNegativeInfinity(value))
result = "-INF";
else if (float.IsNaN(value))
result = "NAN";
else
result = value.ToString(invariant);
return result;
}
public static string ToInvariantString(this double value)
{
string result;
if (double.IsPositiveInfinity(value))
result = "INF";
else if (double.IsNegativeInfinity(value))
result = "-INF";
else if (double.IsNaN(value))
result = "NAN";
else
result = value.ToString(invariant);
return 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 value)
{
float result;
if (value == "INF")
result = float.PositiveInfinity;
else if (value == "-INF")
result = float.NegativeInfinity;
else if (value == "NAN")
result = float.NaN;
else
result = float.Parse(value, invariant);
return result;
}
public static double ParseDouble(string value)
{
double result;
if (value == "INF")
result = double.PositiveInfinity;
else if (value == "-INF")
result = double.NegativeInfinity;
else if (value == "NAN")
result = double.NaN;
else
result = double.Parse(value, invariant);
return result;
}
public static int ParseInt(string s)
{
return int.Parse(s, invariant);
}
public static bool FuzzyEquals(this float a, float b, float epsilon = 10e-5f)
{
return Math.Abs(a - b) < epsilon;
}
public static bool FuzzyEquals(this double a, double b, double epsilon = 10e-5)
{
return Math.Abs(a - b) < epsilon;
}
}