namespace System {
[Serializable]
+#if NET_2_0
+ [System.Runtime.InteropServices.ComVisible (true)]
+#endif
public struct Double : IComparable, IFormattable, IConvertible
#if NET_2_0
, IComparable <double>, IEquatable <double>
internal double m_value;
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- extern internal static void AssertEndianity (out double value);
-
public int CompareTo (object v)
{
if (v == null)
#endif
public static bool IsNaN (double d)
{
+#pragma warning disable 1718
return (d != d);
+#pragma warning restore
}
public static bool IsNegativeInfinity (double d)
private const int State_ExponentSign = 4;
private const int State_Exponent = 5;
private const int State_ConsumeWhiteSpace = 6;
+ private const int State_Exit = 7;
public static double Parse (string s, NumberStyles style, IFormatProvider provider)
{
return result;
}
- [MonoTODO("check if digits are group in correct numbers between the group separators")]
+ // FIXME: check if digits are group in correct numbers between the group separators
internal static bool Parse (string s, NumberStyles style, IFormatProvider provider, bool tryParse, out double result, out Exception exc)
{
result = 0;
exc = new ArgumentNullException ("s");
return false;
}
-
+ if (s.Length == 0) {
+ if (!tryParse)
+ exc = new FormatException ();
+ return false;
+ }
+#if NET_2_0
+ // yes it's counter intuitive (buggy?) but even TryParse actually throws in this case
+ if ((style & NumberStyles.AllowHexSpecifier) != 0) {
+ string msg = Locale.GetText ("Double doesn't support parsing with '{0}'.", "AllowHexSpecifier");
+ throw new ArgumentException (msg);
+ }
+#endif
if (style > NumberStyles.Any) {
if (!tryParse)
exc = new ArgumentException();
return false;
}
-
+
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
if (format == null) throw new Exception("How did this happen?");
if (sidx == len) {
if (!tryParse)
exc = Int32.GetFormatException ();
- return true;
+ return false;
}
}
//
string decimal_separator = null;
string group_separator = null;
+ string currency_symbol = null;
int decimal_separator_len = 0;
int group_separator_len = 0;
+ int currency_symbol_len = 0;
if ((style & NumberStyles.AllowDecimalPoint) != 0){
decimal_separator = format.NumberDecimalSeparator;
decimal_separator_len = decimal_separator.Length;
group_separator = format.NumberGroupSeparator;
group_separator_len = group_separator.Length;
}
+ if ((style & NumberStyles.AllowCurrencySymbol) != 0){
+ currency_symbol = format.CurrencySymbol;
+ currency_symbol_len = currency_symbol.Length;
+ }
string positive = format.PositiveSign;
string negative = format.NegativeSign;
sidx = len;
continue;
}
+
switch (state){
case State_AllowSign:
if ((style & NumberStyles.AllowLeadingSign) != 0){
goto case State_Decimal;
if (decimal_separator != null &&
- decimal_separator [0] == c){
- if (s.Substring (sidx, decimal_separator_len) ==
- decimal_separator){
+ decimal_separator [0] == c) {
+ if (String.CompareOrdinal (s, sidx, decimal_separator, 0, decimal_separator_len) == 0) {
b [didx++] = (byte) '.';
sidx += decimal_separator_len-1;
state = State_Decimal;
break;
}
}
+ if (currency_symbol != null &&
+ currency_symbol [0] == c){
+ if (s.Substring (sidx, currency_symbol_len) ==
+ currency_symbol){
+ sidx += currency_symbol_len-1;
+ state = State_Digits;
+ break;
+ }
+ }
if (Char.IsWhiteSpace (c))
goto case State_ConsumeWhiteSpace;
}
if (c == 'e' || c == 'E'){
- if ((style & NumberStyles.AllowExponent) == 0)
- throw new FormatException ("Unknown char: " + c);
+ if ((style & NumberStyles.AllowExponent) == 0) {
+ if (!tryParse)
+ exc = new FormatException ("Unknown char: " + c);
+ return false;
+ }
b [didx++] = (byte) c;
state = State_ExponentSign;
break;
return false;
case State_ConsumeWhiteSpace:
- if (allow_trailing_white && Char.IsWhiteSpace (c))
+ if (allow_trailing_white && Char.IsWhiteSpace (c)) {
+ state = State_ConsumeWhiteSpace;
break;
+ }
if (!tryParse)
exc = new FormatException ("Unknown char");
return false;
}
+
+ if (state == State_Exit)
+ break;
}
b [didx] = 0;
return true;
}
-
+#if NET_2_0
+ public static bool TryParse (string s, out double result)
+ {
+ return TryParse (s, NumberStyles.Any, null, out result);
+ }
+#endif
public override string ToString ()
{
return ToString (null, null);