public const uint MaxValue = 0xffffffff;
public const uint MinValue = 0;
- public uint value;
+ internal uint value;
public int CompareTo (object v)
{
int len;
int i;
bool digits_seen = false;
+ bool has_negative_sign = false;
if (s == null)
throw new ArgumentNullException (Locale.GetText ("s is null"));
if (s [i] == '+')
i++;
+ else
+ if (s[i] == '-'){
+ i++;
+ has_negative_sign = true;
+ }
for (; i < len; i++){
c = s [i];
if (!digits_seen)
throw new FormatException ();
- return val;
+ if (has_negative_sign)
+ throw new OverflowException ();
+ return val;
}
[CLSCompliant(false)]
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');
- }
-
[CLSCompliant(false)]
public static uint Parse (string s, NumberStyles style, IFormatProvider fp)
{
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.");
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);
-
uint number = 0;
int nDigits = 0;
bool decimalPointFound = false;
// Just the same as Int32, but this one adds instead of substract
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))
continue;
else
if (!decimalPointFound && AllowDecimalPoint &&
- FindOther (ref pos, s, nfi.NumberDecimalSeparator)) {
+ Int32.FindOther (ref pos, s, nfi.NumberDecimalSeparator)) {
decimalPointFound = true;
continue;
}
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);
+ Int32.FindCurrency (ref pos, s, nfi, ref foundCurrency);
if (foundCurrency) {
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.");
if (AllowTrailingWhite && pos < s.Length)
- pos = JumpOverWhite (pos, s, false);
+ pos = Int32.JumpOverWhite (pos, s, false);
}
- if (pos < s.Length)
+ if (pos < s.Length && s [pos] != '\u0000')
throw new FormatException ("Input string was not in the correct format.");
if (negative)
return TypeCode.UInt32;
}
- 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);
}