Kropka zamiast przecinka w liczbach

0

W bazie sql mam 1.5
Po odczycie
wartosc = Convert.ToDouble(Poz["wartosc"]);

mam 1,5

Dlaczego robi się przecinek a nie kropka?
Jak to poprawić?

4

Musisz głęboko przetrawić czym jest liczba sama w sobie (siedem jabłek) a czym jest wizualna reprezentacja (liczby arabskie, rzymskie czy japońskie - a jabłek jest ciągle siedem).
Jak to przemyślisz,z poczytaj o krajowych formatach liczb, dat itp.

Spodziewam się zrozumiesz, że problem nie ma żadnego istotnego znaczenia.

0

Ale w czym problem? Że źle ci konwertuje liczbe z przecinkiem do double czy że z bazy dostajesz w przecinkiem? Jak to pierwsze to mozesz zrobić tak:

wartosc = Convert.ToDouble(Poz["wartosc"], CultureInfo.GetCultureInfo("pl-PL"));
0
AnyKtokolwiek napisał(a):

Musisz głęboko przetrawić czym jest liczba sama w sobie (siedem jabłek) a czym jest wizualna reprezentacja (liczby arabskie, rzymskie czy japońskie - a jabłek jest ciągle siedem).
Jak to przemyślisz,z poczytaj o krajowych formatach liczb, dat itp.

Spodziewam się zrozumiesz, że problem nie ma żadnego istotnego znaczenia.

Problem w tym, że jak wysyłam to w xml do drukarki to drukarka dostaje 1 a nie 1.5

1
harbii napisał(a):

W bazie sql mam 1.5
Po odczycie
wartosc = Convert.ToDouble(Poz["wartosc"]);

mam 1,5

Nie, nie masz po odczycie "1,5", to dopiero masz po powtórnej konwersji double'a do stringa.
Double to double, format binarny, nie ma w nim ani kropki ani przecinka.

Jeśli chcesz stringa z kropką to da się (używając CultureInfo.InvariantCulture) ale... jeżeli twoje Poz["wartosc"] to string o treści "1.5" to znaczy że jest już tym co ci potrzeba?

0
Azarien napisał(a):
harbii napisał(a):

W bazie sql mam 1.5
Po odczycie
wartosc = Convert.ToDouble(Poz["wartosc"]);

mam 1,5

Nie, nie masz po odczycie "1,5", to dopiero masz po powtórnej konwersji double'a do stringa.
Double to double, format binarny, nie ma w nim ani kropki ani przecinka.

Jeśli chcesz stringa z kropką to da się (używając CultureInfo.InvariantCulture) ale... jeżeli twoje Poz["wartosc"] to string o treści "1.5" to znaczy że jest już tym co ci potrzeba?

Po convert.todouble wartosc = 1,5 (czyli jest przecinek) co za tym idzie podczas mnożenia, dodawania zaokrągla mi do 1.00. Dlaczego?

0
harbii napisał(a):
Azarien napisał(a):
harbii napisał(a):

W bazie sql mam 1.5
Po odczycie
wartosc = Convert.ToDouble(Poz["wartosc"]);

mam 1,5

Nie, nie masz po odczycie "1,5", to dopiero masz po powtórnej konwersji double'a do stringa.
Double to double, format binarny, nie ma w nim ani kropki ani przecinka.

Jeśli chcesz stringa z kropką to da się (używając CultureInfo.InvariantCulture) ale... jeżeli twoje Poz["wartosc"] to string o treści "1.5" to znaczy że jest już tym co ci potrzeba?

Po convert.todouble wartosc = 1,5 (czyli jest przecinek) co za tym idzie podczas mnożenia, dodawania zaokrągla mi do 1.00. Dlaczego?

Zamiast się wykłócać, przeczytaj jeszcze raz co ci napisał Azarien, a jak to nie pomoże to podaj więcej kodu, bo błąd masz w innym miejscu!

A generalnie Azarienonwi chodziło o to, że wartosc nie zawiera informacji jaki jest separator dziesiętny. To tylko wartość liczbowa.
W kodzie, którym zapisujesz wartosc do xml dokonujesz konwersji do napisu i tam robisz to źle.

0

Moje rozwiązanie:

odczyt z mysql

wartosc = Convert.ToDouble(Poz["wartosc"]);

zamiana na kropkę

string wartoscs = Convert.ToString(wartosc);
wartoscs = wartoscs.Replace(",", ".").Replace(".", ".");

Dzięki

3

Convert.ToString Method (System) | Microsoft Docs

ToString(Double)

Converts the value of the specified double-precision floating-point number to its equivalent string representation.

......

Remarks

This implementation is identical to Double.ToString().

Idąc za ostatnim linkiem:

Double.ToString Method (System) | Microsoft Docs

ToString()

Converts the numeric value of this instance to its equivalent string representation.
......

Remarks

The ToString() method formats a Double value in the default ("G", or general) format of the current culture. If you want to specify a different format, precision, or culture, use the other overloads of the ToString method, as follows:

czyli powinno być:

string wartoscs = wartosc.ToString(CultureInfo.InvariantCulture);
0
harbii napisał(a):

Dlaczego robi się przecinek a nie kropka?

