2011-11-22 16 views
5

Mam aplikację .NET, która pozwala użytkownikowi wybrać język w swoim języku & kultura (formatowanie daty/liczby). Ich ustawienie kultury jest przechowywane w Thread.CurrentThread.CurrentCulture (również Thread.CurrentThread.CurrentUICulture, ale jest to oddzielny problem).Jaki jest najlepszy sposób na sparsowanie zlokalizowanych liczb z .NET/Razor w javascript?

Kiedy wydrukować var ​​przez Razor, to widać w formacie zlokalizowanej:

<span>@bignum</span> (renders as "123.456" or "123,456") 

Jednak również trzeba przekazać jakąś .NET vars do javascript:

var js_bignum = @bignum; 

Problemem jest to, JavaScript w tym przypadku nie rozumie zlokalizowanych wersji tych liczb, więc nie powiedzie się, ponieważ powyższe stwierdzenie staje się:

var js_bignum = 123,456; 

Może to wynikać z tego, że ustawienia kulturowe przeglądarki użytkownika różnią się od ustawień kultury internetowej użytkownika. W każdym razie jest to sytuacja, z którą musimy sobie poradzić.

Jaki jest najłatwiejszy sposób na poradzenie sobie z tym? Mogę utworzyć własny skrypt JavaScript ConvertToStandardNumberFormat(), który pobiera wartość ciągu z .NET i zwraca "standardowy" format liczbowy, ale wydaje się to być trochę hackerem. Czy istnieje sposób na wymuszenie .NET/maszynki do golenia w celu renderowania nie zlokalizowanego numeru formatu?

var js_bignum = @price.ToUnlocalizedFormat(); (Is there something like this?) 

Po prostu staram się dowiedzieć, jakie najlepsze praktyki są dla tego typu sytuacji.

Dzięki!

+3

Czy możesz w ogóle wywoływać metody z wyrażeń żyletkowych? Ponieważ właśnie to powinno robić 'number.ToString (CultureInfo.InvariantCulture) (modulo Razor, aby zaimportować właściwe przestrzenie nazw itp.). – millimoose

Odpowiedz

4

użyłbym @price.ToString(CultureInfo.InvariantCulture)

Edit

muszę zgodzić się z João odpowiedź i to zły pomysł ™ rozważenia. Nie polecałbym ponownego wynajdywania koła. Jeśli wolisz bardziej wszechstronne podejście, zdecydowałbym się dołączyć dedykowaną bibliotekę kodowania JSON C# (polecam JsonFx.NET).

Najprostszym podejściem byłoby utworzenie rozszerzenia HtmlHelper. Coś jak:

public static class JsonExtensions { 
    public static string ToJson(this HtmlHelper html) { 
     return new JsonWriter().Write(t); 
    } 
} 

następnie używać go w widoku z:

@Html.ToJson(price) 

To powinno obsługiwać prymitywnych typów jak również złożone typy.

Później prawdopodobnie pomogę w opracowaniu różnych schematów wtryskowych, dzięki czemu nie będę tworzyć nowego JsonWriter z każdym wywołanym przez niego wezwaniem.

Ale to będzie dużo bardziej elastyczne (i sprawdzone) niż walcowanie własne serializatora w formie statycznej klasy pomocnika ...

+0

Dzięki! Brakowało "CultureInfo.InvariantCulture". Dokładnie tego chciałem - agnostyczna funkcja formatowania przyjazna dla javascript. – rocketmonkeys

3

Jak już wspomniano w innym odpowiedź łatwym rozwiązaniem byłoby zadzwonić ToString z the InvariantCulture, jednak nie oznacza to wyraźnego zamiaru użytkownika i może skłonić ludzi do założenia, że ​​InvariantCulture działa dla innych typów danych.

Gdybym ci ja owinąć logikę formatowania w klasie pomocnika, coś jak następuje i wywołać metody pomocnicze w razie potrzeby:

public static class JsLiteral 
{ 
    public static string From(float number) 
    { 
     return From((double)number); 
    } 

    public static string From(double number) 
    { 
     return number.ToString(CultureInfo.InvariantCulture); 
    } 

    public static string From(bool flag) 
    { 
     return flag ? "true" : "false"; 
    } 
} 

Jest to łatwiejsze w utrzymaniu, a także jasno wyrazić swoje intencje, gdy używasz go w widoku @JsLiteral.From(bignum).

Powiązane problemy