2015-09-20 4 views
10

मान्य करें मैं WinForm का उपयोग कर रहा हूं। मेरे पास एक टेक्स्टबॉक्स और एक बटन है।मुद्रा टेक्स्टबॉक्स

लक्ष्य: यदि टेक्स्टबॉक्स एक मुद्रा प्रारूप है तो बटन को सत्यापित करना चाहिए। यदि टेक्स्टबॉक्स एक मुद्रा प्रारूप है, तो एक संदेश मुद्रा प्रारूप प्रदर्शित करना चाहिए। यदि नहीं तो एक संदेश त्रुटि गलत प्रारूप प्रदर्शित करना चाहिए। मुद्रा स्वरूप का

उदाहरण:

$ 1,234.00

$ 12,345.00

$ 123,000.00

$ 1,00

अद्यतन:

यह मैं क्या था है, लेकिन यह गलत है।

Private void button3_Click(object sender, EventArgs e) 
    {  
     currencyTextbox = Convert.ToString(textBox4.Text); 

     string money = currencyTextbox; 

     string s = currencyTextbox; 
     float f; 
     if (float.TryParse(s, NumberStyles.AllowCurrencySymbol 
      | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, 
      CultureInfo.GetCultureInfo("en-US"), out f)) 
     { 
      MessageBox.Show("Ok"); 
     } 
     else 
     { 
      MessageBox.Show("Wrong"); 
     } 
    } 

टेस्ट मामलों:

$ 12,00 - ठीक है

$ 12.000 - ठीक है

$ 12,3,00 - ठीक है - (अमान्य)

$ 12,3,00 # - गलत

उत्तर

4

एक नंबर (इस मामले में decimal) नहीं है इसकी स्ट्रिंग प्रस्तुति के समान (इस मामले में एक मुद्रा के रूप में)। यही कारण है कि आपको पहले स्ट्रिंग पॉइंट के इनपुट से इनपुट का विश्लेषण करना होगा (प्रारूप क्या मिलेगा?) और उसके बाद एक संख्यात्मक से। एक बार में विश्लेषण करने के कुछ तरीके हैं (जैसा कि अन्य उत्तरों में प्रस्तावित है), हालांकि वे आपके द्वारा निर्धारित दृढ़ संकल्प नहीं देते हैं (यानी, यह एक मुद्रा है या नहीं; समझा जाता है कि केवल संख्या गलत हैं)।

नमूना कोड:

private void btn_Click(object sender, EventArgs e) 
{ 
    //Note: ideally, curCulture shouldn't be defined here (but globally or 
    //passed as argument), but otherwise my code would be somehow incomplete. 
    CultureInfo curCulture = new CultureInfo("en-US", true); 

    bool isOK = false; 
    string[] temp = totalTextBox.Text.Trim().Split(new string[] { curCulture.NumberFormat.CurrencySymbol }, StringSplitOptions.None); 
    if (temp.Length == 2 && temp[0].Trim().Length == 0) 
    { 
     decimal outVal = 0m; 
     if (decimal.TryParse(temp[1], out outVal)) isOK = true; 
    } 

    MessageBox.Show(isOK ? "currency format" : "error wrong format"); 

} 

नोट चीजों की एक जोड़ी:

  • curCulture प्रारूप आप चाहते हैं पकड़ करने के लिए आशा की जाती है (आप हो सकता है विभिन्न संस्कृतियों/मुद्राओं/प्रारूपों के लिए भी खाता)। आपके उदाहरण से, ऐसा लगता है कि आप चाहते हैं: CultureInfo curCulture = new CultureInfo("en-US", true);
  • इनपुट स्ट्रिंग का विश्लेषण आवश्यकतानुसार जटिल हो सकता है। उदाहरण के लिए: पोस्ट कोड में, मैं यह भी सुनिश्चित कर रहा हूं कि मुद्रा चिह्न पहली स्थिति में स्थित है।

---- अद्यतन

(हजारों विभाजक के साथ दशमलव पार्स समस्याओं के लिए लेखांकन) की पुष्टि होने कि प्रस्तावित Decimal.TryParse (और अन्य समकक्ष दृष्टिकोण) के बाद वितरित नहीं करता है क्या उम्मीद है जब हजारों विभाजक (समूह विभाजक) शामिल हैं, मैंने नीचे दिए गए कोड को लिखने का फैसला किया है जो इस तरह के मुद्दों का ख्याल रखता है। किसी भी मामले में, ध्यान रखें कि मैं इन परिस्थितियों में बहुत अनुभवी नहीं हूं (यानी, हजारों विभाजकों के लिए गलत दशमलव इनपुट लेखांकन से निपटना) और इसलिए मुझे यकीन नहीं है कि इस समस्या का सामना करने के अधिक कुशल तरीके हैं (हालांकि प्रस्तावित विश्लेषण निश्चित रूप से त्वरित है)।

