kartal
kartal

Reputation: 18086

Convert from string to system.drawing.point c#

I want to convert from string {X=-24,Y=10} which generated by Point.ToString(); to Point again?

I save the string value in xml file in save mode and I want read it back to point again in read mode.

Upvotes: 4

Views: 10451

Answers (7)

GHOST
GHOST

Reputation: 358

try this, its what I use in my project.

string str = "-24,10";
Point pt = new Point(Int32.Parse(str.Split(',')[0]), Int32.Parse(str.Split(',')[1]));

Upvotes: 0

Kim Ki Won
Kim Ki Won

Reputation: 1855

see PointConverter ConvertFrom method.

Upvotes: 0

Edward
Edward

Reputation: 1255

I needed this functionality today, myself, so I just coded it. Here is a very picky parser, using a "TryParse" approach. I don't like what I call 'lazy' parsing where "blah4,9anything" would get parsed as a point. And I don't like throwing errors. The 'TryParse' methods of data types are very robust to me. So here's my implementation for any to use. My only request is if you find a bug, please let me know! :)

public static bool TryParsePoint(string s, out System.Drawing.Point p)
{   p = new System.Drawing.Point();
    string s1 = "{X=";
    string s2 = ",Y=";
    string s3 = "}";
    int x1 = s.IndexOf(s1, StringComparison.OrdinalIgnoreCase);
    int x2 = s.IndexOf(s2, StringComparison.OrdinalIgnoreCase);
    int x3 = s.IndexOf(s3, StringComparison.OrdinalIgnoreCase);
    if (x1 < 0 || x1 >= x2 || x2 >= x3) { return false; }
    s1 = s.Substring(x1 + s1.Length, x2 - x1 - s1.Length);
    s2 = s.Substring(x2 + s2.Length, x3 - x2 - s2.Length); int i = 0;
    if (Int32.TryParse(s1, out i) == false) { return false; } p.X = i;
    if (Int32.TryParse(s2, out i) == false) { return false; } p.Y = i;
    return true;
} // public static bool TryParsePoint(string s, out System.Drawing.Point p)

Note you may also want to remove or change the public or static modifier(s) of the method. But I used that method in the Program class, so mine needed to be public static. Suit yourself tho.

Upvotes: 1

Doug
Doug

Reputation: 2610

Hans Passant had the right solution: Don't use Point.ToString(), which gives you that crazy, un-reusable string (MSDN calls it "human-readable"). Use the PointConverter class instead.

To generate the string:

Dim myPoint As New Point(0, 0)
Dim pointConverter As System.ComponentModel.TypeConverter = _
    System.ComponentModel.TypeDescriptor.GetConverter(GetType(Point))
Dim pointAsString As String = pointConverter.ConvertToString(myPoint)

And to interpret the above string:

Dim pointConverter As System.ComponentModel.TypeConverter = _
    System.ComponentModel.TypeDescriptor.GetConverter(GetType(Point))
Dim myNewPoint As New Point = pointConverter.ConvertFromString(pointAsString)

Upvotes: 1

coder
coder

Reputation: 13248

You can try this Point.Parse

Point pointResult = Point.Parse("-24,10");

Upvotes: 1

Royi Namir
Royi Namir

Reputation: 148524

var myStringWhichCantBeChanged="{X=-24,Y=10}";
var g=Regex.Replace(myStringWhichCantBeChanged,@"[\{\}a-zA-Z=]", "").Split(',');

Point pointResult = new Point(
                  int.Parse (g[0]),
                  int.Parse( g[1]));

Upvotes: 4

Oded
Oded

Reputation: 499002

System.Drawing.Point doesn't define a Parse method at all - you will need to write your own that can take this format and return a Point structure.

System.Windows.Point does have a Parse method and may be more suitable for your needs.

However, since you are outputting to XML, non of this should be needed. You should be serializing and deserializng the object graph, which would take care of this automatically without you needing to worry about parsing and formatting.

Upvotes: 2

Related Questions