Bo takie masz ustawienia systemowe. Najprawdopodobniej polskie. A w języku polskim separatorem dziesiętnym jest jedyny słuszny przecinek.

harbii napisał(a):

zamiana na kropkę

string wartoscs = Convert.ToString(wartosc);
wartoscs = wartoscs.Replace(",", ".").Replace(".", ".");

Tak, ta zamiana kropki na kropkę to faktycznie musi być autorskie rozwiązanie. Tak czy siak, nie używając wbudowanych sposobów na konwersję z uwzględnieniem ustawień regionalnych robisz to źle.

0
harbii napisał(a):

Moje rozwiązanie:

odczyt z mysql

wartosc = Convert.ToDouble(Poz["wartosc"]);

zamiana na kropkę

string wartoscs = Convert.ToString(wartosc);
wartoscs = wartoscs.Replace(",", ".").Replace(".", ".");

Dzięki

  1. Już od początku, bazę masz dziwną / dziwnie obsługujesz. Nie ma tam pola liczbowego? To by było chore.
  2. Twoje rozwiązanie zaprzecza pierwotnemu celowi, jaki zadeklarowałeś (liczba double), Zmieniasz założenia na string. Czyli głównym błędem jaki zwalczasz jesteś sam Ty. Zresztą złączenie tych fragmentów kodu, które widzimy, by się nie kompilowało.
  3. bez pełnego kodu to zabawa w ciuciubabkę.
4
harbii napisał(a):

zamiana na kropkę

string wartoscs = Convert.ToString(wartosc);
wartoscs = wartoscs.Replace(",", ".").Replace(".", ".");

Tak się tego nie robi.

Tak się robi:

          string wartoscs = Convert.ToString(wartosc, CultureInfo.InvariantCulture);
0

A ja dodam to swoje pytanie czy na początku projektu warto od razu ustawić język regionu aplikacji na angielski by w przyszłości uniknąć chociażby problemów z wczytywaniem danych z html( pamiętam że sam miałem problem że z widoku od inputa przychodziła mi wartość z kropką jako separator.

5

Nie, chyba że piszesz ją tylko na swój użytek. ToString powinno być stosowane tylko do prezentacji danych użytkownikowi, a wtedy dobrze gdy jest sformatowane według jego ustawień w systemie. Jeśli musisz użyć z jakiegoś powodu ToString żeby przesłać dane dalej w innym formacie to stosujesz InvariantCulture

Użytkownik też powinien podawać dane w swoim lokalnym formacie, a wtedy do parsowania powinno służyć zwykłe Parse czy Convert bez parametrów. Niestety większość programów robi to źle i wymaga na przykład kropki wszędzie i niektórzy użytkownicy sami próbują wpisywać wszędzie kropkę nawet gdy są z kraju gdzie obowiązuje przecinek. Przez to często przed parsowaniem niestety trzeba zamienić przecinek na kropkę bo nie wiadomo w jakim języku do nas użytkownik mówi a potem otwierają tickety zamiast się nauczyć pisać przecinek.

Excel już w ogóle robi to źle bo zapisuje pliki .csv w lokalnym formacie, przez co plik zapisany w jednym kraju nie chce się potem dobrze otworzyć w innym kraju. Nie mówiąc że nazwy funkcji w formułach arkusza są w lokalnym języku którego excel z innego kraju nie rozumie (poprawili to?)

0
Phoryn napisał(a):

A ja dodam to swoje pytanie czy na początku projektu warto od razu ustawić język regionu aplikacji na angielski

I co, każdemu użytkownikowi powiesz, że ma sobie ustawić angielski?

Zresztą zdarzają się takie źle napisane aplikacje które przy innym niż kropka ustawieniu systemowym się zawieszają albo wywalają wyjątek.
Nie idź tą drogą.

1
obscurity napisał(a):

Excel już w ogóle robi to źle bo zapisuje pliki .csv w lokalnym formacie, przez co plik zapisany w jednym kraju nie chce się potem dobrze otworzyć w innym kraju. Nie mówiąc że nazwy funkcji w formułach arkusza są w lokalnym języku którego excel z innego kraju nie rozumie (poprawili to?)

A widziałeś kiedykolwiek, że nie rozumie?

Tak komórka wygląda w Excelu 2010:

a.png

a tak jest zdefiniowana w pliku .xlsx (po rozpakowaniu zipem):

b.png

1

Temat do perełek?

0
Azarien napisał(a):
harbii napisał(a):

zamiana na kropkę

string wartoscs = Convert.ToString(wartosc);
wartoscs = wartoscs.Replace(",", ".").Replace(".", ".");

Tak się tego nie robi.

Tak się robi:

          string wartoscs = Convert.ToString(wartosc, CultureInfo.InvariantCulture);

Dziękuję za poprawienie.

1

Witam,

Może zacznij od tego jak pobierasz dane z bazy danych bo jakoś widzę tutaj podwójną konwersję bez zastanowienia się nad tym jakie są ustawienia "lokalizacyjne". Co zaś tyczy się generowania XML-a to może zobacz jak używa się serializacji zamiast robienie tego z palca.

Pozdrawiam,
mr-owl

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