एक नंबर (इस मामले में 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;
}
व्याख्या करने के लिए हाय धन्यवाद। यह कोड मुझे एक लाल त्रुटि लाइन देता है {curCulture। मैं इसे वैध कैसे बना सकता हूं। –
@LearningToCode मैं इसे कोड के नीचे अपनी टिप्पणियों में समझा रहा हूं: इसे अपनी इच्छानुसार परिभाषित करें। मुझे लगता है कि 'curCulture = new CultureInfo ("en-US");' देख रहे हैं। बूल के ऊपर इस पंक्ति को लिखें ओके = झूठा है; सिर्फ मेरे मामले को तुरंत संपादित करें। – varocarbas
शायद मैंने इसे गलत लिखा है। इस तरह मैंने इसे लिखा है :: {curCulture = new Cultur eInfo ("en-US")। NumberFormat.CurrencySymbol}, StringSplitOptions.None); –