Разбор текста из замаскированного текстового поля
У меня есть приложение WinForms, написанное на C#
До недавнего времени в моих формах было много текстовых полей, в которых пользователь вводил финансовые суммы. Первоначально я не включал никакую форму маски, и всякий раз, когда мне нужно работать со значениями, введенными пользователями, я разбираю текст из каждого поля в десятичные значения с помощью Decimal.Parse;
Однако меня попросили сделать текстовые поля похожими на финансовые суммы, т. Е. 1050,75 фунтов стерлингов, а не 1050,75. Поэтому я начал менять текстовые поля на MaskedTextBox и выдавал им маску £#,##0,00. Однако теперь каждая попытка разобрать текст из MaskedTextBoxes выдает ошибку "Входная строка не в правильном формате".
Как получить входные данные пользователя из MaskedTextBox и проанализировать в десятичном формате для работы?
Должен ли я вообще использовать MaskedTextBox или есть другой способ показать форматирование финансового типа на форме, не затрагивая метод Decimal.Parse?
3 ответа
Когда вы получаете значение из Maskedtextbox, оно принимает значение как £#,##0,00 . поэтому символ не будет преобразован в десятичную. Попробуйте удалить символ и преобразовать значение в десятичное. лайк
string val= maskedTextBox1.Text.Replace("£","");
Decimal.Parse(val);
Вы можете использовать параметр формата с AllowCurrencySymbol. Он должен соответствовать символу валюты культуры. Этот код я конвертировал из VB, поэтому я надеюсь, что он правильный.
Application.CurrentCulture = New Globalization.CultureInfo("en-GB");
Decimal.Parse("£12,345.67", Globalization.NumberStyles.AllowThousands | Globalization.NumberStyles.AllowDecimalPoint | Globalization.NumberStyles.AllowCurrencySymbol);
Также, посмотрите этот вопрос, если вы не хотите менять культуру: Проблема с анализом текста валюты в десятичный тип
Ты можешь проверить MaskFull
чтобы увидеть, правильно ли введен текст, а затем применить антимаску (удалив то, что добавляет ваша маска).
К сожалению, я не знаю об автоматическом разоблачении. Но вы можете сделать что-то вроде:
if(maskedTextBox1.Mask)
{
var enteredText = maskedTextBox1.SubString(1).Replace(",", null); // remove pound symbol and commas
// ... parse as with normal TextBox
}