C# 验证货币文本框

C# 验证货币文本框,c#,.net,winforms,validation,textbox,C#,.net,Winforms,Validation,Textbox,我正在使用WinForm。我有一个文本框和一个按钮 目标:按钮应验证文本框是否为货币格式。如果文本框是货币格式,则消息应显示货币格式。如果不是,则消息应显示错误格式 货币格式示例: 1234.00美元 12345.00美元 123000.00美元 一美元 更新: 这是我所拥有的,但这是错误的 Private void button3_Click(object sender, EventArgs e) { currencyTextbox = Convert.

我正在使用WinForm。我有一个文本框和一个按钮

目标:按钮应验证文本框是否为货币格式。如果文本框是货币格式,则消息应显示货币格式。如果不是,则消息应显示错误格式

货币格式示例:

1234.00美元

12345.00美元

123000.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美元-好的

12000美元-好的

$12,3,00-正常-(无效)


$12,3,00#-错误

要检查格式,您可以尝试在float中解析它,如下所示:

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

试试这个,应该有用

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

输出:

数字(
在本例中为十进制)与其字符串表示形式(在本例中为货币)不同。这就是为什么您必须首先从字符串的角度分析输入(是否符合格式?),然后从数字角度分析输入。有一些方法可以一次完成分析(如其他答案中所建议的),尽管它们不能提供您想要的决定(即,它是否是一种货币;理解为仅仅是数字是错误的)

示例代码:

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=newcultureinfo(“en-US”,true)
  • 输入字符串的分析可以根据需要进行复杂化。例如:在发布的代码中,我还确保货币符号位于第一个位置
----更新(使用数千个分隔符解释十进制解析问题)

在确认建议的
Decimal.TryParse
(以及其他等效方法)在涉及数千个分隔符(组分隔符)时无法实现预期效果后,我决定在下面编写代码来解决此类问题。 在任何情况下,请记住,我在这些情况下都不是很有经验(即,处理错误的十进制输入,占用数千个分隔符),这就是为什么我不确定是否有更有效的方法来解决这个问题(尽管建议的分析肯定很快)

private void btn\u单击(对象发送者,事件参数e)
{
//注:理想情况下,此处不应定义curCulture(而是全局或全局)
//作为参数传递),但否则我的代码将不完整。
CultureInfo curCulture=新的CultureInfo(“en-US”,true);
bool-isOK=false;
string[]temp=totalTextBox.Text.Trim().Split(新字符串[]{curCulture.NumberFormat.currencycomsymbol},StringSplitOptions.None);
如果(temp.Length==2&&temp[0].Trim().Length==0)
{
isOK=isDecimalOK(温度[1],电流培养);
}
MessageBox.Show(isOK?“货币格式”:“错误格式”);
}
私有bool isDecimalOK(字符串输入字符串、文化信息curCulture)
{
bool-isOK=false;
string[]temp=inputString.Split(新字符串[]{curCulture.NumberFormat.currencydecialseparator},StringSplitOptions.None);
如果(温度长度>2)返回isOK;
int-outVal0=0;
如果(!int.TryParse(temp[0],NumberStyles.AllowThousands,curCulture,out outVal0))返回isOK;
else if(分析小时数(温度[0],电流培养))
{
isOK=(temp.Length==2?int.TryParse(temp[1],NumberStyles.Integer,curCulture,out outVal0):true);
}
返回isOK;
}
私有布尔分析小时数(字符串输入,CultureInfo curCulture)
{
字符串[]temp2=intInput.Split(新字符串[]{curCulture.NumberFormat.CurrencyGroupSeparator},StringSplitOptions.None);
如果(temp2.Length>=2)
{
if(temp2[0].Trim().Length==0)返回false;
其他的
{
for(int i2=1;i2
您可以尝试使用正则表达式:

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");
}

我测试了这个。这给了我一个错误。此代码接受$12,3,00,这是不正确的。请查看TryParse方法的第二个参数,我使用了“Any”,但它将允许此类异常数字。将NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint放在那里,而不是放在任何位置,然后查看结果代码似乎几乎可以工作。这些是测试用例$11正确$11.00正确$11000.00错误$11000错误$11,00-Wrong@LearningToCode添加一个
NumberStyles.AllowThousands
并查看一下我添加的@RubensFarias
NumberStyles.AllowThousands
。代码仍然不正确。测试用例:(123,0,1-正确)(123,0,1.00-正确)(123,0,1.00-错误)(1234-正确)我认为有人否决了它,因为它与另一个答案相似。我测试了这个代码,它是无效的。这段代码接受:22,2.3@X-tech我也在我的机器上检查了它,它工作100%正确。它可能也被否决了,因为它是一个简单的代码片段转储,没有解释或其他任何东西。OP很可能从你的答案中学到很少/什么都没有。嗨,谢谢你的解释。这段代码在{curCulture]下给了我一条红色的错误线。我如何使它有效。@LearningToCode我在代码下面的注释中解释了它:根据您的意愿定义它。我猜
curCulture=new CultureInfo(“en-US”);
就是你要找的。在bool isOK=false上面写这行,我会马上编辑我的答案,以防万一。也许我写错了。我就是这样写的:{curCulture=new CultureInfo(“en-US”).NumberFormat.CurrencySymbol},StringSplitOptions.None);@LearningToCode看看我更新的答案(也请阅读我写的评论)。由于解析非常具体,请尝试使用
CultureInfo(string,bool)
构造函数。我是那种会更改这些设置的人
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");
}