public const long MaxValue = 0x7fffffffffffffff;
public const long MinValue = -9223372036854775808;
- public long value;
+ internal long value;
public int CompareTo (object v)
{
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;
- }
-
public static long Parse (string s, NumberStyles style, IFormatProvider fp)
{
if (s == null)
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) {
else
nfi = Thread.CurrentThread.CurrentCulture.NumberFormat;
- CheckStyle (style);
+ Int32.CheckStyle (style);
bool AllowCurrencySymbol = (style & NumberStyles.AllowCurrencySymbol) != 0;
bool AllowExponent = (style & NumberStyles.AllowExponent) != 0;
int pos = 0;
if (AllowLeadingWhite)
- pos = JumpOverWhite (pos, s, true);
+ pos = Int32.JumpOverWhite (pos, s, true);
bool foundOpenParentheses = false;
bool negative = false;
// 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 (Char.IsNumber);
- else
- validDigit = new IsAnything (Char.IsDigit);
-
long number = 0;
int nDigits = 0;
bool decimalPointFound = false;
// 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;
}
// 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.");
+ if (pos < s.Length && s [pos] != '\u0000')
+ throw new FormatException ("Input string was not in the correct format: Did not parse entire string. pos = "
+ + pos + " s.Length = " + s.Length);
if (!negative)
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);
}