validar texto solo regulares numeros letras expresiones especiales con como caracteres cajas acepte c# .net winforms validation textbox

texto - validar textbox con expresiones regulares c#



Validar cuadro de texto de moneda (4)

Para verificar el formato, puede intentar analizarlo en float de esa manera:

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

Estoy usando WinForm. Tengo un cuadro de texto y un botón.

Objetivo: el botón debe validar si el cuadro de texto es un formato de moneda. Si el cuadro de texto es un formato de moneda, un mensaje debe mostrar el formato de moneda. De lo contrario, un mensaje debería mostrar el formato erróneo de error.

Ejemplo de formato de moneda:

$ 1,234.00

$ 12,345.00

$ 123,000.00

$ 1.00

Actualizar:

Esto es lo que tenía, pero esto está mal.

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

Casos de prueba:

$ 12.00 - OK

$ 12,000 - OK

$ 12,3,00 - OK - (Inválido)

$ 12,3,00 # - Incorrecto


Prueba esto, debería ser trabajo

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

Información de depuración:

Salida:


Puedes intentar usar expresiones regulares:

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


Un número ( decimal en este caso) no es lo mismo que su representación de cadena (como una moneda en este caso). Es por eso que primero tiene que analizar la entrada desde el punto de vista de una cadena de caracteres (¿se cumple el formato?) Y luego desde una numérica. Hay algunas maneras de realizar el análisis de una vez (como se propone en otras respuestas), aunque no entregan la determinación que está buscando (es decir, es una moneda o no, entendida como meros números son incorrectos).

Código de muestra:

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

Tenga en cuenta un par de cosas:

  • Se espera que curCulture tenga el formato que desee (incluso podría tener en cuenta diferentes culturas / monedas / formatos). Según su ejemplo, parece que desea: CultureInfo curCulture = new CultureInfo("en-US", true); .
  • El análisis de la cadena de entrada puede ser tan complejo como sea necesario. Por ejemplo: en el código publicado, también me estoy asegurando de que el símbolo de moneda esté ubicado en la primera posición.

---- ACTUALIZAR (teniendo en cuenta los problemas de análisis decimal con separadores de miles)

Después de haber confirmado que el Decimal.TryParse propuesto (y otros enfoques equivalentes) no ofrece lo que se espera cuando se usan separadores de miles (separadores de grupo), decidí escribir el código a continuación que soluciona este tipo de problemas. En cualquier caso, tenga en cuenta que no tengo demasiada experiencia en estas situaciones (es decir, tratar con datos decimales incorrectos que representan miles de separadores) y es por eso que no estoy seguro de si hay formas más eficientes de enfrentar este problema (aunque el análisis propuesto es ciertamente rápido).

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