2002-07-10 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / corlib / System / Int64.cs
index 459b77e93a32402b709627a4adf01176e583d9a8..a25e42e3725547098a9a1ee247100d02fc3e09c9 100644 (file)
@@ -114,82 +114,6 @@ namespace System {
                        return Parse (s, style, null);
                }
 
-               private delegate bool IsAnything (Char c);
-
-               private static void CheckStyle (NumberStyles style)
-               {
-                       if ((style & NumberStyles.AllowHexSpecifier) != 0) {
-                               NumberStyles ne = style ^ NumberStyles.AllowHexSpecifier;
-                               if ((ne & NumberStyles.AllowLeadingWhite) != 0)
-                                       ne ^= NumberStyles.AllowLeadingWhite;
-                               if ((ne & NumberStyles.AllowTrailingWhite) != 0)
-                                       ne ^= NumberStyles.AllowTrailingWhite;
-                               if (ne != 0)
-                                       throw new ArgumentException (
-                                               "With AllowHexSpecifier only " + 
-                                               "AllowLeadingWhite and AllowTrailingWhite " + 
-                                               "are permitted.");
-                       }
-               }
-               
-               private static int JumpOverWhite (int pos, string s, bool excp)
-               {
-                       while (pos < s.Length && Char.IsWhiteSpace (s [pos]))
-                               pos++;
-
-                       if (excp && pos >= s.Length)
-                               throw new FormatException ("Input string was not in the correct format.");
-
-                       return pos;
-               }
-
-               private static void FindSign (ref int pos, string s, NumberFormatInfo nfi, 
-                                     ref bool foundSign, ref bool negative)
-               {
-                       if ((pos + nfi.NegativeSign.Length) <= s.Length &&
-                            s.Substring (pos, nfi.NegativeSign.Length) == nfi.NegativeSign) {
-                               negative = true;
-                               foundSign = true;
-                               pos += nfi.NegativeSign.Length;
-                       } 
-                       else if ((pos + nfi.PositiveSign.Length) < s.Length &&
-                            s.Substring (pos, nfi.PositiveSign.Length) == nfi.PositiveSign) {
-                               negative = false;
-                               pos += nfi.PositiveSign.Length;
-                               foundSign = true;
-                       } 
-               }
-
-               private static void FindCurrency (ref int pos,
-                                                string s, 
-                                                NumberFormatInfo nfi,
-                                                ref bool foundCurrency)
-               {
-                       if ((pos + nfi.CurrencySymbol.Length) <= s.Length &&
-                            s.Substring (pos, nfi.CurrencySymbol.Length) == nfi.CurrencySymbol) {
-                               foundCurrency = true;
-                               pos += nfi.CurrencySymbol.Length;
-                       } 
-               }
-
-               private static bool FindOther (ref int pos,
-                                             string s, 
-                                             string other)
-               {
-                       if ((pos + other.Length) <= s.Length &&
-                            s.Substring (pos, other.Length) == other) {
-                               pos += other.Length;
-                               return true;
-                       } 
-
-                       return false;
-               }
-
-               private static bool is_hex (char e)
-               {
-                       return Char.IsDigit (e) || (e >= 'A' && e <= 'F') || (e >= 'a' && e <= 'f');
-               }
-
                public static long Parse (string s, NumberStyles style, IFormatProvider fp)
                {
                        if (s == null)
@@ -197,7 +121,7 @@ namespace System {
 
                        if (s.Length == 0)
                                throw new FormatException ("Input string was not " + 
-                                                          "in the correct format.");
+                                                          "in the correct format: s.Length==0.");
 
                        NumberFormatInfo nfi;
                        if (fp != null) {
@@ -207,7 +131,7 @@ namespace System {
                        else
                                nfi = Thread.CurrentThread.CurrentCulture.NumberFormat;
 
-                       CheckStyle (style);
+                       Int32.CheckStyle (style);
 
                        bool AllowCurrencySymbol = (style & NumberStyles.AllowCurrencySymbol) != 0;
                        bool AllowExponent = (style & NumberStyles.AllowExponent) != 0;
@@ -223,7 +147,7 @@ namespace System {
                        int pos = 0;
 
                        if (AllowLeadingWhite)
-                               pos = JumpOverWhite (pos, s, true);
+                               pos = Int32.JumpOverWhite (pos, s, true);
 
                        bool foundOpenParentheses = false;
                        bool negative = false;
@@ -238,54 +162,48 @@ namespace System {
                                                 // even when NumberFormatInfo.NumberNegativePattern != 0!!!
                                pos++;
                                if (AllowLeadingWhite)
-                                       pos = JumpOverWhite (pos, s, true);
+                                       pos = Int32.JumpOverWhite (pos, s, true);
 
                                if (s.Substring (pos, nfi.NegativeSign.Length) == nfi.NegativeSign)
                                        throw new FormatException ("Input string was not in the correct " +
-                                                                  "format.");
+                                                                  "format: Has Negative Sign.");
                                if (s.Substring (pos, nfi.PositiveSign.Length) == nfi.PositiveSign)
                                        throw new FormatException ("Input string was not in the correct " +
-                                                                  "format.");
+                                                                  "format: Has Positive Sign.");
                        }
 
                        if (AllowLeadingSign && !foundSign) {
                                // Sign + Currency
-                               FindSign (ref pos, s, nfi, ref foundSign, ref negative);
+                               Int32.FindSign (ref pos, s, nfi, ref foundSign, ref negative);
                                if (foundSign) {
                                        if (AllowLeadingWhite)
-                                               pos = JumpOverWhite (pos, s, true);
+                                               pos = Int32.JumpOverWhite (pos, s, true);
                                        if (AllowCurrencySymbol) {
-                                               FindCurrency (ref pos, s, nfi,
-                                                             ref foundCurrency);
+                                               Int32.FindCurrency (ref pos, s, nfi,
+                                                                   ref foundCurrency);
                                                if (foundCurrency && AllowLeadingWhite)
-                                                       pos = JumpOverWhite (pos, s, true);
+                                                       pos = Int32.JumpOverWhite (pos, s, true);
                                        }
                                }
                        }
                        
                        if (AllowCurrencySymbol && !foundCurrency) {
                                // Currency + sign
-                               FindCurrency (ref pos, s, nfi, ref foundCurrency);
+                               Int32.FindCurrency (ref pos, s, nfi, ref foundCurrency);
                                if (foundCurrency) {
                                        if (AllowLeadingWhite)
-                                               pos = JumpOverWhite (pos, s, true);
+                                               pos = Int32.JumpOverWhite (pos, s, true);
                                        if (foundCurrency) {
                                                if (!foundSign && AllowLeadingSign) {
-                                                       FindSign (ref pos, s, nfi, ref foundSign,
-                                                                 ref negative);
+                                                       Int32.FindSign (ref pos, s, nfi, ref foundSign,
+                                                                       ref negative);
                                                        if (foundSign && AllowLeadingWhite)
-                                                               pos = JumpOverWhite (pos, s, true);
+                                                               pos = Int32.JumpOverWhite (pos, s, true);
                                                }
                                        }
                                }
                        }
                        
-                       IsAnything validDigit;
-                       if (AllowHexSpecifier)
-                               validDigit = new IsAnything (is_hex);
-                       else
-                               validDigit = new IsAnything (Char.IsDigit);
-                       
                        long number = 0;
                        int nDigits = 0;
                        bool decimalPointFound = false;
@@ -295,13 +213,15 @@ namespace System {
                        // Number stuff
                        do {
 
-                               if (!validDigit (s [pos])) {
+                               if (!Int32.ValidDigit (s [pos], AllowHexSpecifier)) {
                                        if (AllowThousands &&
-                                           FindOther (ref pos, s, nfi.NumberGroupSeparator))
+                                           (Int32.FindOther (ref pos, s, nfi.NumberGroupSeparator)
+                                               || Int32.FindOther (ref pos, s, nfi.CurrencyGroupSeparator)))
                                            continue;
                                        else
                                        if (!decimalPointFound && AllowDecimalPoint &&
-                                           FindOther (ref pos, s, nfi.NumberDecimalSeparator)) {
+                                           (Int32.FindOther (ref pos, s, nfi.NumberDecimalSeparator)
+                                               || Int32.FindOther (ref pos, s, nfi.CurrencyDecimalSeparator))) {
                                            decimalPointFound = true;
                                            continue;
                                        }
@@ -347,45 +267,49 @@ namespace System {
 
                        // Post number stuff
                        if (nDigits == 0)
-                               throw new FormatException ("Input string was not in the correct format.");
+                               throw new FormatException ("Input string was not in the correct format: nDigits == 0.");
 
                        if (AllowTrailingSign && !foundSign) {
                                // Sign + Currency
-                               FindSign (ref pos, s, nfi, ref foundSign, ref negative);
+                               Int32.FindSign (ref pos, s, nfi, ref foundSign, ref negative);
                                if (foundSign) {
                                        if (AllowTrailingWhite)
-                                               pos = JumpOverWhite (pos, s, true);
+                                               pos = Int32.JumpOverWhite (pos, s, true);
                                        if (AllowCurrencySymbol)
-                                               FindCurrency (ref pos, s, nfi,
-                                                             ref foundCurrency);
+                                               Int32.FindCurrency (ref pos, s, nfi,
+                                                                   ref foundCurrency);
                                }
                        }
                        
                        if (AllowCurrencySymbol && !foundCurrency) {
                                // Currency + sign
-                               FindCurrency (ref pos, s, nfi, ref foundCurrency);
-                               if (foundCurrency) {
+                               if (nfi.CurrencyPositivePattern == 3 && s[pos++] != ' ')
+                                       throw new FormatException ("Input string was not in the correct format: no space between number and currency symbol.");
+
+                               Int32.FindCurrency (ref pos, s, nfi, ref foundCurrency);
+                               if (foundCurrency && pos < s.Length) {
                                        if (AllowTrailingWhite)
-                                               pos = JumpOverWhite (pos, s, true);
+                                               pos = Int32.JumpOverWhite (pos, s, true);
                                        if (!foundSign && AllowTrailingSign)
-                                               FindSign (ref pos, s, nfi, ref foundSign,
-                                                         ref negative);
+                                               Int32.FindSign (ref pos, s, nfi, ref foundSign,
+                                                               ref negative);
                                }
                        }
                        
                        if (AllowTrailingWhite && pos < s.Length)
-                               pos = JumpOverWhite (pos, s, false);
+                               pos = Int32.JumpOverWhite (pos, s, false);
 
                        if (foundOpenParentheses) {
                                if (pos >= s.Length || s [pos++] != ')')
                                        throw new FormatException ("Input string was not in the correct " +
-                                                                  "format.");
+                                                                  "format: No room for close parens.");
                                if (AllowTrailingWhite && pos < s.Length)
-                                       pos = JumpOverWhite (pos, s, false);
+                                       pos = Int32.JumpOverWhite (pos, s, false);
                        }
 
                        if (pos < s.Length)
-                               throw new FormatException ("Input string was not in the correct format.");
+                               throw new FormatException ("Input string was not in the correct format: Did not parse entire string. pos = " 
+                                                                               + pos + " s.Length = " + s.Length);
 
                        
                        if (!negative)
@@ -426,81 +350,81 @@ namespace System {
                        return TypeCode.Int64;
                }
 
-               public bool ToBoolean (IFormatProvider provider)
+               bool IConvertible.ToBoolean (IFormatProvider provider)
                {
                        return System.Convert.ToBoolean (value);
                }
 
-               public byte ToByte (IFormatProvider provider)
+               byte IConvertible.ToByte (IFormatProvider provider)
                {
                        return System.Convert.ToByte (value);
                }
 
-               public char ToChar (IFormatProvider provider)
+               char IConvertible.ToChar (IFormatProvider provider)
                {
                        return System.Convert.ToChar (value);
                }
 
-               public DateTime ToDateTime (IFormatProvider provider)
+               DateTime IConvertible.ToDateTime (IFormatProvider provider)
                {
                        return System.Convert.ToDateTime (value);
                }
 
-               public decimal ToDecimal (IFormatProvider provider)
+               decimal IConvertible.ToDecimal (IFormatProvider provider)
                {
                        return System.Convert.ToDecimal (value);
                }
 
-               public double ToDouble (IFormatProvider provider)
+               double IConvertible.ToDouble (IFormatProvider provider)
                {
                        return System.Convert.ToDouble (value);
                }
 
-               public short ToInt16 (IFormatProvider provider)
+               short IConvertible.ToInt16 (IFormatProvider provider)
                {
                        return System.Convert.ToInt16 (value);
                }
 
-               public int ToInt32 (IFormatProvider provider)
+               int IConvertible.ToInt32 (IFormatProvider provider)
                {
                        return System.Convert.ToInt32 (value);
                }
 
-               public long ToInt64 (IFormatProvider provider)
+               long IConvertible.ToInt64 (IFormatProvider provider)
                {
                        return System.Convert.ToInt64 (value);
                }
 
                [CLSCompliant (false)]
-               public sbyte ToSByte (IFormatProvider provider)
+               sbyte IConvertible.ToSByte (IFormatProvider provider)
                {
                        return System.Convert.ToSByte (value);
                }
                
-               public float ToSingle (IFormatProvider provider)
+               float IConvertible.ToSingle (IFormatProvider provider)
                {
                        return System.Convert.ToSingle (value);
                }
 
-               public object ToType (Type conversionType, IFormatProvider provider)
+               object IConvertible.ToType (Type conversionType, IFormatProvider provider)
                {
                        return System.Convert.ToType (value, conversionType, provider);
                }
 
                [CLSCompliant (false)]
-               public ushort ToUInt16 (IFormatProvider provider)
+               ushort IConvertible.ToUInt16 (IFormatProvider provider)
                {
                        return System.Convert.ToUInt16 (value);
                }
 
                [CLSCompliant (false)]
-               public uint ToUInt32 (IFormatProvider provider)
+               uint IConvertible.ToUInt32 (IFormatProvider provider)
                {
                        return System.Convert.ToUInt32 (value);
                }
 
                [CLSCompliant (false)]
-               public ulong ToUInt64 (IFormatProvider provider)
+               ulong IConvertible.ToUInt64 (IFormatProvider provider)
                {
                        return System.Convert.ToUInt64 (value);
                }