c# – 验证货币文本框

前端之家收集整理的这篇文章主要介绍了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有望保持你想要的格式(甚至可能)
帐户不同的文化/货币/格式).从你的例子来看,似乎是你
想要: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;
}

猜你在找的C#相关文章