我有一个像这样的字符串
12,3 m
我需要2个子字符串,一个十进制值和一个单位,如12,3
和m
12.3
将返回12.3
和m
123,4 c
将返回123,4
和c
小数分隔符可以是。或者,
那么我怎样才能在C#中获得它而不必遍历下面的每个字符
char c;
for (int i = 0; i < Word.Length; i++)
{
c = Word[i];
if (Char.IsDigit(c))
string1 += c;
else
string2 += c;
}
字符串输入实际上不需要像这样格式化它可以像A12,3 m或ABC3.45或4.5 DEF等。所以字符串拆分总是不稳定
答案 0 :(得分:4)
看起来你正试图根据空白字符进行拆分:
input = "12.3 c";
string[] stringArray = string.Split(input, ' ');
然后,您可以对数组的第一个元素执行float.Parse
操作。 float.Parse
使用的小数分隔符取决于您的文化,如果选择了错误的分隔符,则可以获得FormatException
。
您还可以通过以下方式以编程方式选择小数点分隔符:
culture.NumberFormat.NumberDecimalSeparator = "."; // or ","
答案 1 :(得分:0)
检查您提供的示例{ "12,3 m", "A12,3 m", "ABC3.45", "4.5 DEF"}
,似乎字符串位置不仅可以更改,而且输入字符串中可以有2个字符串和1个小数。
此解决方案将向您展示如何仅使用一个正则表达式而不是手动字符串拆分来提取这些数据。我将合并来自user1666620的CultureInfo:
string[] inputStrings = new string[] { "12,3 m", "A12,3 m", "ABC3.45", "4.5 DEF"};
Regex splitterRx = new Regex("([a-zA-Z]*)\\s*([\\d\\.,]+)\\s*([a-zA-Z]*)");
List<Tuple<string, decimal, string>> results = new List<Tuple<string, decimal, string>>();
foreach (var str in inputStrings)
{
var splitterM = splitterRx.Match(str);
if (splitterM.Success)
{
results.Add(new Tuple<string, decimal, string>(
splitterM.Groups[1].Value,
decimal.Parse(
splitterM.Groups[2].Value.Replace(".", System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator).Replace(
",", System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator)
),
splitterM.Groups[3].Value
));
}
}
这将在前/后位置找到当前/不存在字符串的所有可能组合,因此请务必检查单个字符串或对它们应用任何组合logik。
此外,它不仅检查十进制和字符串之间是否存在单个空格,还检查是否存在任意数量的空格。如果您想将其限制为仅限0或1空格,请将Regex替换为:
Regex splitterRx = new Regex("([a-zA-Z]*)[ ]{0,1}([\\d\\.,]+)[ ]{0,1}([a-zA-Z]*)");