c# – 验证货币文本框
我正在使用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,00# – 错误 解决方法
一个数字(在这种情况下为十进制)与其字符串表示(在这种情况下为货币)不同.这就是为什么你必须首先从字符串的角度分析输入(是否符合格式?),然后从数字的角度分析.有一些方法可以一次执行分析(如其他答案中所提出的),尽管它们没有提供您之后的确定(即它是一种货币或不是;被理解为仅仅是数字是错误的).
示例代码: 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有望保持你想要的格式(甚至可能) —- UPDATE(占千位分隔符的十进制解析问题) 在确认提出的Decimal.TryParse(和其他等效方法)在涉及数千个分隔符(组分隔符)之后不能提供预期时,我决定编写下面的代码来处理这种问题. private void btn_Click(object sender,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,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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |