将混合字符串(SVG路径)中的数字乘以公因子

时间:2014-11-07 11:10:53

标签: c# .net string svg

有一种简单的方法可以将混合(文本和数字)字符串中的所有数字乘以一个因子吗?

我有一个SVG路径,例如:d = "M 0,20 40,20 40,80 0,80 z"

该字符串包含数字对,由,分隔。每个数字也可以是双精度值。数字对代表x,y坐标。

如何将该字符串中的所有数字对乘以例如2?

4 个答案:

答案 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());
}