text: ﻿/*******************************************************************************
   * Copyright © 2016 NFine.Framework 版权所有
   * Author: NFine
   * Description: NFine快速开发平台
   * Website：http://www.nfine.cn
  *********************************************************************************/
  using System;
  using System.Collections.Generic;
  using System.Linq;
  
  namespace NFine.Code
  {
      public static partial class Ext
      {
          #region 数值转换
          /// <summary>
          /// 转换为整型
          /// </summary>
          /// <param name="data">数据</param>
          public static int ToInt(this object data)
          {
              if (data == null)
                  return 0;
              int result;
              var success = int.TryParse(data.ToString(), out result);
              if (success)
                  return result;
              try
              {
                  return Convert.ToInt32(ToDouble(data, 0));
              }
              catch (Exception)
              {
                  return 0;
              }
          }
  
          /// <summary>
          /// 转换为可空整型
          /// </summary>
          /// <param name="data">数据</param>
          public static int? ToIntOrNull(this object data)
          {
              if (data == null)
                  return null;
              int result;
              bool isValid = int.TryParse(data.ToString(), out result);
              if (isValid)
                  return result;
              return null;
          }
  
          /// <summary>
          /// 转换为双精度浮点数
          /// </summary>
          /// <param name="data">数据</param>
          public static double ToDouble(this object data)
          {
              if (data == null)
                  return 0;
              double result;
              return double.TryParse(data.ToString(), out result) ? result : 0;
          }
  
          /// <summary>
          /// 转换为双精度浮点数,并按指定的小数位4舍5入
          /// </summary>
          /// <param name="data">数据</param>
          /// <param name="digits">小数位数</param>
          public static double ToDouble(this object data, int digits)
          {
              return Math.Round(ToDouble(data), digits);
          }
  
          /// <summary>
          /// 转换为可空双精度浮点数
          /// </summary>
          /// <param name="data">数据</param>
          public static double? ToDoubleOrNull(this object data)
          {
              if (data == null)
                  return null;
              double result;
              bool isValid = double.TryParse(data.ToString(), out result);
              if (isValid)
                  return result;
              return null;
          }
  
          /// <summary>
          /// 转换为高精度浮点数
          /// </summary>
          /// <param name="data">数据</param>
          public static decimal ToDecimal(this object data)
          {
              if (data == null)
                  return 0;
              decimal result;
              return decimal.TryParse(data.ToString(), out result) ? result : 0;
          }
  
          /// <summary>
          /// 转换为高精度浮点数,并按指定的小数位4舍5入
          /// </summary>
          /// <param name="data">数据</param>
          /// <param name="digits">小数位数</param>
          public static decimal ToDecimal(this  object data, int digits)
          {
              return Math.Round(ToDecimal(data), digits);
          }
  
          /// <summary>
          /// 转换为可空高精度浮点数
          /// </summary>
          /// <param name="data">数据</param>
          public static decimal? ToDecimalOrNull(this  object data)
          {
              if (data == null)
                  return null;
              decimal result;
              bool isValid = decimal.TryParse(data.ToString(), out result);
              if (isValid)
                  return result;
              return null;
          }
  
          /// <summary>
          /// 转换为可空高精度浮点数,并按指定的小数位4舍5入
          /// </summary>
          /// <param name="data">数据</param>
          /// <param name="digits">小数位数</param>
          public static decimal? ToDecimalOrNull(this object data, int digits)
          {
              var result = ToDecimalOrNull(data);
              if (result == null)
                  return null;
              return Math.Round(result.Value, digits);
          }
  
          #endregion
  
          #region 日期转换
          /// <summary>
          /// 转换为日期
          /// </summary>
          /// <param name="data">数据</param>
          public static DateTime ToDate(this object data)
          {
              if (data == null)
                  return DateTime.MinValue;
              DateTime result;
              return DateTime.TryParse(data.ToString(), out result) ? result : DateTime.MinValue;
          }
  
          /// <summary>
          /// 转换为可空日期
          /// </summary>
          /// <param name="data">数据</param>
          public static DateTime? ToDateOrNull(this object data)
          {
              if (data == null)
                  return null;
              DateTime result;
              bool isValid = DateTime.TryParse(data.ToString(), out result);
              if (isValid)
                  return result;
              return null;
          }
  
          #endregion
  
          #region 布尔转换
          /// <summary>
          /// 转换为布尔值
          /// </summary>
          /// <param name="data">数据</param>
          public static bool ToBool(this object data)
          {
              if (data == null)
                  return false;
              bool? value = GetBool(data);
              if (value != null)
                  return value.Value;
              bool result;
              return bool.TryParse(data.ToString(), out result) && result;
          }
  
          /// <summary>
          /// 获取布尔值
          /// </summary>
          private static bool? GetBool(this object data)
          {
              switch (data.ToString().Trim().ToLower())
              {
                  case "0":
                      return false;
                  case "1":
                      return true;
                  case "是":
                      return true;
                  case "否":
                      return false;
                  case "yes":
                      return true;
                  case "no":
                      return false;
                  default:
                      return null;
              }
          }
  
          /// <summary>
          /// 转换为可空布尔值
          /// </summary>
          /// <param name="data">数据</param>
          public static bool? ToBoolOrNull(this object data)
          {
              if (data == null)
                  return null;
              bool? value = GetBool(data);
              if (value != null)
                  return value.Value;
              bool result;
              bool isValid = bool.TryParse(data.ToString(), out result);
              if (isValid)
                  return result;
              return null;
          }
  
          #endregion
  
          #region 字符串转换
          /// <summary>
          /// 转换为字符串
          /// </summary>
          /// <param name="data">数据</param>
          public static string ToString(this object data)
          {
              return data == null ? string.Empty : data.ToString().Trim();
          }
          #endregion
  
          /// <summary>
          /// 安全返回值
          /// </summary>
          /// <param name="value">可空值</param>
          public static T SafeValue<T>(this T? value) where T : struct
          {
              return value ?? default(T);
          }
          /// <summary>
          /// 是否为空
          /// </summary>
          /// <param name="value">值</param>
          public static bool IsEmpty(this string value)
          {
              return string.IsNullOrWhiteSpace(value);
          }
          /// <summary>
          /// 是否为空
          /// </summary>
          /// <param name="value">值</param>
          public static bool IsEmpty(this Guid? value)
          {
              if (value == null)
                  return true;
              return IsEmpty(value.Value);
          }
          /// <summary>
          /// 是否为空
          /// </summary>
          /// <param name="value">值</param>
          public static bool IsEmpty(this Guid value)
          {
              if (value == Guid.Empty)
                  return true;
              return false;
          }
          /// <summary>
          /// 是否为空
          /// </summary>
          /// <param name="value">值</param>
          public static bool IsEmpty(this object value)
          {
              if (value != null && !string.IsNullOrEmpty(value.ToString()))
              {
                  return false;
              }
              else
              {
                  return true;
              }
          }
      }
  }
  