2011年11月29日 星期二

C# Convert.ToDouble() 與 double.TryParse() 使用比較



  1. static void Main(string[] args)  
  2.       {  
  3.          try  
  4.          {  
  5.             string str = "";              
  6.             // 如果str為空字串,則會跳到異常處理:輸入字串格式不正確  
  7.             Console.WriteLine(Convert.ToDouble(str));              
  8.          }  
  9.          catch (Exception ex)  
  10.          {  
  11.             Console.WriteLine(ex.Message);  
  12.          }  
  13.          Console.ReadLine();  
  14.       }  

以上程式碼出現的結果為:輸入字串格式不正確。因為傳入的字串為空,轉換成 double 類型不成功。


  1. static void Main(string[] args)  
  2.       {  
  3.          try  
  4.          {  
  5.             string str = "123.123";              
  6.             // 如果str為空字串,則會跳到異常處理:輸入字串格式不正確  
  7.             Console.WriteLine(Convert.ToDouble(str));              
  8.          }  
  9.          catch (Exception ex)  
  10.          {  
  11.             Console.WriteLine(ex.Message);  
  12.          }  
  13.          Console.ReadLine();  
  14.       } 


隨便對 str 給予一個合適的值,程式不會出現錯誤,也可得到結果為:123.123


下面改用另外一種 double.TryParse() 方式處理:
第一種情況仍是將 str 設為空字串,



  1. static void Main(string[] args)  
  2.     {  
  3.        try  
  4.        {  
  5.           string str = "";  
  6.           double rst = 0.0;  
  7.           Console.WriteLine("转换结果为:" + double.TryParse(str, out rst));  
  8.           Console.WriteLine(rst);              
  9.        }  
  10.        catch (Exception ex)  
  11.        {  
  12.           Console.WriteLine(ex.Message);  
  13.        }  
  14.        Console.ReadLine();  
  15.     }  


程式碼執行不會出現錯誤,得到的結果為:
傳回結果:false
rst :0

第二種情況隨便對 str 給予一個合適的值:

  1. static void Main(string[] args)  
  2.       {  
  3.          try  
  4.          {  
  5.             string str = "123.123";  
  6.             double rst = 0.0;  
  7.             Console.WriteLine("转换结果为:" + double.TryParse(str, out rst));  
  8.             Console.WriteLine(rst);              
  9.          }  
  10.          catch (Exception ex)  
  11.          {  
  12.             Console.WriteLine(ex.Message);  
  13.          }  
  14.          Console.ReadLine();  
  15.       }  


程式碼執行不會出現錯誤,得到的結果為:
傳回結果:true
rst :123.123

由以上的測試結果可以看出。使用 double.TryParse() 做類型轉換更安全,
可以對傳回值進行判斷,也可以設置預設的傳回值 0 。


注意事項:
傳入的字串即便已是包含數字字元,但當您使用 TryParse 方法轉換某些數值的型別而言,仍然有可能是無效的。
例如,"256" 不是 byte 的有效值,但卻是 int 的有效值。
" "98.6" 不是 int 的有效值,但卻是 decimal 的有效值。
下列範例顯示如何使用 TryParse 與 long、byte 及 decimal 值的字串表示。


string numString = "1287543"; //"1287543.0" will return false for a long
long number1 = 0;
bool canConvert = long.TryParse(numString, out number1);
if (canConvert == true)
  Console.WriteLine("number1 now = {0}", number1);
else
  Console.WriteLine("numString is not a valid long");

byte number2 = 0;
numString = "255"; // A value of 256 will return false
canConvert = byte.TryParse(numString, out number2);
if (canConvert == true)
  Console.WriteLine("number2 now = {0}", number2);
else
  Console.WriteLine("numString is not a valid byte");

decimal number3 = 0;
numString = "27.3"; //"27" is also a valid decimal
canConvert = decimal.TryParse(numString, out number3);
if (canConvert == true)
  Console.WriteLine("number3 now = {0}", number3);
else
  Console.WriteLine("number3 is not a valid decimal");  

節錄來源:http://msdn.microsoft.com/zh-tw/library/bb384043.aspx

Double.TryParse 方法 (String, NumberStyles, IFormatProvider, Double%)  文化特性格式說明。

節錄來源:http://msdn.microsoft.com/zh-tw/library/3s27fasw.aspx

---
Welly Lin



2011年11月28日 星期一

ASP.NET+C# Request.ServerVariables 参数对照表

下表節錄來源:http://www.127cq.com/thread-882-1-1.html

