/* --------------------------------------- * Author: Started by David Mkrtchyan, modified by Martin Pane (martintayx@gmail.com) (@tayx94) * Contributors: https://github.com/Tayx94/graphy/graphs/contributors * Project: Graphy - Ultimate Stats Monitor * Date: 18-May-18 * Studio: Tayx * * Git repo: https://github.com/Tayx94/graphy * * 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 { #region Variables -> Private /// /// Float represented as a string, formatted. /// private const string m_floatFormat = "0.0"; /// /// The currently defined, globally used decimal multiplier. /// private static float m_decimalMultiplier = 10f; /// /// List of negative floats casted to strings. /// private static string[] m_negativeBuffer = new string[0]; /// /// List of positive floats casted to strings. /// private static string[] m_positiveBuffer = new string[0]; #endregion #region Properties -> Public /// /// The lowest float value of the existing number buffer. /// public static float MinValue => -(m_negativeBuffer.Length - 1).FromIndex(); /// /// The highest float value of the existing number buffer. /// public static float MaxValue => (m_positiveBuffer.Length - 1).FromIndex(); #endregion #region Methods -> Public /// /// Initialize the buffers. /// /// /// Lowest negative value allowed. /// /// /// Highest positive value allowed. /// public static void Init( float minNegativeValue, float maxPositiveValue ) { int negativeLength = minNegativeValue.ToIndex(); int positiveLength = maxPositiveValue.ToIndex(); if ( MinValue > minNegativeValue && negativeLength >= 0 ) { m_negativeBuffer = new string[ negativeLength ]; for ( int i = 0; i < negativeLength; i++ ) { m_negativeBuffer[ i ] = (-i - 1).FromIndex().ToString( m_floatFormat ); } } if ( MaxValue < maxPositiveValue && positiveLength >= 0 ) { m_positiveBuffer = new string[ positiveLength + 1 ]; for ( int i = 0; i < positiveLength + 1; i++ ) { m_positiveBuffer[ i ] = i.FromIndex().ToString( m_floatFormat ); } } } public static void Dispose() { m_negativeBuffer = new string[0]; m_positiveBuffer = new string[0]; } /// /// 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 < m_negativeBuffer.Length) { return m_negativeBuffer[valIndex]; } if (value >= 0 && valIndex < m_positiveBuffer.Length) { return m_positiveBuffer[valIndex]; } return value.ToString(); } //TODO: Convert this to use m_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 < m_negativeBuffer.Length) { return m_negativeBuffer[valIndex]; } if (value >= 0 && valIndex < m_positiveBuffer.Length) { return m_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 private static int ToIndex(this float f) { return Mathf.Abs((f * m_decimalMultiplier).ToInt()); } private static float FromIndex(this int i) { return (i.ToFloat() / m_decimalMultiplier); } #endregion } }