Chodzi o to, że jest obiekt z zewnątrz, który może być liczbą, ale nie wiadomo, jakiego jest typu, jest to liczba wyciągana z bazy danych SQL (mają być obsługiwane różne bazy SQL, między innymi MSSQL, SQLite, MySql) i chodzi o zamianę na reprezentację tekstową, ale w standardowy sposób, bez względu na język i ustawienia systemu Windows.
Gdyby nie to, to problem załatwia taki kod:
OutStr = O.ToString();
Samo użycie ToString uwzględnia ustawienia i np. w liczbie ułamkowej separatorem dziesiętnym jest przecinek. A jak użyję InvariantCulture, to zamienia się na standardową liczbę ułamkową, gdzie nie ma separatora tysięcy i separatorem ułamkowym jest kropka.
Jedyne, co wymyśliłem to takie coś:
if ((O is string) || (O is char))
{
OutStr = O.ToString();
}
else
{
if (O is int)
{
OutStr = ((int)O).ToString(CultureInfo.InvariantCulture);
}
else
{
if (O is uint)
{
OutStr = ((uint)O).ToString(CultureInfo.InvariantCulture);
}
else
{
if (O is long)
{
OutStr = ((long)O).ToString(CultureInfo.InvariantCulture);
}
else
{
if (O is ulong)
{
OutStr = ((ulong)O).ToString(CultureInfo.InvariantCulture);
}
else
{
if (O is float)
{
OutStr = ((float)O).ToString(CultureInfo.InvariantCulture);
}
else
{
if (O is double)
{
OutStr = ((double)O).ToString(CultureInfo.InvariantCulture);
}
else
{
if (O is decimal)
{
OutStr = ((decimal)O).ToString(CultureInfo.InvariantCulture);
}
else
{
if (O is sbyte)
{
OutStr = ((sbyte)O).ToString(CultureInfo.InvariantCulture);
}
else
{
if (O is byte)
{
OutStr = ((byte)O).ToString(CultureInfo.InvariantCulture);
}
else
{
if (O is short)
{
OutStr = ((short)O).ToString(CultureInfo.InvariantCulture);
}
else
{
if (O is ushort)
{
OutStr = ((ushort)O).ToString(CultureInfo.InvariantCulture);
}
else
{
OutStr = O.ToString();
}
}
}
}
}
}
}
}
}
}
}
}
Działa to poprawnie, ale narzucam sposób i kolejność badania typów. Jak widać, na piechotę jest badanie typu i zachowanie praktycznie identyczne dla każdego typu ze wszystkich przewidzianych typów w .NET.
Czy da się w jednej czy dwóch liniach kodu napisać to, co podałem powyżej?
Myślę o czymś takim, zapisane w pseudokodzie:
if (JestToLiczba(O))
{
OutStr = O.ToString(CultureInfo.InvariantCulture);
}
else
{
OutStr = O.ToString();
}