我已使用此格式12.5PerRs
将值存储在字符串中。我想将此字符串分隔为12.5
。为此,我尝试了这段代码
string s4 = (dataGridView1.Rows[e.RowIndex].Cells["Rate"]).Value.ToString();
string numbers = "";
string alpha = "";
foreach (char c in s4)
{
if (Char.IsDigit(c))
{
numbers = numbers + c;
}
else if (Char.IsLetter(c))
{
alpha = alpha + c;
}
}
假设string s4="12.5RsPer
具有此值但是使用了我已实现的代码,我得到了125
,因为这不是预期的。
如何以理想的方式分割此值?
答案 0 :(得分:1)
点不是字母,这就是为什么返回false:Char.IsLetter('.')
。它是一个标点字符,是一个不同的类别。您需要Char.IsPunctuation('.')
。但是不同的文化使用不同的小数分隔符,所以这种方法不是很强大。
所以你可以使用这个方法:
public static decimal? ExtractNumberFromStart(string input, NumberFormatInfo nfi = null)
{
if (nfi == null) nfi = NumberFormatInfo.CurrentInfo;
char sep = nfi.NumberDecimalSeparator[0]; // no culture uses multiple characters as separator
var numberPart = input.TrimStart().TakeWhile(c => Char.IsDigit(c) || c == sep);
decimal dec;
if (decimal.TryParse(string.Concat(numberPart), NumberStyles.Number, nfi, out dec))
return dec;
else
return null;
}
您的样本:
string input = "12.5PerRs";
decimal? dec = ExtractNumberFromStart(input);
if (dec.HasValue)
{
string number = dec.ToString(); // 12.5
string alpha = input.Substring(number.Length); // PerRs
}
答案 1 :(得分:1)
你可以使用正则表达式,这个将匹配字符串上的每个numberDotNumber。
Regex regex = new Regex(@"([1-9])+(\.)+([1-9])");
Match match = regex.Match(s);
if (match.Success)
{
value = decimal.Parse(match.Value);
}
答案 2 :(得分:0)
也许这会有所帮助?
if (Char.IsDigit(c) || (c == ".") || (c == ","))
{
numbers += c;
}
答案 3 :(得分:0)
尝试这样。
string value = "125.5PerRs";
Decimal dValue = 0;
for (int i=0; i<value.Length;i++)
{
if (!Char.IsDigit(value[i]) && value[i] != '.')
{
dValue = Convert.ToDecimal(value.Substring(0,i));
break;
}
}
然后从字符串中取十进制值后面的值来获取alpha值。
string alpha = value.Substring(dValue.ToString().Length);