* Maintainer: gvaish@iitk.ac.in\r
* Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
* Implementation: yes\r
- * Status: 99%\r
+ * Status: 100%\r
*\r
* (C) Gaurav Vaish (2001)\r
*/\r
\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
- \r
+\r
private static int Min = -32768;\r
private static int Max = +32767;\r
- \r
+\r
private UnitType type;\r
private double val;\r
- \r
+\r
public static Unit Parse(string s)\r
{\r
return new Unit(s);\r
}\r
- \r
+\r
public static Unit Parse(string s, CultureInfo culture)\r
{\r
return new Unit(s, culture);\r
}\r
- \r
+\r
public static Unit Percentage(double n)\r
{\r
- return new Unit(n);\r
+ return new Unit (n, UnitType.Percentage);\r
}\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
+\r
public static Unit Point(int n)\r
{\r
return new Unit(n, UnitType.Point);\r
}\r
- \r
+\r
public static bool operator ==(Unit left, Unit right)\r
{\r
return (left.type == right.type && left.val == right.val);\r
}\r
- \r
+\r
public static bool operator !=(Unit left, Unit right)\r
{\r
return !(left == right);\r
}\r
- \r
+\r
public static implicit operator Unit(int n)\r
{\r
return new Unit(n);\r
}\r
- \r
+\r
public Unit(double value)\r
{\r
if(value < Min || value > Max)\r
{\r
- return ArgumentOutOfRangeException();\r
+ throw new ArgumentOutOfRangeException();\r
}\r
val = value;\r
type = UnitType.Pixel;\r
}\r
- \r
+\r
public Unit(int value)\r
{\r
if(value < Min || value > Max)\r
{\r
- return ArgumentOutOfRangeException();\r
+ throw new ArgumentOutOfRangeException();\r
}\r
val = value;\r
type = UnitType.Pixel;\r
}\r
- \r
+\r
public Unit(string value): this(value, CultureInfo.CurrentCulture)\r
{\r
}\r
- \r
+\r
public Unit(double value, UnitType type)\r
{\r
if(value < Min || value > Max)\r
{\r
- return ArgumentOutOfRangeException();\r
+ throw new ArgumentOutOfRangeException();\r
}\r
val = value;\r
this.type = type;\r
}\r
- \r
+\r
public Unit(string value, CultureInfo culture): this(value, culture, UnitType.Pixel)\r
{\r
}\r
- \r
+\r
internal Unit(string value, CultureInfo culture, UnitType defType)\r
{\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 = GetTypeFromString(strVal.Substring(start + 1).Trim());\r
- } else\r
- {\r
- this.type = defType;\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 In32Converter()).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 e)\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
+\r
+ private static UnitType GetTypeFromString(string s)\r
{\r
if(s == null || s.Length == 0)\r
return UnitType.Pixel;\r
"%",\r
"em",\r
"ex"\r
- }\r
+ };\r
int i = 0;\r
foreach(string cType in uTypes)\r
{\r
- if(s == uTypes[i])\r
- return (UnitType)(i + 1);\r
+ if(s == cType)\r
+ return (UnitType)Enum.ToObject(typeof(UnitType), (i + 1));\r
i++;\r
}\r
return UnitType.Pixel;\r
}\r
- \r
+\r
private string GetStringFromPixel(UnitType ut)\r
{\r
string[] uTypes = {\r
"%",\r
"em",\r
"ex"\r
- }\r
+ };\r
if( !Enum.IsDefined(typeof(UnitType), ut) )\r
return "px";\r
- return uTypes[ut - 1];\r
+ return uTypes[(int)ut - 1];\r
}\r
- \r
+\r
public bool IsEmpty\r
{\r
get\r
{\r
- throw new NotImplementedException();\r
+ return (type == 0);\r
}\r
}\r
- \r
+\r
public UnitType Type\r
{\r
get\r
return type;\r
}\r
}\r
- \r
+\r
public double Value\r
{\r
get\r
return val;\r
}\r
}\r
- \r
+\r
public override bool Equals(object obj)\r
{\r
if(obj != null && obj is Unit)\r
}\r
return false;\r
}\r
- \r
+\r
public override int GetHashCode()\r
{\r
return ( (type.GetHashCode() << 2) | (val.GetHashCode()) );\r
}\r
- \r
+\r
public override string ToString()\r
{\r
if(IsEmpty)\r
return String.Empty;\r
- return ( val.ToString() + GetStringFromType(type) );\r
+ return ( val.ToString() + GetStringFromPixel(type) );\r
}\r
- \r
- public override string ToString(CultureInfo culture)\r
+\r
+ public string ToString(CultureInfo culture)\r
{\r
if(IsEmpty)\r
return String.Empty;\r
- return ( val.ToString(culture) + GetStringFromType(type) );\r
+ return ( val.ToString(culture.NumberFormat) + GetStringFromPixel(type) );\r
}\r
}\r
}\r