参数名
说明
ALL_HTTP
HTTP_CONNECTION:Keep-Alive HTTP_ACCEPT:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* HTTP_ACCEPT_ENCODING:gzip, deflate HTTP_ACCEPT_LANGUAGE:zh-cn HTTP_HOST:localhost:5292 HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; QQDownload 691; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.21022; .NET CLR 3.5.30729; InfoPath.3; .NET4.0C; .NET4.0E; 360SE) HTTP_UA_CPU:x86
客户端发送的所有HTTP标头,前缀HTTP_
ALL_RAW
Connection: Keep-Alive Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Accept-Encoding: gzip, deflate Accept-Language: zh-cn Host: localhost:5292 User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; QQDownload 691; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.21022; .NET CLR 3.5.30729; InfoPath.3; .NET4.0C; .NET4.0E; 360SE) UA-CPU: x86
客户端发送的所有HTTP标头,其结果和客户端发送时一样,没有前缀HTTP_
APPL_MD_PATH
应用程序的元数据库路径
APPL_PHYSICAL_PATH
E:\TempNet\TempNet\
与应用程序元数据库路径相应的物理路径
AUTH_TYPE
NTLM
是用户访问受保护的脚本时,服务器用於检验用户的验证方法
AUTH_USER
WIN-OFFICE2008\Administrator
代证的用户名
AUTH_PASSWORD
当使用基本验证模式时,客户在密码对话框中输入的密码
LOGON_USER
WIN-OFFICE2008\Administrator
REMOTE_USER
WIN-OFFICE2008\Administrator
CERT_COOKIE
唯一的客户证书ID
CERT_FLAGS
客户证书标誌,如有客户端证书,则bit00如果客户端证书验证无效,bit1被设置为1
CERT_ISSUER
用户证书中的发行者字段
CERT_KEYSIZE
安全套接字层连接关键字的位数,如128
CERT_SECRETKEYSIZE
服务器验证私人关键字的位数如1024
CERT_SERIALNUMBER
客户证书的序列号字段
CERT_SERVER_ISSUER
服务器证书的发行者字段
CERT_SERVER_SUBJECT
服务器证书的主题字段
CERT_SUBJECT
客户端证书的主题字段
CONTENT_LENGTH
0
客户端发出內容的长度
CONTENT_TYPE
客户发送的form內容或HTTPPUT的数据类型
GATEWAY_INTERFACE
HTTPS
如果请求穿过安全通道(SSL),则返回ON如果请求来自非安全通道,则返回OFF
HTTPS_KEYSIZE
安全套接字层连接关键字的位数,如128
HTTPS_SECRETKEYSIZE
服务器验证私人关键字的位数如1024
HTTPS_SERVER_ISSUER
服务器证书的发行者字段
HTTPS_SERVER_SUBJECT
服务器证书的主题字段
INSTANCE_ID
IIS实例的ID
INSTANCE_META_PATH
响应请求的IIS实例的元数据库路径
LOCAL_ADDR
127.0.0.1
返回接受请求的服务器地址
PATH_INFO
/Default.aspx
客户端提供的路径信息
PATH_TRANSLATED
E:\TempNet\TempNet\Default.aspx
通过由虚拟至物理的映射后得到的路径
QUERY_STRING
查询字符串內容
REMOTE_ADDR
127.0.0.1
发出请求的远程主机的IP地址
REMOTE_HOST
127.0.0.1
发出请求的远程主机名称
REMOTE_PORT
REQUEST_METHOD
GET
提出请求的方法比如GETHEADPOST等等
SCRIPT_NAME
/Default.aspx
执行脚本的名称
SERVER_NAME
localhost
服务器的主机名、DNS地址或IP地址
SERVER_PORT
5292
接受请求的服务器端口号
SERVER_PORT_SECURE
0
如果接受请求的服务器端口为安全端口时,则为1,否则为0
SERVER_PROTOCOL
HTTP/1.1
服务器使用的协议的名称和版本
SERVER_SOFTWARE
应答请求并运行网关的服务器软件的名称和版本
URL
/Default.aspx
返回服务器地址
HTTP_CONNECTION
Keep-Alive
返回內容:Keep-Alive
HTTP_ACCEPT
image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
可接收的格式
HTTP_ACCEPT_ENCODING
gzip, deflate
HTTP_ACCEPT_LANGUAGE
zh-cn
语言
HTTP_HOST
localhost:5292
返回服务器地址
HTTP_USER_AGENT
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; QQDownload 691; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.21022; .NET CLR 3.5.30729; InfoPath.3; .NET4.0C; .NET4.0E; 360SE)
返回客户机相关信息
HTTP_UA_CPU
x86
CPU位数,x86表示32





若想要用程式列出 ASP 或 ASP.NET 上所有 Request‧ServerVariables 名稱及值,程式碼如下:


◎ASP的寫法

<table border=1>
<%
  for each i in Request.ServerVariables
     response.write "<tr><td>" & i
     response.write "<td>" & Request.ServerVariables(i)
  next
%>
</table>


ASP.NET VB的寫法
        Dim i As String
        Response.Write("<table border=1>")
        For Each i In Request.ServerVariables
            Response.Write("<tr><td>" & i)
            Response.Write("<td>" & Request.ServerVariables(i))
        Next
        Response.Write("</table>")

ASP.NET C#的寫法

       foreach (object obj in Request.ServerVariables)
       {
           Response.Write(obj.ToString() + "=" + Request.ServerVariables[obj.ToString()]+"<br />");
       }