Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Currency validation support #4430

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ public enum ValidationType
/// </summary>
Decimal,

/// <summary>
/// Currency validation
/// </summary>
Currency,

Comment on lines +56 to +60
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be added at the end so not a breaking change.

/// <summary>
/// Text only validation
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@ private static void ValidateTextBox(TextBox textBox, bool force = true)
case ValidationType.Decimal:
regexMatch = textBox.Text.IsDecimal();
break;
case ValidationType.Currency:
// @"(^\d*\.\d{2}$)" regex pattern to detect currency sign with currency value
// Mathes: $100.00, $100, $10.25
// Non-Matches: 100., $10.233, $10.
regexMatch = Regex.IsMatch(textBox.Text, @"^\$( )*\d*(.\d{1,2})?$");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Until we can reference this new extension method, let's use the .NET Api directly so we can close this off :)

Suggested change
regexMatch = Regex.IsMatch(textBox.Text, @"^\$( )*\d*(.\d{1,2})?$");
// Parse the entered data into a decimal, allowing existing currency symbols. Uses current UI culture.
regexMatch = decimal.TryParse(value, NumberStyles.Currency, out _);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The TryParse method doesn't accept 3 parameters, there needs to be an IFormatProvider parameter as well.

I've written the code for this with CultureInfo.CurrentCulture as the IFormatProvider like you did in the PR for the new extension method (unless @olegL1337 is still planning on updating this PR)

My only question is, it this the best way to validate the currencies? with the IFormatProvider set to CultureInfo.CurrentCulture the validation will only pass for the user's local currency. Is there a way of including all currency cultures so that any currency will pass as valid?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Afaik, there isn't a CultureInfo that represents "all" cultures. However, we can get all available cultures and check against each one separately.

static decimal? TryParseCurrency(string str)
{
	foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
	{
		if (decimal.TryParse(str, NumberStyles.Currency, culture, out var amount))
				return amount;
	}

	return null;
}

See it in action: https://dotnetfiddle.net/HW8wZ4

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Got it!
So do you think it would be better to implement it like that? The trade off would be the efficiency, particularly when it needs to loop though all of the cultures at each keystroke of user input. Is that something you think we should be concerned about @Arlodotexe?

BTW I've submitted a PR here that closes this issue if @olegL1337 isn't planning on going further with this PR

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This feels this needs more options.

Perhaps we add a way to provide the current or a specific culture for ValidationType.Currency, and add an additional ValidationType.AnyCurrency if they'd like to check all cultures. @michael-hawker what do you think?

break;
case ValidationType.Email:
regexMatch = textBox.Text.IsEmail();
break;
Expand Down