2011-11-22 1 views
5

Ho un'app .NET che consente a un utente di scegliere la propria lingua & cultura (data/formattazione del numero). La loro impostazione cultura è memorizzata in Thread.CurrentThread.CurrentCulture (anche Thread.CurrentThread.CurrentUICulture, ma questo è un problema separato).Qual è il modo migliore per analizzare numeri localizzati da .NET/Razor in javascript?

Quando stampo un var via Razor, mostra in formato localizzato:

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

Tuttavia, ho anche bisogno di passare un po 'di .NET VAR di Javascript:

var js_bignum = @bignum; 

Il problema è che Javascript in questo caso non capisce le versioni localizzate di questi numeri, quindi fallisce da quando la dichiarazione sopra diventa:

var js_bignum = 123,456; 

Può essere dovuto al fatto che l'impostazione cultura del browser dell'utente è diversa dall'impostazione cultura dell'utente webapp. In ogni caso, è una situazione che dobbiamo essere in grado di gestire.

Quindi qual è il modo più semplice per gestire questo? Posso creare il mio Javascript ConvertToStandardNumberFormat() che accetta un valore di stringa da .NET e restituisce un formato numerico "standard", ma sembra un po 'un trucco. Esiste un modo per forzare .NET/rasoio a rendere un numero di formato non localizzato?

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

Sto solo cercando di capire quali sono le migliori pratiche per questo tipo di situazione.

Grazie!

+3

È possibile chiamare metodi dalle espressioni Razor? Perché questo è ciò che 'number.ToString (CultureInfo.InvariantCulture)' dovrebbe fare (sintassi del modulo Razor per l'importazione dei namespace giusti, ecc.). – millimoose

risposta

4

userei @price.ToString(CultureInfo.InvariantCulture)

Modifica

Non sono d'accordo con João risposta, e lo considero una cattiva idea ™. Non consiglierei di reinventare la ruota. Se si preferisce un approccio più completo, sceglierei una libreria di codifica C# JSON dedicata (io raccomanderei lo JsonFx.NET).

L'approccio più semplice, vorrei creare un'estensione HtmlHelper. Qualcosa di simile:

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

poi usarlo in una vista con:

@Html.ToJson(price) 

Questo dovrebbe gestire i tipi primitivi e tipi complessi.

Dopodiché avrei probabilmente rifattorizzato le cose e ho cercato di ottenere un modello di iniezione migliore in modo da non creare un nuovo JsonWriter con ogni chiamata all'assistente.

Ma questo sarà molto più flessibile (e testato) di posizionare il proprio serializzatore nella forma di una classe di supporto statica ...

+0

Grazie! La "CultureInfo.InvariantCulture" è ciò che mi mancava. Questo è esattamente quello che volevo: una funzione di formattazione javascript-friendly cultura-agnostica. – rocketmonkeys

3

Come già detto in un'altra risposta una soluzione facile sarebbe quella di chiamare ToString con il numero InvariantCulture, tuttavia questo non indica chiaramente il tuo intento e può indurre le persone a pensare che lo InvariantCulture funzioni per altri tipi di dati.

Se fossi in te mi avvolgo la logica di formattazione in una classe di supporto, qualcosa di simile a quanto segue e chiamo i metodi di supporto dove necessario:

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

questo è più facile da mantenere e anche esprimere chiaramente le vostre intenzioni quando lo usi in una vista @JsLiteral.From(bignum).