using System;
using System.Globalization;
namespace VB6
{
/// <summary>
/// VB6 の CStr 関数を C# に移植した互換関数です。
/// </summary>
public static class Functions
{
/// <summary>
/// VB6 の CStr と同じ規則で任意の値を文字列に変換します。
/// </summary>
/// <param name="value">文字列に変換する値。</param>
/// <returns>
/// VB6 の CStr と同じ変換結果。
/// null や DBNull の場合は空文字列。
/// 数値は桁区切りなしでカルチャ依存の書式。
/// 日付は現在カルチャに従った文字列。
/// Boolean は "True" または "False"。
/// </returns>
/// <remarks>
/// このメソッドは VB6 → C# 自動変換を前提として設計されています。
/// VB6 の暗黙の文字列変換の動作を再現するため、通常の .NET の
/// <see cref="Convert.ToString(object)"/> とは一部異なる挙動になります。
/// </remarks>
public static string CStr(object value)
{
if (value == null || value is DBNull)
return string.Empty;
switch (Type.GetTypeCode(value.GetType()))
{
case TypeCode.String:
return (string)value;
case TypeCode.Boolean:
return (bool)value ? "True" : "False";
case TypeCode.Char:
return value.ToString();
case TypeCode.SByte:
case TypeCode.Byte:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
case TypeCode.Single:
case TypeCode.Double:
case TypeCode.Decimal:
// VB6のCStrは数値に桁区切りを付けない
return Convert.ToString(value, CultureInfo.CurrentCulture);
case TypeCode.DateTime:
return ((DateTime)value).ToString(CultureInfo.CurrentCulture);
default:
return value.ToString();
}
}
}
}