शैली / टेम्पलेट का उपयोग करके wpf में दशमलव स्थानों की संख्या कैसे प्रारूपित करें?


94

मैं एक WPF प्रोग्राम लिख रहा हूं और मैं एक पाठ बॉक्स में डेटा को प्रारूपित करने के लिए एक शैली या टेम्पलेट जैसी कुछ दोहराने योग्य विधि के माध्यम से पता लगाने की कोशिश कर रहा हूं। मेरे पास बहुत सारे TextBoxes हैं (95 सटीक होने के लिए) और हर एक अपने स्वयं के संख्यात्मक डेटा के लिए बाध्य है, जिनमें से प्रत्येक का अपना संकल्प निर्धारित हो सकता है। उदाहरण के लिए यदि डेटा 2 के रिज़ॉल्यूशन के साथ 99.123 है तो उसे 99.12 प्रदर्शित करना चाहिए। इसी तरह 99 और रिज़ॉल्यूशन 3 के डेटा मूल्य को 99.000 (99 नहीं) के रूप में प्रदर्शित किया जाना चाहिए। क्या इसे करने का कोई तरीका है?

संपादित करें: मुझे स्पष्ट करना चाहिए, मैं जिस स्क्रीन पर काम कर रहा हूं, उस पर 95 टेक्स्टबॉक्स हैं, लेकिन मैं चाहता हूं कि मेरे प्रोग्राम की विभिन्न स्क्रीन पर हर टेक्स्टबॉक्स दशमलव स्थानों की सही संख्या प्रदर्शित करे। अब जब मैं इसके बारे में सोचता हूं, तो इनमें से कुछ TextBoxes हैं (जैसे स्क्रीन पर मैं अभी काम कर रहा हूं) और कुछ DataGrids या ListViews हैं, लेकिन अगर मैं यह पता लगा सकता हूं कि इसे कैसे टेक्स्टबॉक्स के लिए काम करना है तो मुझे यकीन है कि मैं समझ सकता हूं यह अन्य नियंत्रणों के लिए भी है।

इस मामले में साझा करने के लिए बहुत अधिक कोड नहीं है, लेकिन मैं इसे स्पष्ट करने का प्रयास करूंगा:

मेरे पास एक दृश्य मॉडल है जिसमें निम्नलिखित गुण हैं (vb.net):

    Public ReadOnly Property Resolution As Integer
        Get
            Return _signal.DisplayResolution
        End Get
    End Property

    Public ReadOnly Property Value As Single
        Get
            Return Math.Round(_signal.DisplayValue, Resolution)
        End Get
    End Property

और मेरे पास XAML में:

<UserControl.Resources>
    <vm:SignalViewModel x:Key="Signal" SignalPath="SomeSignal"/>
</UserControl.Resources>
<TextBox Grid.Column="3" IsEnabled="False" Text="{Binding Path=Value, Source={StaticResource Signal}, Mode=OneWay}" />

EDIT2 (मेरा समाधान): यह पता चला है कि थोड़ी देर के लिए कंप्यूटर से दूर जाने के बाद, मैं एक सरल उत्तर खोजने के लिए वापस आया जो मुझे चेहरे पर घूर रहा था। दृश्य मॉडल में डेटा को प्रारूपित करें!

    Public ReadOnly Property Value As String
        Get
            Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
        End Get
    End Property

1
का उपयोग करें IValueConverter? वास्तविक मूल्य और कनवर्टर को रिज़ॉल्यूशन पास करें और इसे अपने भीतर अपने लिए गोल करने दें। यह StringFormatजानना मुश्किल है कि वास्तव में ये 95 कैसे TextBoxउत्पन्न होते हैं।
विव

वर्तमान कोड और XAML पोस्ट करें। अन्यथा यह सभी अटकलें और अनपेक्षित अनुमान है।
फेडेरिको बेरासैटुई

मैंने इस प्रश्न के बारे में कुछ और जानकारी जोड़ी, जो कि इसे स्पष्ट रूप से स्पष्ट करना चाहिए।
AXG1010

जवाबों:


196

आप StringFormatपर का उपयोग करना चाहिए Binding। आप या तो मानक स्ट्रिंग प्रारूप या कस्टम स्ट्रिंग प्रारूप का उपयोग कर सकते हैं :

<TextBox Text="{Binding Value, StringFormat=N2}" />
<TextBox Text="{Binding Value, StringFormat={}{0:#,#.00}}" />

ध्यान दें कि StringFormatकेवल तभी काम करता है जब लक्ष्य संपत्ति टाइप स्ट्रिंग की हो। यदि आप एक Contentसंपत्ति ( typeof(object)) की तरह कुछ सेट करने की कोशिश कर रहे हैं , तो आपको एक कस्टम StringFormatConverter( जैसे यहां ) का उपयोग करना होगा , और अपने प्रारूप स्ट्रिंग को पास करना होगा ConverterParameter

