/* --------------------------------------- * Author: Started by David Mkrtchyan, modified by Martin Pane (martintayx@gmail.com) (@tayx94) * Collaborators: Lars Aalbertsen (@Rockylars) * Project: Graphy - Ultimate Stats Monitor * Date: 18-May-18 * Studio: Tayx * * This project is released under the MIT license. * Attribution is not required, but it is always welcomed! * -------------------------------------*/ using UnityEngine; namespace Tayx.Graphy.Utils.NumString { public static class G_FloatString { /* ----- TODO: ---------------------------- * Try and move the Init to a core method. * Try and replace the Pow function with a better algorithm. * --------------------------------------*/ #region Variables -> Private /// /// Float represented as a string, formatted. /// private const string floatFormat = "0.0"; /// /// The currently defined, globally used decimal multiplier. /// private static float decimalMultiplier = 1f; /// /// List of negative floats casted to strings. /// private static string[] negativeBuffer = new string[0]; /// /// List of positive floats casted to strings. /// private static string[] positiveBuffer = new string[0]; #endregion #region Properties -> Public /// /// Have the int buffers been initialized? /// public static bool Inited { get { return negativeBuffer.Length > 0 || positiveBuffer.Length > 0; } } /// /// The lowest float value of the existing number buffer. /// public static float MinValue { get { return -(negativeBuffer.Length - 1).FromIndex(); } } /// /// The highest float value of the existing number buffer. /// public static float MaxValue { get { return (positiveBuffer.Length - 1).FromIndex(); } } #endregion #region Methods -> Public //TODO: Figure out what the negative buffer doe, why we dont have default values and why the range is so high. /// /// Initialize the buffers. /// /// /// Lowest negative value allowed. /// /// /// Highest positive value allowed. /// /// /// How many decimals will the values use? /// public static void Init(float minNegativeValue, float maxPositiveValue, int decimals = 1) { decimalMultiplier = Pow(10, Mathf.Clamp(decimals, 1, 5)); int negativeLength = minNegativeValue.ToIndex(); int positiveLength = maxPositiveValue.ToIndex(); if (negativeLength >= 0) { negativeBuffer = new string[negativeLength]; for (int i = 0; i < negativeLength; i++) { negativeBuffer[i] = (-i).FromIndex().ToString(floatFormat); } } if (positiveLength >= 0) { positiveBuffer = new string[positiveLength]; for (int i = 0; i < positiveLength; i++) { positiveBuffer[i] = i.FromIndex().ToString(floatFormat); } } } /// /// Returns this float as a cached string. /// /// /// The required float. /// /// /// A cached number string. /// public static string ToStringNonAlloc(this float value) { int valIndex = value.ToIndex(); if (value < 0 && valIndex < negativeBuffer.Length) { return negativeBuffer[valIndex]; } if (value >= 0 && valIndex < positiveBuffer.Length) { return positiveBuffer[valIndex]; } return value.ToString(); } //TODO: Convert this to use floatFormat instead, but investigate which functions require and dont require one first. /// /// Returns this float as a cached string. /// /// /// The required float. /// /// /// A cached number string. /// public static string ToStringNonAlloc(this float value, string format) { int valIndex = value.ToIndex(); if (value < 0 && valIndex < negativeBuffer.Length) { return negativeBuffer[valIndex]; } if (value >= 0 && valIndex < positiveBuffer.Length) { return positiveBuffer[valIndex]; } return value.ToString(format); } /// /// Returns a float as a casted int. /// /// /// The given float. /// /// /// The given float as an int. /// public static int ToInt(this float f) { return (int)f; } /// /// Returns an int as a casted float. /// /// /// The given int. /// /// /// The given int as a float. /// public static float ToFloat(this int i) { return (float)i; } #endregion #region Methods -> Private //TODO: Replace this with a better algorithm. private static int Pow(int f, int p) { for (int i = 1; i < p; i++) { f *= f; } return f; } private static int ToIndex(this float f) { return Mathf.Abs((f * decimalMultiplier).ToInt()); } private static float FromIndex(this int i) { return (i.ToFloat() / decimalMultiplier); } #endregion } }