Konwersja między liczbą a łańcuchem w C# - z kropką

Uwaga! Informacje na tej stronie mają ponad 5 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

Sun
27
Jan 2008

C# to piękny język, ale ostatnio natrafiłem na mały problem. Podczas konwersji liczby typu float na łańcuch typu string i odwrotnie, jako symbol dziesiętny domyślnie używany jest polski przecinek zamiast powszechnie przyjętej na świecie kropki. To jest problem, bo co jeśli na przykład tekstowy plik konfiguracyjny dołącozny do programu zawiera liczbę rzeczywistą zapisaną z kropką, a na komputerach użytkowników w zależności od ustawień międzynarodowych funkcja do konwersji będzie szukała przecinka czy jeszcze innego znaku?

Winne temu są oczywiście ustawienia kraju/języka (zwane w .NET "culture", w C/C++ "locale"). W C i C++ można spotkać to samo zjawisko, ale tam w programach trzeba to "locale" ręcznie ustawić posługując się funkcją setlocale czy też klasą locale z nagłówka <locale>. Domyślnie aktywne jest ustawienie angielskie. Aby w C# dokonać prawidłowej konwersji, trzeba zrobić tak:

1. Utworzyć obiekt klasy CultureInfo. Dla nas ważne jest, że on implementuje interfejs IFormatProvider. Przekazany do konstruktora łańcuch pusty oznacza "Invariant culture", a w praktyce obyczaje tekstowe dla języka angielskiego.

IFormatProvider FormatProvider =
  new System.Globalization.CultureInfo("");

2. Konwersja łańcucha na liczbę typu float z użyciem tego obiektu może wyglądać tak:

bool Result = float.TryParse(
  MyString,
  System.Globalization.NumberStyles.Float |
  System.Globalization.NumberStyles.AllowThousands,
  FormatProvider,
  out MyFloat);

3. Przykładowa konwersja liczby na łańcuch wygląda natomiast tak:

StringBuilder SB = new StringBuilder();
SB.AppendFormat(FormatProvider, "Number={0}", MyFloat);

Comments | #.net Share

Comments

[Download] [Dropbox] [pub] [Mirror] [Privacy policy]
Copyright © 2004-2020