當我們在撰寫程式過程中,有可能會遇到在做資料處理時與一開始宣告的資料型別不一樣,這時就會需要資料型別轉換了。那這邊有四種轉換介紹:
一、自動轉型
運算過程中在精確度不會改變時,程式就會自動幫我們做轉型處理,什麼意思呢?就是小範圍可以放入大範圍中,但大範圍無法放入小範圍去做運算。還是不懂?沒關係這邊用例子來說明:
正常處理:
double A = 120;
double B;
B = A + 3.45;
A = B * 2;
說明:
第一行:宣告倍精度浮點數A,且初始值為120
第二行:宣告倍精度浮點數B,無特別設定初始值
第三行:(1)B的值要看"="右邊的值,也就是120+3.45=123.45
(2)得知B為123.45
第四行:(1)A的值要看"="右邊的值,也就是B*2
(2)這個B值呢!是看最後的結果也就是123.45
(3)因此B*2 = 123.45 * 2 = 246.9,得知A最後的值為246.9
遇到需要做轉換的狀況就會是:
int A = 120;
double B;
B = A + 3.45;
A = B * 2;
說明:
第一行:宣告整數A,且初始值為120
第二行:宣告倍精度浮點數B,無特別設定初始值
第三行:(1)運算結果是存到B,因此運算內容要與B的資料型別相同
(2)由於B是double(倍精度浮點數),A是int(整數),int轉double是不會影響精確度的
(3)因此A就會從int自動轉換為double型別後再做運算
第四行:(1)此時就不一樣了,運算結果是存到整數型別A
(2)雖然運算內容”2”是整數沒問題,但B卻是倍精度浮點數
(3)因此精確度是會被影響到,無論B的值是不是2.0000這樣的數值,電腦都會出現錯誤
只要「運算結果的資料型別」可以容納的下「運算內容的資料型別」範圍,電腦就可以暫時再那一行運算當中做自動轉換型態的動作。
二、明確轉型
有一個Type Cast的方法可以強行轉換資料型別,方法:
結果值 = (想要強迫轉換的型別)運算式 或 變數名稱;
這邊舉個例子:
int A;
double B = 3.14;
A = (int)B;
由於B是double而A是int,要將B的值給予A但型別不符,因此使用A的型別將B強制轉換為int,此時A的結果為3。
因為是強制轉換關係,因此會遺失小數點後面的值,所以在使用的時候要注意。
三、Parse方法
若遇到文字型別的數字,想要將它轉為數值時,就可以使用Parse()方法來轉換,方法:
數值變數 = 資料型別.Parse(文字型別的數字);
什麼是文字型別的數字?就是
string C = ”66”;
像這樣的形式就是文字型別的數字,string是字串型別可以加入文字的,但也會接收到有關數字的時候,倘若說字串中只有數字時想要轉為數值就可以使用Parse()方法,若字串中有非數字時可能轉換時就會出現錯誤唷!
用上面例子舉例就會是:
Int D = int.Parse(“66”);
四、轉換成字串
1.自動轉換
由於有時候在使用VC#時會用到工具箱的Label元件,那麼此時想要將一些數字轉成文字型態就可以這麼做:
string msg = ”今年是”;
int year = 2023;
Label.Text = msg + year;
那麼Label.Text會因為”+”號而將兩者做串接,輸出結果就為「今年是2023」這樣的字串,那麼year也會在這當中暫時自動轉換為字串型別。
2.明確轉換
有時候查詢日期時間或是其他內容的時候就需要去做轉換的動作,那麼有兩種可以明確轉換方法就是:
(1)字串變數 = Convert.ToString(要轉換的資料 或 變數名稱);
(2)字串變數 = 要轉換的資料 或 變數名稱 .ToString();
舉例:
int A = 2023
string B = Convert.ToString(2023);
string BB = Convert.ToString(A);
string C = 2023.ToString();
string CC = A.ToString();
筆記補充:日期時間的轉換
1.取得當下時間
DateTime dtNow= DateTime.Now;
string S= dtNow.ToString("yyyy-MM-dd HH:mm:ss");
DateTime dt=Convert.ToDateTime(S);
說明:
(1)第一行是取得當下時間
(2)第二行是將資料字串格式化
yyyy-MM-dd是年月日部分
HH:mm:ss是時分秒數的部分(這邊的HH是24小時制,改成hh就為12小時制了)
(3)第三行是將字串轉回日期格式
2.時間差計算
DateTime dt1= Convert.ToDateTime("2023-03-29 00:00:00");
DateTime dt2= Convert.ToDateTime("2023-03-30 00:00:00");
TimeSpan ts = dt2- dt1;
double dDateDiff = ts.TotalDays;
label1.Text = "日期相差 " + Convert.ToInt32(dDateDiff).ToString() + "天";
int iDateDiff = ts.Days;
label2.Text = "日期相差 " + iDateDiff.ToString() + "天";
說明:
1.第一、二行是取得兩個時間
2.第三行是做相差運算,得知時間差距
3.第四、五行是使用.TotalDays來做處理,但是TotalDays是double型別,因此會有小數問題,故在做顯示的時候會將運算後的值強制轉成32位元的整數型態
4.第六、七行是使用.Days來做處理,由於Days為int型別,因此不會有小數問題,可直接做顯示沒有問題的。