अद्यतन प्रश्न के लिए संपादित करें

इसलिए, यदि आपकी ViewModelसटीकता को परिभाषित करता है , तो मैं इसे एक MultiBindingबनाने और अपना खुद का बनाने की सलाह दूंगा IMultiValueConverter। अभ्यास में यह बहुत कष्टप्रद है, एक साधारण बंधन से एक तक जाने के लिए जिसे विस्तार करने की आवश्यकता है MultiBinding, लेकिन यदि सटीक संकलन समय पर नहीं जाना जाता है, तो यह बहुत अधिक है जो आप कर सकते हैं। आपको IMultiValueConverterमूल्य लेने की आवश्यकता होगी, और सटीक, और स्वरूपित स्ट्रिंग का उत्पादन करना होगा। आप इसका उपयोग कर पाएंगे String.Format

हालांकि, जैसी चीजों के लिए ContentControl, आप बहुत आसानी से ऐसा कर सकते हैं Style:

<Style TargetType="{x:Type ContentControl}">
    <Setter Property="ContentStringFormat" 
            Value="{Binding Resolution, StringFormat=N{0}}" />
</Style>

किसी भी नियंत्रण को उजागर करता है ContentStringFormatजो इस तरह से इस्तेमाल किया जा सकता है। दुर्भाग्य से, TextBoxऐसा कुछ नहीं है।


6
StringFormat के साथ उदाहरण #,#.00संकलित नहीं करता है - अल्पविराम को Bindingमार्कअप एक्सटेंशन में विशेषताओं के परिसीमन के रूप में व्याख्या किया गया है ।
गीगी

@ गीगी, आप सही कह रहे हैं, लेकिन आप इसे आसानी से उपयोग कर सकते हैं जैसे StringFormat={}{0:#,#.00}:। मैं सही तरीके से काम करने के जवाब को अपडेट करूंगा।
अबे हेइडेब्रेट

'StringFormat = N {0}' बढ़िया काम करता है। 2 की सटीकता के लिए, मैं '10 .00 'को छोड़कर दो दशमलव दिखाऊंगा, जिस स्थिति में मैं' 10 'प्रदर्शित करना चाहता हूं। क्या सटीक करने के लिए बाध्य होने पर ऐसा करने का कोई तरीका है? लगता है जैसे मुझे एक कनवर्टर का उपयोग करना होगा।
गॉर्डन सिल्सज़

मुझे नहीं लगता कि .NET स्ट्रिंग प्रारूपों का उपयोग करके प्रस्तुत दशमलव को बदलने का एक तरीका है, इसलिए आप शायद कनवर्टर लिखना बेहतर समझते हैं।
अबे हीदेबेब्रत

क्या आप बता सकते हैं कि दो विनिर्देशक 0: #, # 00 का उपयोग क्यों करें, क्या उनमें से केवल एक ही पर्याप्त नहीं होगा?
लेई यांग

7

स्वीकृत उत्तर 0.299 जैसे इनपुट देने पर पूर्णांक जगह में 0 नहीं दिखाता है। यह WPF UI में .3 दिखाता है। तो निम्नलिखित स्ट्रिंग प्रारूप का उपयोग करने का मेरा सुझाव

<TextBox Text="{Binding Value,  StringFormat={}{0:#,0.0}}" 

नमस्ते, आपका समाधान ठीक है, लेकिन मैं कीवर्ड N1 (2,3 ...) का उपयोग करना पसंद करूंगा क्योंकि यह टाइपो गलतियों से बचता है और कम से कम आपको यकीन है कि यह कैसे प्रदर्शित किया जाएगा। लेकिन वास्तव में दूसरा सुझाव 0 नहीं दिखाता है यदि मूल्य <0 जैसा आप उल्लेख करते हैं।
केविन वीडीएफ

-2
    void NumericTextBoxInput(object sender, TextCompositionEventArgs e)
    {
        TextBox txt = (TextBox)sender;
        var regex = new Regex(@"^[0-9]*(?:\.[0-9]{0,1})?$");
        string str = txt.Text + e.Text.ToString();
        int cntPrc = 0;
        if (str.Contains('.'))
        {
            string[] tokens = str.Split('.');
            if (tokens.Count() > 0)
            {
                string result = tokens[1];
                char[] prc = result.ToCharArray();
                cntPrc = prc.Count();
            }
        }
        if (regex.IsMatch(e.Text) && !(e.Text == "." && ((TextBox)sender).Text.Contains(e.Text)) && (cntPrc < 3))
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }

9
कुछ स्पष्टीकरण आपके उत्तर की गुणवत्ता में काफी सुधार करेंगे।
mrun
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.