2004-06-03 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Unit.cs
index a85749450707f1e01c879450cddf832ee1b9e8e8..cf915e2fd97ecabd8f15a6add5152c098e8823f5 100644 (file)
@@ -19,6 +19,7 @@ using System.Web.UI;
 \r
 namespace System.Web.UI.WebControls\r
 {\r
+       [TypeConverter(typeof(UnitConverter))]\r
        public struct Unit\r
        {\r
                public static readonly Unit Empty = new Unit();\r
@@ -41,12 +42,12 @@ namespace System.Web.UI.WebControls
 \r
                public static Unit Percentage(double n)\r
                {\r
-                       return new Unit(n);\r
+                       return new Unit (n, UnitType.Percentage);\r
                }\r
 \r
                public static Unit Pixel(int n)\r
                {\r
-                       return new Unit(n);\r
+                       return new Unit (n, UnitType.Pixel);\r
                }\r
 \r
                public static Unit Point(int n)\r
@@ -109,54 +110,52 @@ namespace System.Web.UI.WebControls
 \r
                internal Unit(string value, CultureInfo culture, UnitType defType)\r
                {\r
-                       this.val = 0;\r
-                       this.type = UnitType.Pixel;\r
-                       if(value == null || value.Length == 0)\r
-                       {\r
-                               this.val = 0;\r
-                               this.type = UnitType.Pixel;\r
+                       string valueTrim;\r
+                       if (value == null || (valueTrim = value.Trim ()).Length == 0) {\r
+                               val = 0;\r
+                               type = UnitType.Pixel;\r
+                               return;\r
                        }\r
-                       if(culture == null)\r
+\r
+                       if (culture == null)\r
                                culture = CultureInfo.CurrentCulture;\r
-                       string strVal = value.Trim().ToLower();\r
+\r
+                       string strVal = valueTrim.ToLower ();\r
+                       int length = strVal.Length;\r
                        char c;\r
                        int start = -1;\r
-                       //int current = 0;\r
-                       for(int i = 0; i < strVal.Length; i++)\r
-                       {\r
-                               c = strVal[i];\r
+                       for (int i = 0; i < length; i++) {\r
+                               c = strVal [i];\r
                                if( (c >= '0' && c <= '9') || (c == '-' || c == '.' || c == ',') )\r
                                        start = i;\r
                        }\r
-                       if(start == -1)\r
-                               throw new ArgumentException();\r
-                       if( (start + 1) < strVal.Length)\r
-                       {\r
-                               this.type = (UnitType)GetTypeFromString(strVal.Substring(start + 1).Trim());\r
-                               this.val  = 0;\r
-                       } else\r
-                       {\r
-                               this.type = defType;\r
-                               this.val  = 0;\r
+                       \r
+                       if (start == -1)\r
+                               throw new ArgumentException("No digits in 'value'");\r
+                       \r
+                       start++;\r
+                       if (start < length) {\r
+                               type = GetTypeFromString (strVal.Substring (start).Trim ());\r
+                               val  = 0;\r
+                       } else {\r
+                               type = defType;\r
                        }\r
-                       try\r
-                       {\r
-                               if(type == UnitType.Pixel)\r
-                               {\r
-                                       val = (double)((new Int32Converter()).ConvertFromString(null, culture, strVal.Substring(0, start + 1)));\r
-                               } else\r
-                               {\r
-                                       val = (double)((new SingleConverter()).ConvertFromString(null, culture, strVal.Substring(0, start + 1)));\r
-                               }\r
-                       } catch(Exception)\r
-                       {\r
-                               throw new ArgumentOutOfRangeException();\r
+\r
+                       try {\r
+                               string numbers = strVal.Substring (0, start);\r
+                               if (type == UnitType.Pixel)\r
+                                       val = (double) Int32.Parse (numbers, culture);\r
+                               else\r
+                                       val = (double) Single.Parse (numbers, culture);\r
+                       } catch (Exception) {\r
+                               throw new FormatException ("Error parsing " + value);\r
                        }\r
-                       if(val < Min || val > Max)\r
-                               throw new ArgumentOutOfRangeException();\r
+\r
+                       if (val < Min || val > Max)\r
+                               throw new ArgumentOutOfRangeException ();\r
                }\r
 \r
-               private UnitType GetTypeFromString(string s)\r
+               private static UnitType GetTypeFromString(string s)\r
                {\r
                        if(s == null || s.Length == 0)\r
                                return UnitType.Pixel;\r
@@ -252,7 +251,7 @@ namespace System.Web.UI.WebControls
                {\r
                        if(IsEmpty)\r
                                return String.Empty;\r
-                       return ( val.ToString(culture) + GetStringFromPixel(type) );\r
+                       return ( val.ToString(culture.NumberFormat) + GetStringFromPixel(type) );\r
                }\r
        }\r
 }\r