Nieobsługiwany wyjątek przy Convert.ToDecimal

0

Witam

System.FormatException: „Nieprawidłowy format ciągu wejściowego.”

Dostaje taki komunikat przy Convert.ToDecimal.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lekcja1
{
    class Program
    {
        static void Main()
        {
            decimal decimalVal;
            string stringVal = "2,345.26";
            decimalVal = System.Convert.ToDecimal(stringVal);
            System.Console.WriteLine("String converted to decimal = {0} ", decimalVal);


             Console.ReadKey();
        }
    }
}
 

Mogę prosić o jakieś sugestie?

0
szweszwe napisał(a):

U mnie działa:
https://dotnetfiddle.net/hC8yWS

Cieszę się :) jestem tylko ciekawy dlaczego u mnie wyrzuca taki komunikat ?

1

Dlatego, że masz przecinek i kropkę. Jeśli koniecznie potrzebujesz takiego formatu dodaj na początku:

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");

Lub coś takiego:

decimalVal = System.Convert.ToDecimal(stringVal,CultureInfo.GetCultureInfo("en-US"));
0

I teraz mam:

"Nazwa "Thread"/"CultureInfo" nie istnieje w bieżącym kontekście"

Help please :)

0
using System.Globalization;
using System.Threading;

0
litrmleka napisał(a):
using System.Globalization;
using System.Threading;

Dzieki sliczne. A mozecie mi powiedziec za co odpowiadaja te dwa wiersze :) :) :) :)

edit:
oraz te dwa?

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");

Lub coś takiego:

decimalVal = System.Convert.ToDecimal(stringVal,CultureInfo.GetCultureInfo("en-US"));
2

Te using odpowiadają za dołączenie odpowiednich przestrzeni nazw, żebyś mógł korzystać bezpośrednio z klas Thread oraz CultureInfo.

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");

Ustawia ustawienia regionalne aktualnego wątku twojej aplikacji na ustawienia regionalne angielskie amerykańskie.

decimalVal = System.Convert.ToDecimal(stringVal,CultureInfo.GetCultureInfo("en-US"));

Konwertuje liczbę ze stringa do Decimal korzystając z angielskich amerykańskich ustawień regionalnych.

Bo ogólnie twój problem polegał tutaj na tym, że liczba 2,345.26 zapisana jest w sposób amerykański, a aplikacje .NET zawsze domyślnie korzystają z ustawień regionalnych systemu do konwersji (a w języku polskim - ustawieniach pl-PL - ta liczba miałaby postać 2 345,26).

0

Dziękuje bardzo.

A jeśli chce przekonwertować liczby:

a)123.0
b)123,0
c)1 230.0
d)1 230,0

to mam problem z c) i d). Jakie ustawienia powinienem zastosowac aby konwertowanie zadziałało na liczby ze spacjami?

0

Na przykład duńskie.

0
somekind napisał(a):

Na przykład duńskie.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Globalization;
using System.Threading;


namespace Zadanie3
{
    class Program
    {
        static void Main()
        {
            decimal decimalVal1;
            decimal decimalVal2;
            decimal decimalVal3;
            decimal decimalVal4;
            string stringVal1 = "123.0";
            string stringVal2 = "123,0";
            string stringVal3 = "1 230.0";
            string stringVal4 = "1 230,0";
            decimalVal1 = System.Convert.ToDecimal(stringVal1, CultureInfo.GetCultureInfo("en-US"));
            decimalVal2 = System.Convert.ToDecimal(stringVal2, CultureInfo.GetCultureInfo("en-US"));
            decimalVal3 = System.Convert.ToDecimal(stringVal3, CultureInfo.GetCultureInfo("da-DK"));
            decimalVal4 = System.Convert.ToDecimal(stringVal4, CultureInfo.GetCultureInfo("da-DK"));

            System.Console.WriteLine("String converted to decimal = {0} ", decimalVal1);
            System.Console.WriteLine("String converted to decimal = {0} ", decimalVal2);
            System.Console.WriteLine("String converted to decimal = {0} ", decimalVal3);
            System.Console.WriteLine("String converted to decimal = {0} ", decimalVal4);

            Console.ReadKey();
        }
    }

}

Niestety na decimalVal3 wyrzuca tez sam komunikat "Nieprawidłowy format ciągu wejściowego"

0

Faktycznie, duńska kultura nie pomoże. A czemu po prostu nie usuniesz spacji przed parsowaniem?

0
somekind napisał(a):

Faktycznie, duńska kultura nie pomoże. A czemu po prostu nie usuniesz spacji przed parsowaniem?
Mam takie zadanie "Napisz funkcję GetDecimal(string number) zwracającą decimal. Uwzględnij input w formatach: 123.0, 123,0, 1 230.0 oraz 1 230,0."

Więc chyba muszę uwzględnić te odstępy. Ale nie wiem jak? Czy macie jeszcze jakieś sugestie rozwiązania tego problemu?

0

Musisz uwzględnić, ale nikt Ci nie broni przecież inputu oczyścić, prawda?

0

A nie lepiej usunąć pusty znak z tego ciągu ? z 1 250 na 1250 takie przekształcenie. Przecież dla matematyka 1 000 to to samo co 1000.

0

Może trzeba samemu zaimplementować interfejsy IFormatProvider, ICustomFormatter ?
https://docs.microsoft.com/pl-pl/dotnet/api/system.iformatprovider?view=netframework-4.7.2 .

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