2016-12-24

Decimal in C# 的隱含轉換建構式

最近有個工作項目是將原本 jsp 的金流相關功能,搬遷到 C# 上 重要性不言可喻,加下小弟寫 java 的時間並不長,還是寫 android,jsp 只有聽過的程度 _||

本來想趁機好好觀摩 java 的架構跟設計方式,剛動手沒多久就狂卡關

為了避免耽誤時程 於是立馬改變策略 --> 單純進行一個人工翻譯的動作

在不了解流程面跟 java 語法的情況下,可以想見問題一定是少不了,

問題描述

客戶填的金額是 500000,結果程式竟然只紀錄了 53

問題解析

  1. 程式碼

    string a="500000";
    var b =new Decimal(a[0]);
    Console.WriteLine(b);//53
    
  2. 程式碼說明

    • a[0] 會將 a string 轉為 char[],接著取第 0 個位子也就是第一個 --> 5
    • 5 可以理解,但 53 哪來的?--> 果然就是自己對 decimal 了解太少造成的
  3. decimal 的建構子有下列幾種 (可參考 MSDN)

    • Decimal(Double)
    • Decimal(Int32)
    • Decimal(Int32, Int32, Int32, Boolean, Byte)
    • Decimal(Int32[])
    • Decimal(Int64)
    • Decimal(Single)
    • Decimal(UInt32)
    • Decimal(UInt64)

    發現了嗎?沒有一個是接受 char 的呀?!

  4. 魔鬼就在細節裡,Decimal 隱含轉換

    • 5 的 ascii code 就是 53

    • 詳細資料請看 Decimal Implicit 轉換 運算子

    • 整理如下

      傳入參數 輸出值
      Byte 8 位元不帶正負號整數
      Char Unicode 字元
      Int16 16 位元帶正負號的整數
      Int32 32 位元帶正負號的整數
      Int64 64 位元帶正負號的整數
      SByte 8 位元帶正負號的整數
      UInt16 16 位元不帶正負號的整數
      UInt32 32 位元不帶正負號的整數
      UInt64 64 位元不帶正負號整數
  • 原始程式碼在這

參考資料

  1. Decimal 建構函式
  2. Decimal Implicit 轉換 運算子

沒有留言:

張貼留言