Dowolna liczba na string bez względu na ustawienia regionalne

0

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();
}
1

gdzie to płacą za liczbę linii? :)

  Convert.ToString(O, CultureInfo.InvariantCulture);
0
if (Double.TryParse(O))
{
    OutStr = O.ToString(CultureInfo.InvariantCulture);
}
else
{
    OutStr = O.ToString();
}

Moze cos takiego?;)

0
Wielki Szczur napisał(a):

gdzie to płacą za liczbę linii? :)

  Convert.ToString(O, CultureInfo.InvariantCulture);

To rozwiązało problem

FakeAccount napisał(a):
if (Double.TryParse(O))
{
    OutStr = O.ToString(CultureInfo.InvariantCulture);
}
else
{
    OutStr = O.ToString();
}

Moze cos takiego?;)

Nie bardzo, Być może w .NET 4.5 lub 4.5 to się da, ale w 3.5 w sytuacji, gdy O jest typu object, to OutStr = O.ToString(CultureInfo.InvariantCulture) wywołuje błąd kompilacji, że nie ma wersji metody ToString przyjmującej 1 argument.

0

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.

A powinno być jak?

1 użytkowników online, w tym zalogowanych: 0, gości: 1