private void btn_Click(object sender, EventArgs e) 
{ 
    //Note: ideally, curCulture shouldn't be defined here (but globally or 
    //passed as argument), but otherwise my code would be somehow incomplete. 
    CultureInfo curCulture = new CultureInfo("en-US", true); 

    bool isOK = false; 
    string[] temp = totalTextBox.Text.Trim().Split(new string[] { curCulture.NumberFormat.CurrencySymbol }, StringSplitOptions.None); 
    if (temp.Length == 2 && temp[0].Trim().Length == 0) 
    { 
     isOK = isDecimalOK(temp[1], curCulture); 
    } 

    MessageBox.Show(isOK ? "currency format" : "error wrong format"); 
} 

private bool isDecimalOK(string inputString, CultureInfo curCulture) 
{ 
    bool isOK = false; 

    string[] temp = inputString.Split(new string[] { curCulture.NumberFormat.CurrencyDecimalSeparator }, StringSplitOptions.None); 
    if (temp.Length > 2) return isOK; 

    int outVal0 = 0; 
    if (!int.TryParse(temp[0], NumberStyles.AllowThousands, curCulture, out outVal0)) return isOK; 
    else if (analyseThousands(temp[0], curCulture)) 
    { 
     isOK = (temp.Length == 2 ? int.TryParse(temp[1], NumberStyles.Integer, curCulture, out outVal0) : true); 
    } 

    return isOK; 
} 

private bool analyseThousands(string intInput, CultureInfo curCulture) 
{ 

    string[] temp2 = intInput.Split(new string[] { curCulture.NumberFormat.CurrencyGroupSeparator }, StringSplitOptions.None); 

    if (temp2.Length >= 2) 
    { 
     if (temp2[0].Trim().Length == 0) return false; 
     else 
     { 
      for (int i2 = 1; i2 < temp2.Length; i2++) 
      { 
       if (!curCulture.NumberFormat.CurrencyGroupSizes.Contains(temp2[i2].Length)) return false; 
      } 
     } 
    } 

    return true; 
} 
+0

व्याख्या करने के लिए हाय धन्यवाद। यह कोड मुझे एक लाल त्रुटि लाइन देता है {curCulture। मैं इसे वैध कैसे बना सकता हूं। –

+0

@LearningToCode मैं इसे कोड के नीचे अपनी टिप्पणियों में समझा रहा हूं: इसे अपनी इच्छानुसार परिभाषित करें। मुझे लगता है कि 'curCulture = new CultureInfo ("en-US");' देख रहे हैं। बूल के ऊपर इस पंक्ति को लिखें ओके = झूठा है; सिर्फ मेरे मामले को तुरंत संपादित करें। – varocarbas

+0

शायद मैंने इसे गलत लिखा है। इस तरह मैंने इसे लिखा है :: {curCulture = new Cultur eInfo ("en-US")। NumberFormat.CurrencySymbol}, StringSplitOptions.None); –

3

प्रारूप की जांच करने के लिए आप इसे फ्लोट में पार्स करने की कोशिश कर सकते हैं:

 string s = "$123.78"; 
     float f; 
     if (float.TryParse(s, NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out f)) 
     { 
      // OK 
     } 
     else 
     { 
      // WRONG 
     } 
+0

मैं इस परीक्षण किया गया। यह मुझे एक त्रुटि देता है। यह कोड $ 12,3,00 स्वीकार करता है जो सत्य नहीं है। –

+0

कृपया TryParse विधि के दूसरे पैरामीटर को देखें, मैंने "कोई भी" इस्तेमाल किया, लेकिन यह ऐसी असामान्य संख्याओं को अनुमति देगा। वहाँ नंबरस्टाइल रखें। AllowCurrencySymbol | किसी के बजाय NumberStyles.AllowDecimalPoint और परिणाम – Spawn

+0

पर नज़र डालें कोड लगभग काम करता है। ये परीक्षण मामलों रहे हैं $ 11-सही $ 11.00-सही $ 11,000.00-गलत $ 11,000-गलत $ 11,00-गलत –

1

इस प्रयास करें, यह काम होना चाहिए

string money = "$12,345.00"; 
float f; 
if (float.TryParse(money, NumberStyles.Currency, CultureInfo.GetCultureInfo("en-US"), out f)) 
{ 
    // valid 
} 
else 
{ 
    // invalid 
} 

डिबग जानकारी: enter image description here

आउटपुट:

enter image description here

+0

वोट क्यों दें? :( –

+0

मुझे लगता है कि किसी ने इसे वोट दिया क्योंकि यह किसी अन्य उत्तर के समान था। मैंने इस कोड का परीक्षण किया और यह अमान्य है। यह कोड स्वीकार करता है: 22,2.3 @ एक्स-टेक –

+0

मैंने इसे अपनी मशीन पर भी जांच लिया है, यह 100 काम कर रहा है % सही –

4

आप रेगुलर एक्सप्रेशन का उपयोग करने की कोशिश कर सकते हैं:

var moneyR = new Regex(@"^\$(((\d{1,3},)+\d{3})|\d+)(\.\d{2}){0,1}$"); 
if (moneyR.IsMatch(yourValue)) 
{ 
    MessageBox.Show("Ok"); 
} 
else 
{ 
    MessageBox.Show("Wrong"); 
} 
संबंधित मुद्दे