2011-11-22 8 views
5

मेरे पास एक .NET ऐप है जो उपयोगकर्ता को अपनी भाषा & संस्कृति (दिनांक/संख्या स्वरूपण) चुनने की अनुमति देता है। उनकी संस्कृति सेटिंग Thread.CurrentThread.CurrentCulture (Thread.CurrentThread.CurrentUICulture में भी संग्रहीत है, लेकिन यह एक अलग मुद्दा है)।जावास्क्रिप्ट में .NET/Razor से स्थानीयकृत संख्याओं को पार्स करने का सबसे अच्छा तरीका क्या है?

जब मैं रेजर के माध्यम से एक वर प्रिंट आउट, वह स्थानीय प्रारूप में पता चलता है:

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

हालांकि, मैं भी कुछ नेट उत्तीर्ण करने की आवश्यकता जावास्क्रिप्ट को वार्स:

var js_bignum = @bignum; 

समस्या है कि इस मामले में जावास्क्रिप्ट इन संख्याओं के स्थानीय संस्करणों को समझ में नहीं आता है, इसलिए यह उपरोक्त कथन बनने में विफल रहता है:

var js_bignum = 123,456; 

ऐसा इसलिए हो सकता है क्योंकि उपयोगकर्ता की ब्राउज़र की संस्कृति सेटिंग उपयोगकर्ता की वेबपैप की संस्कृति सेटिंग से अलग है। किसी भी दर पर, यह एक ऐसी स्थिति है जिसे हमें संभालने में सक्षम होना चाहिए।

तो इसे संभालने का सबसे आसान तरीका क्या है? मैं अपना स्वयं का जावास्क्रिप्ट ConvertToStandardNumberFormat() बना सकता हूं जो .NET से एक स्ट्रिंग मान लेता है और एक "मानक" संख्या प्रारूप देता है, लेकिन यह एक हैक की तरह लगता है। गैर-लोकलाइज्ड प्रारूप संख्या प्रस्तुत करने के लिए .NET/Razor को मजबूर करने का कोई तरीका है?

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

मैं यह पता लगाने की कोशिश कर रहा हूं कि इस प्रकार की स्थिति के लिए सर्वोत्तम अभ्यास क्या हैं।

धन्यवाद!

+3

क्या आप रेज़र अभिव्यक्तियों से विधियों को कॉल कर सकते हैं? क्योंकि यह वही है जो 'नंबर। टॉस्ट्रिंग (CultureInfo.InvariantCulture)' करना चाहिए (सही नेमस्पेस इत्यादि आयात करने के लिए मॉड्यूलो रेजर सिंटैक्स)। – millimoose

उत्तर

4

मैं का प्रयोग करेंगे @price.ToString(CultureInfo.InvariantCulture)

संपादित

मैं जोआओ जवाब से सहमत नहीं है और यह एक बुरा विचार ™ पर विचार करेंगे। मैं पहिया को फिर से आविष्कार करने की सिफारिश नहीं करता। यदि आप एक अधिक व्यापक दृष्टिकोण पसंद करेंगे, तो मैं एक समर्पित सी # जेएसओएन एन्कोडिंग लाइब्रेरी शामिल करने का विकल्प चुनूंगा (मैं JsonFx.NET की सिफारिश करता हूं)।

सबसे आसान तरीका, मैं एक HTMLHelper एक्सटेंशन बनाउंगा। की तरह कुछ:

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

तब के साथ एक दृश्य में इसका इस्तेमाल करते हैं:

@Html.ToJson(price) 

यह आदिम प्रकार के साथ ही जटिल प्रकारों को प्रबंधित करना चाहिए।

उसके बाद मैं शायद चीजों को दोबारा कर दूंगा और बेहतर इंजेक्शन पैटर्न के साथ आने की कोशिश करूंगा ताकि मैं प्रत्येक कॉल के साथ एक नया JsonWriter नहीं बना रहा।

लेकिन यह बहुत अधिक लचीला (और परीक्षण) एक स्थिर सहायक वर्ग के रूप में अपने स्वयं के serializer रोलिंग से हो जाएगा ...

+0

धन्यवाद! "CultureInfo.InvariantCulture" वह है जो मैं याद कर रहा था। यह वही है जो मैं चाहता था - एक संस्कृति-अज्ञेय जावास्क्रिप्ट-अनुकूल प्रारूपण सुविधा। – rocketmonkeys

3

जैसा कि पहले ही एक आसान समाधान के साथ ToString कॉल करने के लिए किया जाएगा एक और जवाब में कहा गया है InvariantCulture, हालांकि यह स्पष्ट रूप से आपके इरादे को व्यक्त नहीं करता है और लोगों को यह मानने के लिए प्रेरित कर सकता है कि InvariantCulture अन्य डेटा प्रकारों के लिए काम करता है।

अगर मैं तुम्हें थे मैं एक सहायक कक्षा में स्वरूपण तर्क लपेट हैं, निम्नलिखित की तरह कुछ और फोन सहायक तरीकों जहां जरूरत:

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

यह बनाए रखने के लिए और भी स्पष्ट रूप से अपने उद्देश्यों को जब व्यक्त आसान है आप इसे @JsLiteral.From(bignum) दृश्य में उपयोग करते हैं।