Chcę przeanalizować ciąg podobny "3.5"
do podwójnego. Jednak,
double.Parse("3.5")
daje 35 i
double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint)
rzuca a FormatException
.
Teraz ustawienia regionalne mojego komputera są ustawione na niemiecki, gdzie przecinek jest używany jako separator dziesiętny. Być może trzeba coś z tym zrobić i double.Parse()
oczekiwać, że "3,5"
będzie to wkład, ale nie jestem pewien.
Jak parsować ciąg zawierający liczbę dziesiętną, która może być sformatowana zgodnie z moimi bieżącymi ustawieniami regionalnymi?
Odpowiedzi:
źródło
XmlConvert
klasy ... czy masz jakieś pomysły, czy jest to lepsze, gorsze i / lub inne niż używanieCultureInfo.InvariantCulture
?XmlConvert
tak naprawdę nie jest przeznaczony do analizowania pojedynczej podwójnej wartości w kodzie. Wolę używaćdouble.Parse
lubConvert.ToDouble
to czyni moją intencję oczywistą.Zwykle używam funkcji wielokulturowej do analizowania danych wprowadzanych przez użytkownika, głównie dlatego, że jeśli ktoś jest przyzwyczajony do klawiatury numerycznej i używa kultury, która używa przecinka jako separatora dziesiętnego, osoba ta użyje punktu klawiatury numerycznej zamiast przecinka.
Uważaj jednak, komentarze @nikie są prawdziwe. W mojej obronie używam tej funkcji w kontrolowanym środowisku, w którym wiem, że kultura może być en-US, en-CA lub fr-CA. Używam tej funkcji, ponieważ w języku francuskim używamy przecinka jako separatora dziesiętnego, ale każdy, kto kiedykolwiek pracował w finansach, zawsze użyje separatora dziesiętnego na klawiaturze numerycznej, ale jest to kropka, a nie przecinek. Tak więc nawet w kulturze fr-CA muszę przeanalizować liczbę, która będzie miała kropkę jako separator dziesiętny.
źródło
Nie mogłem napisać komentarza, więc piszę tutaj:
double.Parse („3.5”, CultureInfo.InvariantCulture) nie jest dobrym pomysłem, ponieważ w Kanadzie piszemy 3,5 zamiast 3,5, a ta funkcja daje nam w rezultacie 35.
Przetestowałem oba na moim komputerze:
Jest to poprawny sposób, o którym wspomniał Pierre-Alain Vigeant
źródło
Przed analizą zamień przecinek na punkt. Przydatny w krajach z przecinkiem jako separatorem dziesiętnym. Pomyśl o ograniczeniu wprowadzania danych przez użytkownika (jeśli to konieczne) do jednego przecinka lub punktu.
źródło
Sztuką jest użycie niezmiennej kultury, aby przeanalizować kropkę we wszystkich kulturach.
źródło
Posłuchaj, każda powyższa odpowiedź, która proponuje napisanie zamiany ciągu na ciąg stały, może być tylko błędna. Czemu? Ponieważ nie przestrzegasz ustawień regionalnych systemu Windows! Windows zapewnia użytkownikowi swobodę ustawiania dowolnych znaków separatora. S / On może otworzyć panel sterowania, przejść do panelu regionu, kliknąć zaawansowane i zmienić postać w dowolnym momencie. Nawet podczas uruchamiania programu. Pomyśl o tym. Dobre rozwiązanie musi być tego świadome.
Najpierw musisz zadać sobie pytanie, skąd pochodzi ta liczba, którą chcesz przeanalizować. Jeśli pochodzi z danych wejściowych w .NET Framework, nie ma problemu, ponieważ będzie miał ten sam format. Ale może pochodziło to z zewnątrz, może z zewnętrznego serwera, może ze starej bazy danych, która obsługuje tylko właściwości ciągu. Tam administrator db powinien był podać regułę, w jakiej formacie mają być przechowywane liczby. Jeśli wiesz na przykład, że będzie to US DB w formacie US, możesz użyć tego fragmentu kodu:
Będzie to dobrze działać w dowolnym miejscu na świecie. I proszę nie używać „Convert.ToXxxx”. Klasa „Konwertuj” jest uważana jedynie za bazę do konwersji w dowolnym kierunku. Poza tym: Możesz użyć podobnego mechanizmu także dla DateTimes.
źródło
źródło
Moje dwa centy na ten temat, próbując zapewnić ogólną metodę podwójnej konwersji:
Działa zgodnie z oczekiwaniami z:
Nie domyślna konwersja jest realizowany, więc to nie starają się analizować
1.3,14
,1,3.14
czy podobne przypadki.źródło
Poniższy kod wykonuje zadanie w dowolnym scenariuszu. To trochę parsowanie.
źródło
Myślę, że 100% poprawna konwersja nie jest możliwa, jeśli wartość pochodzi z danych wejściowych użytkownika. np. jeśli wartość wynosi 123.456, może to być grupa lub kropka dziesiętna. Jeśli naprawdę potrzebujesz 100%, musisz opisać swój format i zgłosić wyjątek, jeśli nie jest poprawny.
Ale poprawiłem kod JanW, więc uzyskujemy trochę więcej do 100%. Chodzi o to, że jeśli ostatnim separatorem jest groupSeperator, byłby to raczej typ liczb całkowitych niż podwójny.
Dodawany kod znajduje się na pierwszym czy z GetDouble odwołują .
źródło
źródło
Zamiast określać ustawienia regionalne we wszystkich parsach, wolę ustawić ustawienia regionalne dla całej aplikacji, chociaż jeśli formaty ciągów nie są spójne w aplikacji, może to nie działać.
Zdefiniowanie tego na początku aplikacji sprawi, że wszystkie podwójne analizy będą oczekiwać przecinka jako separatora dziesiętnego. Możesz ustawić odpowiednie ustawienia narodowe, aby separator dziesiętny i tysiące pasowały do analizowanych ciągów.
źródło
Jest to trudne bez określenia, jakiego separatora dziesiętnego należy szukać, ale jeśli tak, używam tego:
To powinno działać z każdą kulturą. Prawidłowo nie analizuje ciągów znaków, które mają więcej niż jeden separator dziesiętny, w przeciwieństwie do implementacji, które zastępują zamiast zamiany.
źródło
Poprawiłem również kod @JanW ...
Potrzebuję go do formatowania wyników z instrumentów medycznych, a także wysyłają „> 1000”, „23.3e02”, „350E-02” i „NEGATYWNE”.
źródło
źródło
Myślę, że to najlepsza odpowiedź:
źródło
Poniżej jest mniej wydajna, ale używam tej logiki. Jest to ważne tylko wtedy, gdy masz dwie cyfry po przecinku.
źródło
Pomnóż liczbę, a następnie podziel ją przez liczbę pomnożoną wcześniej.
Na przykład,
źródło