/* --------------------------------------- * Author: Started by David Mkrtchyan, modified by Martin Pane (martintayx@gmail.com) (@martinTayx) * 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(); } /// /// 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 } }