AT.MIN.Tools.sprintf C# (CSharp) Méthode

sprintf() public static méthode

public static sprintf ( string Format ) : string
Format string
Résultat string
		public static string sprintf( string Format, params object[] Parameters )
		{
			#region Variables
			StringBuilder f = new StringBuilder();
			//Regex r = new Regex( @"\%(\d*\$)?([\'\#\-\+ ]*)(\d*)(?:\.(\d+))?([hl])?([dioxXucsfeEgGpn%])" );
			//"%[parameter][flags][width][.precision][length]type"
			Match m = null;
			string w = String.Empty;
			int defaultParamIx = 0;
			int paramIx;
			object o = null;

			bool flagLeft2Right = false;
			bool flagAlternate = false;
			bool flagPositiveSign = false;
			bool flagPositiveSpace = false;
			bool flagZeroPadding = false;
			bool flagGroupThousands = false;

			int fieldLength = 0;
			int fieldPrecision = 0;
			char shortLongIndicator = '\0';
			char formatSpecifier = '\0';
			char paddingCharacter = ' ';
			#endregion

			// find all format parameters in format string
			f.Append( Format );
			m = r.Match( f.ToString() );
			while ( m.Success )
			{
				#region parameter index
				paramIx = defaultParamIx;
				if ( m.Groups[1] != null && m.Groups[1].Value.Length > 0 )
				{
					string val = m.Groups[1].Value.Substring( 0, m.Groups[1].Value.Length - 1 );
					paramIx = Convert.ToInt32( val ) - 1;
				};
				#endregion

				#region format flags
				// extract format flags
				flagAlternate = false;
				flagLeft2Right = false;
				flagPositiveSign = false;
				flagPositiveSpace = false;
				flagZeroPadding = false;
				flagGroupThousands = false;
				if ( m.Groups[2] != null && m.Groups[2].Value.Length > 0 )
				{
					string flags = m.Groups[2].Value;

					flagAlternate = ( flags.IndexOf( '#' ) >= 0 );
					flagLeft2Right = ( flags.IndexOf( '-' ) >= 0 );
					flagPositiveSign = ( flags.IndexOf( '+' ) >= 0 );
					flagPositiveSpace = ( flags.IndexOf( ' ' ) >= 0 );
					flagGroupThousands = ( flags.IndexOf( '\'' ) >= 0 );

					// positive + indicator overrides a
					// positive space character
					if ( flagPositiveSign && flagPositiveSpace )
						flagPositiveSpace = false;
				}
				#endregion

				#region field length
				// extract field length and 
				// pading character
				paddingCharacter = ' ';
				fieldLength = int.MinValue;
				if ( m.Groups[3] != null && m.Groups[3].Value.Length > 0 )
				{
					fieldLength = Convert.ToInt32( m.Groups[3].Value );
					flagZeroPadding = ( m.Groups[3].Value[0] == '0' );
				}
				#endregion

				if ( flagZeroPadding )
					paddingCharacter = '0';

				// left2right allignment overrides zero padding
				if ( flagLeft2Right && flagZeroPadding )
				{
					flagZeroPadding = false;
					paddingCharacter = ' ';
				}

				#region field precision
				// extract field precision
				fieldPrecision = int.MinValue;
				if ( m.Groups[4] != null && m.Groups[4].Value.Length > 0 )
					fieldPrecision = Convert.ToInt32( m.Groups[4].Value );
				#endregion

				#region short / long indicator
				// extract short / long indicator
				shortLongIndicator = Char.MinValue;
				if ( m.Groups[5] != null && m.Groups[5].Value.Length > 0 )
					shortLongIndicator = m.Groups[5].Value[0];
				#endregion

				#region format specifier
				// extract format
				formatSpecifier = Char.MinValue;
				if ( m.Groups[6] != null && m.Groups[6].Value.Length > 0 )
					formatSpecifier = m.Groups[6].Value[0];
				#endregion

				// default precision is 6 digits if none is specified except
				if ( fieldPrecision == int.MinValue &&
					formatSpecifier != 's' &&
					formatSpecifier != 'c' &&
					Char.ToUpper( formatSpecifier ) != 'X' &&
					formatSpecifier != 'o' )
					fieldPrecision = 6;

				#region get next value parameter
				// get next value parameter and convert value parameter depending on short / long indicator
				if ( Parameters == null || paramIx >= Parameters.Length )
					o = null;
				else
				{
					o = Parameters[paramIx];

					if ( shortLongIndicator == 'h' )
					{
						if ( o is int )
							o = (short)( (int)o );
						else if ( o is long )
							o = (short)( (long)o );
						else if ( o is uint )
							o = (ushort)( (uint)o );
						else if ( o is ulong )
							o = (ushort)( (ulong)o );
					}
					else if ( shortLongIndicator == 'l' )
					{
						if ( o is short )
							o = (long)( (short)o );
						else if ( o is int )
							o = (long)( (int)o );
						else if ( o is ushort )
							o = (ulong)( (ushort)o );
						else if ( o is uint )
							o = (ulong)( (uint)o );
					}
				}
				#endregion

				// convert value parameters to a string depending on the formatSpecifier
				w = String.Empty;
				switch ( formatSpecifier )
				{
					#region % - character
					case '%':   // % character
						w = "%";
						break;
					#endregion
					#region d - integer
					case 'd':   // integer
						w = FormatNumber( ( flagGroupThousands ? "n" : "d" ), flagAlternate,
										fieldLength, int.MinValue, flagLeft2Right,
										flagPositiveSign, flagPositiveSpace,
										paddingCharacter, o );
						defaultParamIx++;
						break;
					#endregion
					#region i - integer
					case 'i':   // integer
						goto case 'd';
					#endregion
					#region o - octal integer
					case 'o':   // octal integer - no leading zero
						w = FormatOct( "o", flagAlternate,
										fieldLength, int.MinValue, flagLeft2Right,
										paddingCharacter, o );
						defaultParamIx++;
						break;
					#endregion
					#region x - hex integer
					case 'x':   // hex integer - no leading zero
						w = FormatHex( "x", flagAlternate,
										fieldLength, fieldPrecision, flagLeft2Right,
										paddingCharacter, o );
						defaultParamIx++;
						break;
					#endregion
					#region X - hex integer
					case 'X':   // same as x but with capital hex characters
						w = FormatHex( "X", flagAlternate,
										fieldLength, fieldPrecision, flagLeft2Right,
										paddingCharacter, o );
						defaultParamIx++;
						break;
					#endregion
					#region u - unsigned integer
					case 'u':   // unsigned integer
						w = FormatNumber( ( flagGroupThousands ? "n" : "d" ), flagAlternate,
										fieldLength, int.MinValue, flagLeft2Right,
										false, false,
										paddingCharacter, ToUnsigned( o ) );
						defaultParamIx++;
						break;
					#endregion
					#region c - character
					case 'c':   // character
						if ( IsNumericType( o ) )
							w = Convert.ToChar( o ).ToString();
						else if ( o is char )
							w = ( (char)o ).ToString();
						else if ( o is string && ( (string)o ).Length > 0 )
							w = ( (string)o )[0].ToString();
						defaultParamIx++;
						break;
					#endregion
					#region s - string
					case 's':   // string
						string t = "{0" + ( fieldLength != int.MinValue ? "," + ( flagLeft2Right ? "-" : String.Empty ) + fieldLength.ToString() : String.Empty ) + ":s}";
						w = o.ToString();
						if ( fieldPrecision >= 0 )
							w = w.Substring( 0, fieldPrecision );

						if ( fieldLength != int.MinValue )
							if ( flagLeft2Right )
								w = w.PadRight( fieldLength, paddingCharacter );
							else
								w = w.PadLeft( fieldLength, paddingCharacter );
						defaultParamIx++;
						break;
					#endregion
					#region f - double number
					case 'f':   // double
						w = FormatNumber( ( flagGroupThousands ? "n" : "f" ), flagAlternate,
										fieldLength, fieldPrecision, flagLeft2Right,
										flagPositiveSign, flagPositiveSpace,
										paddingCharacter, o );
						defaultParamIx++;
						break;
					#endregion
					#region e - exponent number
					case 'e':   // double / exponent
						w = FormatNumber( "e", flagAlternate,
										fieldLength, fieldPrecision, flagLeft2Right,
										flagPositiveSign, flagPositiveSpace,
										paddingCharacter, o );
						defaultParamIx++;
						break;
					#endregion
					#region E - exponent number
					case 'E':   // double / exponent
						w = FormatNumber( "E", flagAlternate,
										fieldLength, fieldPrecision, flagLeft2Right,
										flagPositiveSign, flagPositiveSpace,
										paddingCharacter, o );
						defaultParamIx++;
						break;
					#endregion
					#region g - general number
					case 'g':   // double / exponent
						w = FormatNumber( "g", flagAlternate,
										fieldLength, fieldPrecision, flagLeft2Right,
										flagPositiveSign, flagPositiveSpace,
										paddingCharacter, o );
						defaultParamIx++;
						break;
					#endregion
					#region G - general number
					case 'G':   // double / exponent
						w = FormatNumber( "G", flagAlternate,
										fieldLength, fieldPrecision, flagLeft2Right,
										flagPositiveSign, flagPositiveSpace,
										paddingCharacter, o );
						defaultParamIx++;
						break;
					#endregion
					#region p - pointer
					case 'p':   // pointer
						if ( o is IntPtr )
#if XBOX || SILVERLIGHT
							w = ( (IntPtr)o ).ToString();
#else
							w = "0x" + ( (IntPtr)o ).ToString( "x" );
#endif
						defaultParamIx++;
						break;
					#endregion
					#region n - number of processed chars so far
					case 'n':   // number of characters so far
						w = FormatNumber( "d", flagAlternate,
										fieldLength, int.MinValue, flagLeft2Right,
										flagPositiveSign, flagPositiveSpace,
										paddingCharacter, m.Index );
						break;
					#endregion
					default:
						w = String.Empty;
						defaultParamIx++;
						break;
				}

				// replace format parameter with parameter value
				// and start searching for the next format parameter
				// AFTER the position of the current inserted value
				// to prohibit recursive matches if the value also
				// includes a format specifier
				f.Remove( m.Index, m.Length );
				f.Insert( m.Index, w );
				m = r.Match( f.ToString(), m.Index + w.Length );
			}

			return f.ToString();
		}
		#endregion

Usage Example

Exemple #1
0
        public static void printf(string Format, params object[] Parameters)
        {
#if UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5
            UnityEngine.Debug.Log(Tools.sprintf(Format, Parameters));
#else
            Console.Write(Tools.sprintf(Format, Parameters));
#endif
        }
All Usage Examples Of AT.MIN.Tools::sprintf