Ответ 1
Число (decimal
в этом случае) не совпадает с его строковым представлением (в данном случае валютой). Поэтому вы должны сначала проанализировать ввод с строковой точки зрения (соответствует ли формат?), А затем из числового. Есть несколько способов выполнить анализ за один раз (как предложено в других ответах), хотя они не доставляют вам определения (т.е. Это валюта или нет, понимаются как простые числа).
Пример кода:
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, 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;
}