2010-06-28 11 views
35

Chciałbym zmienić separator dziesiętny na inną postać w C#. Mam double zmienną valueJak zmienić symbol punktu dziesiętnego w podwójnym.ToString()?

double value; 

i kiedy należy użyć polecenia:

Console.WriteLine(value.ToString()); // output is 1,25 

wiem, że mogę to zrobić:

Console.WriteLine(value.ToString(
    CultureInfo.CreateSpecificCulture("en-GB"))); // output is 1.25 

ale nie lubię go bardzo dużo ponieważ jest bardzo długi i potrzebuję go dość często w moim programie.

Czy istnieje krótsza wersja ustawienia "przecinka dziesiętnego" tak naprawdę jako punkt, a nie przecinek, jak to zwykle jest w mojej kulturze?

Odpowiedz

77

Niektóre skrót jest stworzenie klasy NumberFormatInfo, ustaw jego właściwość NumberDecimalSeparator do „” i używaj klasy jako parametru do metody ToString(), gdy będziesz jej potrzebować.

NumberFormatInfo nfi = new NumberFormatInfo(); 
nfi.NumberDecimalSeparator = "."; 

value.ToString(nfi); 
+2

Bardziej lubię tę metodę, ponieważ jej język jest niezależny! –

15

Być może nie rozumiem intencji twojego pytania, więc popraw mnie, jeśli się mylę, ale czy nie możesz zastosować ustawień kultury globalnie, a potem nie martwić się dostosowywaniem każdego zapisu?

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB"); 
+0

Cóż, nie potrzebuję go w całym programie Potrzebuję go do formatu PathGeometry w WPF, w którym oczekiwane są wartości dziesiętne. Okazuje się jednak, że to rozwiązanie nie zaszkodzi cokolwiek innego. Dziękuję Ci! –

+0

@womp O wiele lepsza odpowiedź! Czy dotyczy to również wątków podrzędnych, jeśli ustawię to w moim głównym wątku? Chciałbym zastosować to ustawienie dla całego czasu wykonania mojego montażu. – Bitterblue

32

Utwórz metodę przedłużenia?

Console.WriteLine(value.ToGBString()); 

// ... 

public static class DoubleExtensions 
{ 
    public static string ToGBString(this double value) 
    { 
     return value.ToString(CultureInfo.GetCultureInfo("en-GB")); 
    } 
} 
+0

Może ktoś przegrał, ponieważ, chociaż działa to jak zaklęcie, można to zrobić ładniej, ustawiając globalnie informacje o kulturze. Btw. nie jestem downvoter.:) –

+1

@Thomas: Rzeczywiście, chociaż kiedy OP mówi: "Potrzebuję tego dość często w moim programie" *, interpretowałem to jako coś oznaczającego * "często, ale nie za każdym razem" *. – LukeH

14

Możesz zmienić separator dziesiętny, zmieniając kulturę używaną do wyświetlania liczby. Należy jednak pamiętać, że zmieni to wszystko, co dotyczy liczby (np. Separator grupujący, rozmiary grupowania, liczba miejsc dziesiętnych). Z Twojego pytania wynika, że ​​domyślnie używasz kultury, która używa przecinka jako separatora dziesiętnego.

Aby zmienić tylko Separator dziesiętny bez zmiany kultury, które można modyfikować właściwości obecna kultura na NumberFormatInfoNumberDecimalSeparator.

Thread.CurrentCulture.NumberFormat.NumberDecimalSeparator = "."; 

Spowoduje to zmianę aktualnej kultury wątku. Wszystkie dane wyjściowe zostaną teraz zmienione, co oznacza, że ​​możesz po prostu użyć value.ToString(), aby wyprowadzić żądany format, bez obawy o zmianę kultury przy każdym wyprowadzeniu numeru.

(Zauważ, że neutral kultura nie może mieć separator dziesiętny zmianie.)

+5

Jeśli spróbujesz to zrobić, pojawi się błąd "Wystąpienie jest tylko do odczytu". –

+0

@MariusStanescu Wydaje mi się, że dzieje się tak tylko w przypadku korzystania z kultury nuetalnej, jak zauważył Adrianbanks pod koniec swojej odpowiedzi. – patrickbadley

+0

@patrickbadley Właśnie próbowałem tego rozwiązania i napotkałem błąd "tylko do odczytu". Dodanie "Culture.IsNeutralCulture" w "Watch window" stało się jasne, że kultura nie była neutralna. Zauważyłem jednak, że był on tylko do odczytu. Klonowanie kultury wydaje się być właściwą drogą. Zobacz następujące [odpowiedź] (http://stackoverflow.com/a/3912937/4625305). – AXMIM

1

Jeśli masz aplikacji ASP.NET sieci Web, można również ustawić go w web.config tak, że jest taka sama w całej cała aplikacja internetowa

<system.web> 
    ... 
    <globalization 
     requestEncoding="utf-8" 
     responseEncoding="utf-8" 
     culture="en-GB" 
     uiCulture="en-GB" 
     enableClientBasedCulture="false"/> 
    ... 
</system.web> 
Powiązane problemy