在C#中如何从字符串解析出PointF?

3

我有一些保存成这样的文件的积分:

PointF p = new PointF(109.1679, 162.4473);
string lineInFile = p.ToString();

// in file it looks like this then:
{X=109,1679, Y=162,4473}

目前我无法使用linq或.NET Framework 4.5。 我需要一个纯C#的解决方案,最高只能使用4.0版本。那么我该如何解析这个点呢?

请注意,它是PointF而不是Point,并且语言特定的格式使点在字符串中显示为逗号。


编辑:我已经接受了一个答案,但我希望用户修改文件时出现的小问题也能得到解决。例如 { X = 109,1679 ,Y = 162,4473 }


@DanPantry:LINQ如何帮助反转PointF.ToString - Tim Schmelter
@DanPantry:我忽略了他提到了这一点。好吧,LINQ肯定不是将字符串解析为floatPointF的正确工具。 - Tim Schmelter
我不反对,@TimSchmelter :) - Dan
@TimSchmelter 我看到了这个 - Bitterblue
@TimSchmelter 因为我之前遇到了坏的用户输入问题,不得不进行服务。只是试图构建能够忽略垃圾空格和其他东西的强大软件。 - Bitterblue
显示剩余5条评论
2个回答

3

您可以使用正则表达式来解析格式:

using System.Text.RegularExpressions;

Match m = Regex.Match("{X=109,1679, Y=162,4473}", "{X=(\\d+.\\d+), Y=(\\d+.\\d+)}");
PointF p = new PointF(float.Parse(m.Groups[1].Value), float.Parse(m.Groups[2].Value));

请注意,我使用了一个 . 来检查小数分隔符,因为 ToString()的输出将根据语言环境而异。
我假设您不能更改输出文件的文件结构,否则您可以使用内置的XML或JSON序列化功能。

你可以使用 [.,] 来检查小数点(而不是任何字符),并在解析之前将“,”替换为“.”。 - Hans Kesting
@HansKesting 嗯,但这些是唯一的十进制分隔符吗?无论如何,任何其他字符都会正确地抛出解析异常。 - CodingIntrigue
此解决方案将遵循CurrentCulture,通过对使用的正则表达式放宽要求并使用float.Parse()来解析整个值,以使用当前文化。 - CodingIntrigue
@RGraham - 我进行了检查,并惊讶地发现有些文化使用 /(fa-IR),或者(仅适用于货币)-(kk-KZ)或```(mr-IN)。 - Hans Kesting

3

这里是一个仅使用 string.Splitfloat.TryParse 的字符串方法版本:

string[] tokens = lineInFile.Split(new[]{", "}, StringSplitOptions.RemoveEmptyEntries);
string valueX = tokens[0].Split('=')[1];
string valueY = tokens[1].Split('=')[1].TrimEnd('}');
float x; float y;
if (float.TryParse(valueX, out x) && float.TryParse(valueY, out y))
{
    PointF parsed = new PointF(x, y);
}

请注意,仅当与使用 PointF.ToString 时相同的 NumberDecimalSeparator 用于解析字符串为浮点数时,才会起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接