範例一 NET 常用的物件
//用於存取IP的 IPAddress
IPAddress ip = IPAddress.Parse("192.168.1.143");
Console.WriteLine("MyIp=" + ip);
//存取IP跟 PORT,將網路端點表示成 IP 位址和通訊埠編號。
IPEndPoint Port = new IPEndPoint(ip, 80);
Console.WriteLine("the port is=" + Port);
// IPEndPoint.Serizlize() 將端點資訊序列化為 SocketAddress 執行個體。
//疑問? 話說序列化為 SocketAddress 能幹啥?
SocketAddress Soket = Port.Serialize();
Console.WriteLine("socketAddr=" + Soket);
//印出 socketAddr {InterNetwork:16:{0,80,192,168,1,143,0,0,0,0,0,0,0,0}}
Console.ReadLine();//
範例二 用IP來取得主機名稱
//範例IP yahoo: 192.168.1.143 名子是JASON-PC
IPAddress ipAddr = IPAddress.Parse("192.168.1.143");
// 透過DNS找尋IP位址相對應之主機名稱
IPHostEntry remoteHostEntry = Dns.GetHostEntry(ipAddr);
//呼叫IPHostEntry中的HostName及可取得 HOST的 NAME
Console.WriteLine("host of ip " + ipAddr + " is " + remoteHostEntry.HostName);
Console.ReadLine();
//印出JASON-PC
範例三 使用 DNS 查詢 IP
//可輸入本機號碼 Jason-PC 將獲得IP: 192.168.1.143
//也可以輸入tw.yahoo.com 將獲得IP: 202.43.192.109
string DoMainName = "tw.yahoo.com";
IPHostEntry hostEntry = Dns.GetHostEntry(DoMainName);
// 由於主機有可能有一個以上的 (別名)Alias
// 因此程式中以迴圈方式判斷 Aliases
string[] aliasList = hostEntry.Aliases;
for (int i = 0; i <= aliasList.Length - 1; i++)
{
Console.WriteLine("Alias " + i + " : " + aliasList[i]);
}
// 由於主機有可能有一個以上的 IP Address
// 因此程式中以迴圈方式判斷 AddressList
IPAddress[] addrList = hostEntry.AddressList;//DNS轉IP
for (int i = 0; i <= addrList.Length - 1; i++)
{
Console.WriteLine("Address " + i + " : " + addrList[i]);
}
Console.ReadLine();
範例四:剖析網址 URL
// 由於 DOS 的命令列會以 & 符號做命令分隔字元,因此、若以指令模式下,網址中的 & 之後會被視為是下一個指令
System.Uri URL = new System.Uri("http://findbook.tw/search?keyword_type=keyword&t=xxx");
// System.Uri URL = new System.Uri(args[0]);
// System.Uri類別之屬性
Console.WriteLine("AbsolutePath: " + URL.AbsolutePath);
Console.WriteLine("AbsoluteUri: " + URL.AbsoluteUri);
Console.WriteLine("Authority: " + URL.Authority);
Console.WriteLine("Host: " + URL.Host);
Console.WriteLine("Port: " + URL.Port);
Console.WriteLine("LocalPath: " + URL.LocalPath);
Console.WriteLine("IsDefaultPort: " + URL.IsDefaultPort);
Console.WriteLine("IsFile: " + URL.IsFile);
Console.WriteLine("PathAndQuery: " + URL.PathAndQuery);
Console.WriteLine("Query: " + URL.Query);
Console.WriteLine("Scheme: " + URL.Scheme);
Console.WriteLine("UserEscaped: " + URL.UserEscaped);
Console.WriteLine("UserInfo: " + URL.UserInfo);
Console.ReadLine();
//結語
//微軟 C# 的 IP 層物件主要是 IPAddress 與 IPEndPoint,
//另外 IPHostEntry可以用來代表 URL,也可以用 Dns.GetHostEntry()
//查詢主機名稱。這些是 C# 較常使用的 IP 層物件。
Memorandum
2014年8月23日 星期六
2014年5月6日 星期二
插入陣列元素與Array.GetUpperBound取維度最後一個索引
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AddElementInArray
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
private int[] G_int_array = new int[8];//定義全域陣列類型變數
/// <summary>
/// 插入單個陣列元素的方法
/// </summary>
/// <param name="ArrayBorn">要向其中新增元素的一維陣列</param>
/// <param name="Index">新增(索引)</param>
/// <param name="Value">新增值(元素)</param>
/// <returns>一個新的陣列TemArray</returns>
static int[] AddArray(int[] ArrayBorn, int Index, int Value)
{
if (Index >= (ArrayBorn.Length))//判斷新增索引是否大於陣列的長度
Index = ArrayBorn.Length - 1;//將新增索引設定為陣列的最大索引
int[] TemArray = new int[ArrayBorn.Length + 1];//聲明一個新的陣列
for (int i = 0; i < TemArray.Length; i++)//深度搜尋新陣列的元素
{
if (Index >= 0)//判斷新增索引是否大於等於0
{
if (i < (Index + 1))//判斷深度搜尋到的索引是否小於新增索引加1
TemArray[i] = ArrayBorn[i];//交換元素值
else if (i == (Index + 1))//判斷深度搜尋到的索引是否等於新增索引加1
TemArray[i] = Value;//為深度搜尋到的索引設定新增值
else
TemArray[i] = ArrayBorn[i - 1];//交換元素值
}
else
{
if (i == 0)//判斷深度搜尋到的索引是否為0
TemArray[i] = Value;//為深度搜尋到的索引設定新增值
else
TemArray[i] = ArrayBorn[i - 1];//交換元素值
}
}
return TemArray;//返回插入元素後的新陣列
}
private void btn_RArray_Click(object sender, EventArgs e)
{
txt_RArray.Clear();//清空文字框
//使用循環賦值 ps:.GetUpperBound 陣列索引最大值+1
for (int i = 0; i < G_int_array.GetUpperBound(0) + 1; i++)
{
G_int_array[i] = i; //加入元素
}
//使用循環輸出
for (int i = 0; i < G_int_array.GetUpperBound(0) + 1; i++)
{
txt_RArray.Text += G_int_array[i] + " ";//印出
}
}
private void btn_Sure_Click(object sender, EventArgs e)
{
rtbox_NArray.Clear();//清空文字框
//全域陣列G_int_array 插入第4個索引 插入的元素直txt_Element.Text
G_int_array = AddArray(G_int_array, 4, Convert.ToInt32(txt_Element.Text));//呼叫自定義方法向陣列中插入單個元素
//使用循環輸出
for (int i = 0; i < G_int_array.GetUpperBound(0) + 1; i++)
{
rtbox_NArray.Text += G_int_array[i] + " ";
}
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AddElementInArray
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
private int[] G_int_array = new int[8];//定義全域陣列類型變數
/// <summary>
/// 插入單個陣列元素的方法
/// </summary>
/// <param name="ArrayBorn">要向其中新增元素的一維陣列</param>
/// <param name="Index">新增(索引)</param>
/// <param name="Value">新增值(元素)</param>
/// <returns>一個新的陣列TemArray</returns>
static int[] AddArray(int[] ArrayBorn, int Index, int Value)
{
if (Index >= (ArrayBorn.Length))//判斷新增索引是否大於陣列的長度
Index = ArrayBorn.Length - 1;//將新增索引設定為陣列的最大索引
int[] TemArray = new int[ArrayBorn.Length + 1];//聲明一個新的陣列
for (int i = 0; i < TemArray.Length; i++)//深度搜尋新陣列的元素
{
if (Index >= 0)//判斷新增索引是否大於等於0
{
if (i < (Index + 1))//判斷深度搜尋到的索引是否小於新增索引加1
TemArray[i] = ArrayBorn[i];//交換元素值
else if (i == (Index + 1))//判斷深度搜尋到的索引是否等於新增索引加1
TemArray[i] = Value;//為深度搜尋到的索引設定新增值
else
TemArray[i] = ArrayBorn[i - 1];//交換元素值
}
else
{
if (i == 0)//判斷深度搜尋到的索引是否為0
TemArray[i] = Value;//為深度搜尋到的索引設定新增值
else
TemArray[i] = ArrayBorn[i - 1];//交換元素值
}
}
return TemArray;//返回插入元素後的新陣列
}
private void btn_RArray_Click(object sender, EventArgs e)
{
txt_RArray.Clear();//清空文字框
//使用循環賦值 ps:.GetUpperBound 陣列索引最大值+1
for (int i = 0; i < G_int_array.GetUpperBound(0) + 1; i++)
{
G_int_array[i] = i; //加入元素
}
//使用循環輸出
for (int i = 0; i < G_int_array.GetUpperBound(0) + 1; i++)
{
txt_RArray.Text += G_int_array[i] + " ";//印出
}
}
private void btn_Sure_Click(object sender, EventArgs e)
{
rtbox_NArray.Clear();//清空文字框
//全域陣列G_int_array 插入第4個索引 插入的元素直txt_Element.Text
G_int_array = AddArray(G_int_array, 4, Convert.ToInt32(txt_Element.Text));//呼叫自定義方法向陣列中插入單個元素
//使用循環輸出
for (int i = 0; i < G_int_array.GetUpperBound(0) + 1; i++)
{
rtbox_NArray.Text += G_int_array[i] + " ";
}
}
}
}
Array.FindAll使用FindAll方法搜尋陣列相應字串
來看書上的範例
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FindStr
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
private string[] G_str_array;//宣告一個陣列,尚未實體化及加入元素
private void Frm_Main_Load(object sender, EventArgs e)
{
//下面實體化並加入元素提供user查詢字串 有4個
G_str_array = new string[] {//為字串陣列欄位賦值
"明日科技","C#編程詞典","C#範例大全","C#範例寶典"};
//循環輸出字串到lable上 本範例lable叫lab_Message
for (int i = 0; i < G_str_array.Length; i++)
{
lab_Message.Text += G_str_array[i] + "\n";
}
}
//下面是一個textbox的觸發事件,每輸入一個字將觸發程式區塊
private void txt_find_TextChanged(object sender, EventArgs e)
{
if (txt_find.Text != string.Empty)//判斷搜尋字串是否為空
{
string[] P_str_temp = Array.FindAll//使用FindAll方法搜尋相應字串
(G_str_array, s => s.Contains(txt_find.Text));
if (P_str_temp.Length > 0)//判斷是否搜尋到相應字串
{
txt_display.Clear();//清空控制元件中的字串
foreach (string s in P_str_temp)//向控制元件中新增字串
{
txt_display.Text += s + Environment.NewLine;
}
}
else
{
txt_display.Clear();//清空控制元件中的字串
txt_display.Text = "沒有找到記錄";//提示沒有找到記錄
}
}
else
{
txt_display.Clear();//清空控制元件中的字串
}
}
需要注意的是 使用FindAll方法
中的第一個參數為 搜尋目標的陣列
第二個參數必須要是一個 Predicate<T>
這個Predicate<T>得意思是一個委派
而語法如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FindStr
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
private string[] G_str_array;//宣告一個陣列,尚未實體化及加入元素
private void Frm_Main_Load(object sender, EventArgs e)
{
//下面實體化並加入元素提供user查詢字串 有4個
G_str_array = new string[] {//為字串陣列欄位賦值
"明日科技","C#編程詞典","C#範例大全","C#範例寶典"};
//循環輸出字串到lable上 本範例lable叫lab_Message
for (int i = 0; i < G_str_array.Length; i++)
{
lab_Message.Text += G_str_array[i] + "\n";
}
}
//下面是一個textbox的觸發事件,每輸入一個字將觸發程式區塊
private void txt_find_TextChanged(object sender, EventArgs e)
{
if (txt_find.Text != string.Empty)//判斷搜尋字串是否為空
{
string[] P_str_temp = Array.FindAll//使用FindAll方法搜尋相應字串
(G_str_array, s => s.Contains(txt_find.Text));
if (P_str_temp.Length > 0)//判斷是否搜尋到相應字串
{
txt_display.Clear();//清空控制元件中的字串
foreach (string s in P_str_temp)//向控制元件中新增字串
{
txt_display.Text += s + Environment.NewLine;
}
}
else
{
txt_display.Clear();//清空控制元件中的字串
txt_display.Text = "沒有找到記錄";//提示沒有找到記錄
}
}
else
{
txt_display.Clear();//清空控制元件中的字串
}
}
需要注意的是 使用FindAll方法
中的第一個參數為 搜尋目標的陣列
第二個參數必須要是一個 Predicate<T>
這個Predicate<T>得意思是一個委派
而語法如下
public delegate bool Predicate<in T>(T obj)
注意的是傳回值是一個BOOL
也就是說我們也可以自訂函式只要傳回值是一個BOOL就好
所以上面範例使用Contains方法傳回直是Bool
比較S與txt_find.Text是否一樣是的話就回傳true
然後FindAll再回傳該陣列中的字
而需要注意的是通常, Predicate<T> 委派由 Lambda 運算式表示。
關於LAMBDA 下面有例子可以複習
delegate int count(int x, int y); //宣告一個委派叫COUNT
//宣告加減乘除的方法 傳回值是一個結果
private int ADDD(int x, int y)
{
return x + y;
}
private int CUT(int x, int y)//
{
return x - y;
}
private int XX(int x, int y)
{
return x * y;
}
private void button1_Click(object sender, EventArgs e)
{
//傳統委派實體化 帶入ADDD
count c1 = new count(ADDD);
//加入var 表示後面的count
var c2 = new count(CUT);
//值街只向xx方法 更精簡
count c3 = XX;
//使用匿名方式 不用指向任何方法
count c4 = delegate(int x, int y) { return x + y; };
//lambda方法
count c5 = (A, B) => A + B;
//宣告string空字串 放答案用
string ANSER = "";
//anser+=順便帶入參數
ANSER += c1(1, 1) + "\n";
ANSER += c2(1, 1) + "\n";
ANSER += c3(1, 1) + "\n";
ANSER += c4(1,1)+"\n";
ANSER += c5(1,1);
//show出
MessageBox.Show(ANSER);
//答案是2 0 1 2 2
2014年4月12日 星期六
GetUpperBound()方法來取得Array陣列維度上限
注意 GetUpperBound() 起始維度0開始所以要+1
範例如下
範例如下
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
private string[,] G_str_array;//定義全域陣列類型變數
private Random G_Random_Num = new Random();//產生全域隨機數物件
private void btn_GetArray_Click(object sender, EventArgs e)
{
txt_display.Clear();//清空控制元件中的字串
G_str_array = new string[//隨機產生二維陣列
G_Random_Num.Next(2, 10),//2~10隨機範圍
G_Random_Num.Next(2, 10)];//2~10隨機範圍
lab_Message.Text = string.Format(
"產生了 {0} 行 {1 }列 的陣列",
G_str_array.GetUpperBound(0) + 1,//取得陣列的行數
G_str_array.GetUpperBound(1) + 1);//取得陣列的列數
DisplayArray();//呼叫顯示陣列方法
}
private void DisplayArray()
{
//使用循環賦值
for (int i = 0; i < G_str_array.GetUpperBound(0) + 1; i++)
{
for (int j = 0; j < G_str_array.GetUpperBound(1) + 1; j++)
{
//將維度字串寫入陣列
G_str_array[i, j] = i.ToString() + "," + j.ToString() + " ";
}
}
//使用循環輸出
for (int i = 0; i < G_str_array.GetUpperBound(0) + 1; i++)
{
for (int j = 0; j < G_str_array.GetUpperBound(1) + 1; j++)
{
txt_display.Text += G_str_array[i, j];
}
txt_display.Text += Environment.NewLine;//換行
}
}
}<\CODE>
2013年12月31日 星期二
正規化Regex學習筆記
下面將使用
System.Text.RegularExpressions命名空間
中的Regex類別
第一個範例
匹配下列格式的數字
xxx-xxxxxxxx
所謂數字意旨"0~9" 格式包含"-"字號
比如246-81012141 合格
比如 AS1-AS865412 不合格
因為英文不是數字
ok! 了解目的之後 來看程式碼吧
假如在textBox1.Text輸入字串
按下button1將會執行以下程序
private void button1_Click(object sender, EventArgs e)
{
//進入if判斷 並傳值呼叫
if (!IsTelephone(textBox1.Text))//驗證電話號碼格式是否正確
{
MessageBox.Show("電話號碼格式不正確"); //彈出消息對話框
}
else
{
MessageBox.Show("電話號碼格式正確"); //彈出消息對話框
}
}
/// <summary>
/// 驗證電話號碼格式是否正確
/// </summary>
/// <param name="str_telephone">電話號碼訊息</param>
/// <returns>方法返回布爾值</returns>
public bool IsTelephone(string str_telephone)//副程式將傳會 bool
{
//驗證str_telephone字串是否符合規定,IsMatch方法將回傳bool
return System.Text.RegularExpressions.//使用正則表達式判斷是否匹配
Regex.IsMatch(str_telephone, @"^(\d{3,4}-)?\d{6,8}$");
}
以上使用了Regex.IsMatch 方法 (String)返回是一個bool
將決定if判斷show出哪一個訊息!!
而@"^(\d{3,4}-)?\d{6,8}$"
0.
^ 代表比對開始
1.
C# 字串前的 @ 代表把字串中的 '\' 當成一般字元處理
2.
() 群組的意思 比如(ab) 能匹配 abc 中的 ab
3.
\d代表著0~9數字
4.
{3,4} 代表至少3個數字,最多4個數字
5.
- 代表匹配-號
6.
? 匹配前面的子運算式零次或一次。
例如:Gooo?gle 只能匹配 Gooogle 和 Google。
? 等於 {0,1}
7.
\d{6,8} 數字0~9 至少6個字最多8個字
8.
$代表比對結束
所以 將會比對 3~4的數字 與"-"號最後是6~8的數字 格式如下
XXX-XXXXXX
到
XXXX-XXXXXXXX
第二個範例
匹配帳號密碼如下
A~Z a~z 與 0~9
當user 在textBox1.Text輸入密碼時
按下BUTTON1將進入以下程序
private void button1_Click(object sender, EventArgs e)
{
//Trim()意思是
//從目前字串的開頭和結尾移除所有空白字元後
//所保留下來的字串。
if (!IsPassword(textBox1.Text.Trim()))//驗證密碼格式是否正確
{ MessageBox.Show("密碼格式不正確!!!"); }//彈出消息對話框
else { MessageBox.Show("密碼格式正確!!!!!"); }//彈出消息對話框
}
/// <summary>
/// 驗證碼碼輸入條件
/// </summary>
/// <param name="str_password">密碼字串</param>
/// <returns>返回布爾值</returns>
public bool IsPassword(string str_password)
{
return System.Text.RegularExpressions.//使用正則表達式判斷是否匹配
Regex.IsMatch(str_password, @"[A-Za-z]+[0-9]");
}
System.Text.RegularExpressions命名空間
中的Regex類別
第一個範例
匹配下列格式的數字
xxx-xxxxxxxx
所謂數字意旨"0~9" 格式包含"-"字號
比如246-81012141 合格
比如 AS1-AS865412 不合格
因為英文不是數字
ok! 了解目的之後 來看程式碼吧
假如在textBox1.Text輸入字串
按下button1將會執行以下程序
private void button1_Click(object sender, EventArgs e)
{
//進入if判斷 並傳值呼叫
if (!IsTelephone(textBox1.Text))//驗證電話號碼格式是否正確
{
MessageBox.Show("電話號碼格式不正確"); //彈出消息對話框
}
else
{
MessageBox.Show("電話號碼格式正確"); //彈出消息對話框
}
}
/// <summary>
/// 驗證電話號碼格式是否正確
/// </summary>
/// <param name="str_telephone">電話號碼訊息</param>
/// <returns>方法返回布爾值</returns>
public bool IsTelephone(string str_telephone)//副程式將傳會 bool
{
//驗證str_telephone字串是否符合規定,IsMatch方法將回傳bool
return System.Text.RegularExpressions.//使用正則表達式判斷是否匹配
Regex.IsMatch(str_telephone, @"^(\d{3,4}-)?\d{6,8}$");
}
以上使用了Regex.IsMatch 方法 (String)返回是一個bool
將決定if判斷show出哪一個訊息!!
而@"^(\d{3,4}-)?\d{6,8}$"
0.
^ 代表比對開始
1.
C# 字串前的 @ 代表把字串中的 '\' 當成一般字元處理
2.
() 群組的意思 比如(ab) 能匹配 abc 中的 ab
3.
\d代表著0~9數字
4.
{3,4} 代表至少3個數字,最多4個數字
5.
- 代表匹配-號
6.
? 匹配前面的子運算式零次或一次。
例如:Gooo?gle 只能匹配 Gooogle 和 Google。
? 等於 {0,1}
7.
\d{6,8} 數字0~9 至少6個字最多8個字
8.
$代表比對結束
所以 將會比對 3~4的數字 與"-"號最後是6~8的數字 格式如下
XXX-XXXXXX
到
XXXX-XXXXXXXX
第二個範例
匹配帳號密碼如下
A~Z a~z 與 0~9
當user 在textBox1.Text輸入密碼時
按下BUTTON1將進入以下程序
private void button1_Click(object sender, EventArgs e)
{
//Trim()意思是
//
if (!IsPassword(textBox1.Text.Trim()))//驗證密碼格式是否正確
{ MessageBox.Show("密碼格式不正確!!!"); }//彈出消息對話框
else { MessageBox.Show("密碼格式正確!!!!!"); }//彈出消息對話框
}
/// <summary>
/// 驗證碼碼輸入條件
/// </summary>
/// <param name="str_password">密碼字串</param>
/// <returns>返回布爾值</returns>
public bool IsPassword(string str_password)
{
return System.Text.RegularExpressions.//使用正則表達式判斷是否匹配
Regex.IsMatch(str_password, @"[A-Za-z]+[0-9]");
}
編號 | 字元 | 描述 |
1 | \ | 將下一個字元標記為一個特殊字元、或一個原義字元、或一個向後參照、或一個八進制轉義符。例如,「n」匹配字元「n」。「\n」匹配一個換行符。序列「\\」匹配「\」而「\(」則匹配「(」。 |
2 | ^ | 匹配輸入字串的開始位置。如果設定了RegExp物件的Multiline屬性,^也匹配「\n」或「\r」之後的位置。 |
3 | $ | 匹配輸入字串的結束位置。如果設定了RegExp物件的Multiline屬性,$也匹配「\n」或「\r」之前的位置。 |
4 | * | 匹配前面的子運算式零次或多次。例如:Gooo*gle 能匹配 Google、Goooooogle。* 等於 {0,}。 |
5 | + | 匹配前面的子運算式一次或多次。例如:Gooo+gle 能匹配 Gooogle、Goooooogle,但不能匹配 Google。+ 等於 {1,} |
6 | ? | 匹配前面的子運算式零次或一次。例如:Gooo?gle 只能匹配 Gooogle 和 Google。? 等於 {0,1} |
7 | {n} | n是一個非負整數。匹配確定的n次。例如:o{3} 能匹配 Gooogle 的 ooo,但不能匹配 Google。 |
8 | {n,} | n是一個非負整數。至少匹配n次。 |
9 | {n,m} | m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次 |
10 | ? | 當該字元緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配範式是非貪婪的。非貪婪範式儘可能少的匹配所搜尋的字串,而預設的貪婪範式則儘可能多的匹配所搜尋的字串。 |
11 | . | 匹配除「\n」之外的任何單個字元。要匹配包括「\n」在內的任何字元,請使用像「[.\n]」的範式。 |
12 | (pattern) | 匹配pattern並獲取這一匹配。( ... ) 有群組的意思。例如:(ab) 能匹配 abc 中的 ab,但不能匹配 acc。 |
13 | (?:pattern) | 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行儲存供以後使用。例如:run(?:n|ning) 能匹配 running 整個字串,並且從此字串後繼續比對。 |
13 | (?=pattern) | 正向預查,在任何匹配pattern的字串開始處匹配尋找字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如:Office(?=2003|2007|2010) 能匹配 Office2003 中的 Office,但不能匹配 Office2005 中的 Office,而從 Office 字串後繼續比對。 |
14 | (?!pattern) | 負向預查,在任何不匹配pattern的字串開始處匹配尋找字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如:Office(?!2003|2007|2010) 能匹配 Office2005 中的 Office,但不能匹配 Office2010 中的 Office,而從 Office 字串後繼續比對。 |
15 | x|y | 匹配x或y。 |
16 | [xyz] | 字符集合。匹配所包含的任意一個字元。 |
17 | [^xyz] | 負值字符集合。匹配未包含的任意字元。 |
18 | [a-z] | 字元範圍。匹配指定範圍內的任意字元。 |
19 | [^a-z] | 負值字元範圍。匹配任何不在指定範圍內的任意字元。 |
20 | \b | 匹配一個單詞邊界,也就是指單詞和空格間的位置。 |
2013年12月5日 星期四
關於四捨五入的各種方法
如果我們要對整數 四捨五入可以使用
Math.Ceiling 或 Math.floor
如果數字7.5 Ceiling 後的結果是8
如果是 floor後的結果會是7
來看範例吧!
要注意的是
這個方法的行為會遵循 IEEE 標準 754,第 4 條。 這種捨入有時稱為向正無限大方向捨入。 換句話說,如果 a 是正值,則出現任何小數部分都會使 a 捨入至下一個最大整數。 如果 a 是負值,則四捨五入運算會捨棄 a 的任何小數部分。 這個方法的運算與 Floor(Double) 方法不同,其支援四捨五入成接近無限大的負數。
請看MSDN 的範例中 的輸出
處理前 -0.12
Cleiling後 = 0
Floor = -1
注意的是-0.12是負號 Ceiling後結果並不會是 1
MSDN範例如下
以上是單純的 進位
如果要處裡的數字是Double呢??
可以使用Round
將十進位的值捨入至最接近的整數值。
來看一下範例
Round 只說將十進位的值捨入至最接近的整數值。
並沒有說是 四捨五入 顯然這數值失真了
原因如下
由於將十進位值表示為浮點數,或者對浮點數值執行算術運算可能導致精確度喪失,因此在某些情況下,Round(Double) 方法可能無法將中點值四捨五入到最接近的偶數整數。
所以我們必須使用 Decimal整數
但是使用了Decimal 並不會是我們要得四捨五入
假如1.5 並不會變成2 而是要1.6才會 變成2
下列範例 將使用
Math.Round (double, MidpointRounding) 來證明!
using System;
public class Example
{
public static void Main()
{
Console.WriteLine("{0,-10} {1,-10} {2,-10} {3,-15}", "Value", "Default",
"ToEven", "AwayFromZero");
for (decimal value = 12.0m; value <= 13.0m; value += 0.1m)
Console.WriteLine("{0,-10} {1,-10} {2,-10} {3,-15}",
value, Math.Round(value),
Math.Round(value, MidpointRounding.ToEven),
Math.Round(value, MidpointRounding.AwayFromZero));
}
}
// The example displays the following output:
// Value Default ToEven AwayFromZero
// 12 12 12 12
// 12.1 12 12 12
// 12.2 12 12 12
// 12.3 12 12 12
// 12.4 12 12 12
// 12.5 12 12 13
// 12.6 13 13 13
// 12.7 13 13 13
// 12.8 13 13 13
// 12.9 13 13 13
// 13.0 13 13 13
這方法使用十進位 decimal
由for迴圈 12.0 累加到13.0 每次+0.1
並且 輸出 三種數值
Math.Round(value)
Math.Round(value, MidpointRounding.ToEven)
Math.Round(value, MidpointRounding.AwayFromZero))
讓讀者能更清楚知道 這之間的差異
Math.Round(Decimal)光是使用是不夠的
我們必須搭配 MidpointRounding.AwayFromZero 這個MODE
所以如果我們要完美得呈現四捨五入
我們必須使用這方法
Math.Round 方法 (Decimal, Int32, MidpointRounding)
下面將示範此方法
Decimal[] values1 = { 2.125m, 2.135m, 2.145m, 3.125m, 3.135m, 3.145m };
foreach (Decimal OK in values1)
{
MessageBox.Show("原本是" + OK.ToString() + " 結果為" +
Math.Round(OK, 2, MidpointRounding.AwayFromZero));
}
// OUTPUT
// 原本是2.125 結果為2.13
// 原本是2.135 結果為2.14
// 原本是2.145 結果為2.15
// 原本是3.125 結果為3.13
// 原本是3.135 結果為3.14
// 原本是3.145 結果為3.15
還有另外一種方法於書中範例中提到
當3.44444 + 0.00001
如何取小數點n位
呈現
3.5
3.45
3.445
3.4445
下列範例為書中範例
可以解決這問題
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Round
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
private void btn_Get_Click(object sender, EventArgs e)
{
double P_dbl_d1, P_dbl_d2;//定義兩個double類型變數
if (double.TryParse(txt_add1.Text, out P_dbl_d1) &&//判斷輸入訊息是否正確
double.TryParse(txt_add2.Text, out P_dbl_d2))
{
txt_add3.Text = //得到四捨五入後的值,傳值呼叫
Round(P_dbl_d1 + P_dbl_d2, cbox_select.SelectedIndex + 1).ToString();
}
else
{
MessageBox.Show(//提示錯誤訊息
"輸入數值不正確!", "提示!");
}
}
/// <summary>
/// 計算double值四捨五入的方法
/// </summary>
/// <param name="dbl">進行四捨五入的數值</param>
/// <param name="i">保留的小數位</param>
/// <returns>返回四捨五入後的double值</returns>
internal double Round(double dbl, int i)
{
string P_str_dbl = dbl.ToString();//將double數值轉換為字串
//將double數值小數位轉換為字串
//注意! Split 傳回的是一個陣列
//"."是分割字源[0]是小數點前[1]是小數點後
string P_str_lower = P_str_dbl.Split('.')[1];
int P_str_length = P_str_lower.Length;//計算double數值小數位長度
dbl += GetValue(i, P_str_length);//開始進行四捨五入運算,傳直呼叫
P_str_dbl = dbl.ToString();//將運算後的值轉換為字串
if (P_str_dbl.Contains("."))//判斷是否存在小數位
{
string P_str_upper = //得到整數位字串
P_str_dbl.Split('.')[0];
P_str_lower = P_str_dbl.Split('.')[1];//得到小數位字串
if (P_str_lower.Length > i)//判斷數值位數是否大於保留小數位數
{
P_str_lower = P_str_lower.Substring(//截取保留的小數位
0, i);//0起始位置為第一個小數,2是 娶幾個
return double.Parse(//返回double數值
P_str_upper + "." + P_str_lower);
}
else
{
return double.Parse(P_str_dbl);//如數值位數小於保留小數位數則直接返回
}
}
else
{
return double.Parse(P_str_dbl);//如果沒有小數位則直接返回值
}
}
/// <summary>
/// 得到小數數值的方法
/// </summary>
/// <param name="int_null">四捨五入保留的位數</param>
/// <param name="length">四捨五入丟失的位數</param>
/// <returns>返回小數值用於四捨五入計算</returns>
internal double GetValue(int int_null, int length)
{
string P_str_dbl = "0.";//定義字串變數並賦值
for (int i = 0; i < length; i++)//使用for循環新增小數位
{
if (i > int_null - 1)
{
P_str_dbl += "5";//向小數的四捨五入部分加5
}
else
{
P_str_dbl += "0";//向小數的保留部分加0
}
}
return double.Parse(P_str_dbl);//返回小數數值 ,轉型為double
}
private void Frm_Main_Load(object sender, EventArgs e)
{
cbox_select.SelectedIndex = 0;//cbox_select控制元件默認選擇第一項
}
}
}
Math.Ceiling 或 Math.floor
如果數字7.5 Ceiling 後的結果是8
如果是 floor後的結果會是7
來看範例吧!
double x = 5.5; //假如輸入5.5
int s = 0; //宣告s 為輸出結果
//下面使用Ceiling後 轉型為int
s = Convert.ToInt16(Math.Ceiling(x));
MessageBox.Show(s.ToString());
s = Convert.ToInt16(Math.Floor(x));
MessageBox.Show(s.ToString());
//out 6
//out 5
要注意的是
處理前 -0.12
Cleiling後 = 0
Floor = -1
注意的是-0.12是負號 Ceiling後結果並不會是 1
MSDN範例如下
double[] values = {7.03, 7.64, 0.12, -0.12, -7.1, -7.6};
Console.WriteLine(" Value Ceiling Floor\n");
foreach (double value in values)
Console.WriteLine("{0,7} {1,16} {2,14}",
value, Math.Ceiling(value), Math.Floor(value));
// The example displays the following output to the console:
// Value Ceiling Floor
//
// 7.03 8 7
// 7.64 8 7
// 0.12 1 0
// -0.12 0 -1
// -7.1 -7 -8
// -7.6 -7 -8
以上是單純的 進位
如果要處裡的數字是Double呢??
可以使用Round
將十進位的值捨入至最接近的整數值。
來看一下範例
double[] values = { 2.125, 2.135, 2.145, 3.125, 3.135, 3.145 };
foreach (double value in values)
MessageBox.Show("原本是"+value.ToString()+"結果為"+Math.Round(value, 2));
// OutPut
// 2.12
// 2.13
// 2.14
// 3.12
// 3.14
// 3.14
Round 只說將十進位的值捨入至最接近的整數值。
並沒有說是 四捨五入 顯然這數值失真了
原因如下
using System;
public class Example
{
public static void Main()
{
Console.WriteLine("{0,-10} {1,-10} {2,-10} {3,-15}", "Value", "Default",
"ToEven", "AwayFromZero");
for (decimal value = 12.0m; value <= 13.0m; value += 0.1m)
Console.WriteLine("{0,-10} {1,-10} {2,-10} {3,-15}",
value, Math.Round(value),
Math.Round(value, MidpointRounding.ToEven),
Math.Round(value, MidpointRounding.AwayFromZero));
}
}
// The example displays the following output:
// Value Default ToEven AwayFromZero
// 12 12 12 12
// 12.1 12 12 12
// 12.2 12 12 12
// 12.3 12 12 12
// 12.4 12 12 12
// 12.5 12 12 13
// 12.6 13 13 13
// 12.7 13 13 13
// 12.8 13 13 13
// 12.9 13 13 13
// 13.0 13 13 13
{
MessageBox.Show("原本是" + OK.ToString() + " 結果為" +
Math.Round(OK, 2, MidpointRounding.AwayFromZero));
}
// OUTPUT
// 原本是2.125 結果為2.13
// 原本是2.135 結果為2.14
// 原本是2.145 結果為2.15
// 原本是3.125 結果為3.13
// 原本是3.135 結果為3.14
// 原本是3.145 結果為3.15
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
{
double P_dbl_d1, P_dbl_d2;//定義兩個double類型變數
if (double.TryParse(txt_add1.Text, out P_dbl_d1) &&//判斷輸入訊息是否正確
double.TryParse(txt_add2.Text, out P_dbl_d2))
{
txt_add3.Text = //得到四捨五入後的值,傳值呼叫
Round(P_dbl_d1 + P_dbl_d2, cbox_select.SelectedIndex + 1).ToString();
}
else
{
MessageBox.Show(//提示錯誤訊息
"輸入數值不正確!", "提示!");
}
}
/// 計算double值四捨五入的方法
/// </summary>
/// <param name="dbl">進行四捨五入的數值</param>
/// <param name="i">保留的小數位</param>
/// <returns>返回四捨五入後的double值</returns>
internal double Round(double dbl, int i)
{
string P_str_dbl = dbl.ToString();//將double數值轉換為字串
//將double數值小數位轉換為字串
//注意! Split 傳回的是一個陣列
//"."是分割字源[0]是小數點前[1]是小數點後
string P_str_lower = P_str_dbl.Split('.')[1];
int P_str_length = P_str_lower.Length;//計算double數值小數位長度
dbl += GetValue(i, P_str_length);//開始進行四捨五入運算,傳直呼叫
P_str_dbl = dbl.ToString();//將運算後的值轉換為字串
if (P_str_dbl.Contains("."))//判斷是否存在小數位
{
string P_str_upper = //得到整數位字串
P_str_dbl.Split('.')[0];
P_str_lower = P_str_dbl.Split('.')[1];//得到小數位字串
if (P_str_lower.Length > i)//判斷數值位數是否大於保留小數位數
{
P_str_lower = P_str_lower.Substring(//截取保留的小數位
0, i);//0起始位置為第一個小數,2是 娶幾個
return double.Parse(//返回double數值
P_str_upper + "." + P_str_lower);
}
else
{
return double.Parse(P_str_dbl);//如數值位數小於保留小數位數則直接返回
}
}
else
{
return double.Parse(P_str_dbl);//如果沒有小數位則直接返回值
}
}
/// 得到小數數值的方法
/// </summary>
/// <param name="int_null">四捨五入保留的位數</param>
/// <param name="length">四捨五入丟失的位數</param>
/// <returns>返回小數值用於四捨五入計算</returns>
internal double GetValue(int int_null, int length)
{
string P_str_dbl = "0.";//定義字串變數並賦值
for (int i = 0; i < length; i++)//使用for循環新增小數位
{
if (i > int_null - 1)
{
P_str_dbl += "5";//向小數的四捨五入部分加5
}
else
{
P_str_dbl += "0";//向小數的保留部分加0
}
}
return double.Parse(P_str_dbl);//返回小數數值 ,轉型為double
}
{
cbox_select.SelectedIndex = 0;//cbox_select控制元件默認選擇第一項
}
}
訂閱:
文章 (Atom)