我正在使用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有望保持你想要的格式(甚至可能)
帐户不同的文化/货币/格式).从你的例子来看,似乎是你
想要:CultureInfo curCulture = new CultureInfo(“en-US”,true);.
>输入字符串的分析可以根据需要复杂.例如:在已发布的代码中,我还确保货币符号位于第一个位置.
—- 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; }