有一种简单的方法可以将混合(文本和数字)字符串中的所有数字乘以一个因子吗?
我有一个SVG路径,例如:d = "M 0,20 40,20 40,80 0,80 z"
该字符串包含数字对,由,
分隔。每个数字也可以是双精度值。数字对代表x,y坐标。
如何将该字符串中的所有数字对乘以例如2?
答案 0 :(得分:1)
假设我们有这样的字符串。
var d = "M 0,20 40,20 40,80 0,80 z";
我们希望将所有数字乘以2.我们使用Regex.Replace
函数的重载,该函数接受一个字符串,一个将在已找到的每个匹配上应用的函数,并将该匹配替换为该值由此函数返回。
在函数中我们尝试使用我们的模式将匹配的字符串解析为字符串,如果成功则将它加倍并返回,如果失败则返回原始匹配的字符串。
d = Regex.Replace(d, "([0-9]{0,})", (m) =>
{
int i;
if (int.TryParse(m.Value, out i))
{
return (2*i).ToString();
}
return m.Value;
}, RegexOptions.None);
Console.WriteLine(d);
答案 1 :(得分:1)
对于我自己的娱乐,这是一个答案。
var d = "M 0,20 40,20 40,80 0,80 z";
var split = d.Split(' ');
string result = string.Empty;
foreach (var element in split)
{
if (element.Contains(","))
{
var couple = element.Split(',');
int val1, val2;
bool isNum = int.TryParse(couple[0], out val1);
isNum &= int.TryParse(couple[1], out val2);
if (isNum) // could be removed and simplified if there are never "," between something else than two numbers
{
result += " " + (val1 * 2).ToString() + "," + (val2 * 2).ToString();
}
else
{
result += " " + element;
}
}
else
{
result += " " + element;
}
}
result = result.Trim();
Console.WriteLine(result);
简化版本(没有类型检查,如果除了逗号周围的数字之外还有其他内容,则会抛出异常):
var d = "M 0,20 40,20 40,80 0,80 z";
var split = d.Split(' ');
string result = string.Empty;
foreach (var element in split)
{
if (element.Contains(","))
{
var couple = element.Split(',');
int val1 = int.Parse(couple[0]);
int val2 = int.Parse(couple[1]);
result += " " + (val1 * 2).ToString() + "," + (val2 * 2).ToString();
}
else
{
result += " " + element;
}
}
result = result.Trim();
Console.WriteLine(result);
答案 2 :(得分:0)
尝试这样的事情
List<double> myList = Regex.Replace("M 0,20 40,20 40,80 0,80 z", @"[^\d\, ]", "").Trim().Split(new char[] { ' ' }).ToList<String>().ConvertAll(item => double.Parse(item)*2);
返回一个字符串只需使用
String Str= String.Join(" ", (Regex.Replace("M 0,20 40,20 40,80 0,80 z", @"[^\d\, ]", "").Trim().Split(new char[] { ' ' }).ToList<String>().ConvertAll(item => (double.Parse(item)*2).ToString()).ToArray()));
答案 3 :(得分:0)
为了好玩,我用linq做了一个通用函数:
public string MultiplyNumbersInString(string text, int multiplier)
{
double n;
return string.Join(" ",
(from t in text.Split(' ')
select (double.TryParse(t, out n)
? (double.Parse(t) * multiplier).ToString("F")
: t))
.ToList());
}
}
您可以提供您想要更改的字符串和乘数,它会相应地更改您的字符串。你可以这样称呼它
string originalText = "M 0,20 40,20 40,80 0,80 z";
string newText = MultiplyNumbersInString(originalText, 2);
修改强>
@CPA阅读完您的评论并拒绝编辑我的答案后,这里有两个功能可以满足您的需求。
使用lamdas的第一个是你在拒绝编辑中写的那个:
public string MultiplyNumbersInString(string text, int multiplier)
{
return string.Join(" ", text.Split(' ')
.Select(t1 => (t1.Contains(','))
? (string.Join(",", t1.Split(',')
.Select(t2 => (double.Parse(t2) * multiplier).ToString())))
: t1));
}
这是我没有lamdas的功能
public string MultiplyNumbersInString(string text, int multiplier)
{
return string.Join(" ", (from t in text.Split(' ')
select (t.Contains(",")
? string.Join(",",
(from t1 in t.Split(',')
select (double.Parse(t1) * multiplier).ToString()))
: t)).ToList());
}