2011-11-22 13 views
5

Tengo una aplicación .NET que permite a un usuario elegir su propio idioma & cultura (formato de fecha/número). Su configuración de cultura se almacena en Thread.CurrentThread.CurrentCulture (también Thread.CurrentThread.CurrentUICulture, pero eso es un problema aparte).¿Cuál es la mejor manera de analizar los números localizados de .NET/Razor en javascript?

Al imprimir un var a través de la maquinilla de afeitar, que muestra en formato localizada:

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

Sin embargo, también necesito pasar algún .NET VARs Javascript:

var js_bignum = @bignum; 

El problema es que Javascript en este caso no comprende las versiones localizadas de estos números, por lo que falla ya que la instrucción anterior se convierte en:

var js_bignum = 123,456; 

Puede ser porque la configuración de la cultura del navegador del usuario es diferente de la configuración de la cultura de la aplicación web del usuario. En cualquier caso, es una situación que debemos ser capaces de manejar.

Entonces, ¿cuál es la forma más fácil de manejar esto? Puedo crear mi propio Javascript ConvertToStandardNumberFormat() que toma un valor de cadena de .NET y devuelve un formato de número "estándar", pero parece un truco. ¿Hay alguna manera de forzar .NET/razor para generar un número de formato no localizado?

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

Estoy tratando de descubrir cuáles son las mejores prácticas para este tipo de situación.

Gracias!

+3

¿Puede llamar métodos de expresiones Razor en absoluto? Porque esto es lo que 'number.ToString (CultureInfo.InvariantCulture)' debería hacer (modulo Razor sintaxis para importar los espacios de nombres correctos, etc.). – millimoose

Respuesta

4

me gustaría utilizar @price.ToString(CultureInfo.InvariantCulture)

Editar

puedo estar de acuerdo con la respuesta João y lo consideraría una mala idea ™. No recomendaría reinventar la rueda. Si prefieres un enfoque más completo, entonces optaría por incluir una biblioteca de codificación C# JSON dedicada (recomendaría JsonFx.NET).

El enfoque más simple, yo haría una extensión HtmlHelper. Algo así como:

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

luego usarlo en una vista con:

@Html.ToJson(price) 

Esto debe manejar tipos primitivos, así como los tipos complejos.

Después de eso probablemente refaccioné las cosas y traté de obtener un mejor patrón de inyección para no crear un nuevo JsonWriter con cada llamada al ayudante.

Pero esto será mucho más flexible (y probado) que rodar su propia serializador en forma de una clase auxiliar estática ...

+0

Gracias! El "CultureInfo.InvariantCulture" es lo que me faltaba. Esto es exactamente lo que quería: una función de formateo amigable con JavaScript y que no afecta a la cultura. – rocketmonkeys

3

Como ya se ha dicho en otra respuesta una solución fácil sería llamar con ToString el InvariantCulture, sin embargo, esto no indica claramente su intención y puede inducir a la gente a suponer que InvariantCulture funciona para otros tipos de datos.

Si yo fuera usted quisiera envolver la lógica de formateo en una clase de ayuda, algo así como lo siguiente y llamar a los métodos de ayuda cuando sea necesario:

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"; 
    } 
} 

Esto es más fácil de mantener y expresar claramente sus intenciones cuando lo usa en una vista @JsLiteral.From(bignum).

Cuestiones relacionadas