|
C. David Johnson wrote: its not whitespace it is literally a crlf
CrLf is white-space!
Whitespace character - Wikipedia[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
C. David Johnson wrote: Well crap that is not the answer I was looking for
Presumably you are not passing the xml data but rather a string.
So once you have the string use string (not xml) insertion to add the whitespace.
And ALSO add a comment both in the xml handling code and the string insertion code to explain why you are doing that.
|
|
|
|
|
FIELDID is an "attribute" and you need to tag it as such; e.g.
[System.Xml.Serialization.XmlAttributeAttribute()]
public ushort FIELDID { get; set; }
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Hi,
In this value, 1.0, I want to compare the 0 value. While the code works if the value is 1.5, I am able to compare 5, i am not able to do the same with 0.
This works:: Convert.ToDouble(1.5).ToString().Split('.')[1]; I get a 5 value.
But this does not work :Convert.ToDouble(1.0).ToString().Split('.')[1]; I get an error message, out of bounds.
any ideas?
thanks.
|
|
|
|
|
You need to use a format string which produces a fixed number of decimal places - for example, "F3" .
Standard Numeric Format Strings | Microsoft Docs[^]
You'll also need to use the invariant culture, in case the current culture uses a different decimal separator.
string s = value.ToString("F3", CultureInfo.InvariantCulture).Split('.')[1];
But if you explain what you're actually trying to achieve, there's probably a better way to do it.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Don't use compound statements like the above, and assume that they will do what you want. As you can see they often do not. In your case (double)1.0.ToString() produces the simple string "1". Which, if you had split the statement into its constituent parts you would have seen immediately.
I am not sure what actual problem you are trying to solve here but I suspect there are much simpler mathematical ways to do it.
|
|
|
|
|
I laugh and laugh and laugh, I got chipped by a junior recently for doing exactly that, he proudly proclaimed he could write it in a single pass, when I pointed out it was difficult to debug ha had trouble understanding why.
I when pointed out the commented input string where a stupid f***ing bastard of a system of steaming pile of dog crap allows the user t enter 7.2m ot 3.1T to represent millions and thousands - Murex I hate you!
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Hi,
you shouldn't use strings to solve numeric problems. Your problem arrises when ToString() returns just "1" and not "1.0". You could of course enforce the latter by specifying the string format you want, but that is not the right way, use the appropriate conversions or functions instead.
It seems you want the fractional part of a real (float or double or even decimal) number; I don't know any function that offers that straight away. One way to get that is by first getting the integer part (e.g. with Math.Floor or Math.Truncate ) then take the difference. Another way could be to cast to integer, but then you might run into overflow situations.
If negative inputs are allowed, be careful to first specify what you want, and then check your code for it.
|
|
|
|
|
I just ran into a similar issue. We store data in an XML file and doubles trim the trailing zeros
so you may have to do something like
Convert.ToDouble(1.0).ToString("0.00").Split('.')[1]
|
|
|
|
|
Your code is basically what Richard D already offered (minus the Culture stuff) and it wouldn't work in large parts of the world, as not all people use a period for the decimal point.
Furthermore you are calling multiple methods and generating several objects that aren't really necessary to perform a rather simple math operation.
|
|
|
|
|
Granted there are a number of things you would do differently if your code is used internationally. Normally I pass and use the base types (double, int...) and let the UI worry about the display and format.
And sure I would never do multiple method calls in a single line. When you split you always make sure the ordinal is there before trying to pull it.
|
|
|
|
|
Why don't you just get and compare the "remainders"? e.g.
int remainder1 = (int) (1.0 % 1);
int remainder2 = (int) (1.5 % 1);
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
I'm fairly new to Serialization, most of my work has been direct DB or Simple Serialize an object using json. I'm trying to read an XML document using an XmlSerializer. I've done this in the past from an XSD but there is none for this application. and Im lost
The XML file looks like this
<? xml version="1.0" encoding="utf-8"?>
<DTAXDOC>
<DATA>
<KEY FIELDID = "1" > Hello World</ KEY>
</DATA>
</DTAXDOC>
And this is my simple sample app
using System;
using System.IO;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var ser = new XmlSerializer(typeof(POCO.DTAxType));
var returned = (DTAxType)ser.Deserialize(new FileStream("D:\\HelloWorld.txt", FileMode.Open));
}
}
[Serializable]
[XmlRoot("DTAXDOC", Namespace = "", IsNullable = false)]
public class DTAxType
{
[XmlElement("DATA")]
public KeyType[] Data { set; get; }
}
[Serializable]
[XmlType("DATA")]
public class KeyType
{
[XmlAttribute("FIELDID")]
public int FieldId { set; get; }
public string Value { set; get; }
}
}
When I run the app I get nothing but an empty object
Am I a complete idiot or missing something simple. In the finished solution The Data variable should be a List of KeyType.
Thanks in advance for any help.
|
|
|
|
|
Assuming the extra spaces in your sample XML aren't actually present in your file, there are two problems.
First, the KeyType element is too high. You've declared that it's taken from the DATA node, but it's actually a descendant of that node.
Second, the Value property needs to be decorated with the [XmlText] attribute.
[Serializable]
[XmlRoot("DTAXDOC", Namespace = "", IsNullable = false)]
public class DTAxType
{
[XmlElement("DATA")]
public DataType[] Data { set; get; }
}
[Serializable]
[XmlType("DATA")]
public class DataType
{
[XmlElement("KEY")]
public KeyType[] Key { set; get; }
}
[Serializable]
[XmlType("KEY")]
public class KeyType
{
[XmlAttribute("FIELDID")]
public int FieldId { set; get; }
[XmlText]
public string Value { set; get; }
}
With those changes in place, your sample XML deserializes to:
new DTAxType
{
Data = new[]
{
new DataType
{
Key = new[]
{
new KeyType
{
FieldId = 1,
Value = "Hello World"
}
}
}
}
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Perfect thanks. for the help
|
|
|
|
|
I'm working on a program that is behaving differently when I debug than when I run it. Everyone I've described it to says it sounds like a data race is happening, but if I've done any of the kinds of things that can possibly lead to data races, I've done it without realizing.
It won't compile on its own, but this is the function that is behaving unexpectedly:
static public Dictionary<ComplexNumber, int> getFactorization(ComplexNumber x)
{
ComplexNumber xGaussian = new ComplexNumber(x.getRealPart().getNumerator() *
x.getImaginaryPart().getDenominator(), x.getImaginaryPart().getNumerator() *
x.getRealPart().getDenominator());
Dictionary<int, int> denominatorCancellerFactors =
getFactorization(x.getRealPart().getDenominator() *
x.getImaginaryPart().getDenominator());
Dictionary<ComplexNumber, int> factors = new Dictionary<ComplexNumber, int>();
foreach (int factor in denominatorCancellerFactors.Keys)
factors.Add(new ComplexNumber(new Fraction(1, factor), new Fraction(0, 1)),
denominatorCancellerFactors[factor]);
int sumOfRealAndImaginary = 2;
while (true)
{
Console.WriteLine(sumOfRealAndImaginary);
int realPart = sumOfRealAndImaginary / 2;
int imaginaryPart = sumOfRealAndImaginary - realPart;
for (int i = 0; realPart - i >= 0;)
{
if ((realPart - i) * (realPart - i) +
(imaginaryPart + i) * (imaginaryPart + i) >
xGaussian.getRealPart().getNumerator() *
xGaussian.getRealPart().getNumerator() +
xGaussian.getImaginaryPart().getNumerator() *
xGaussian.getImaginaryPart().getNumerator())
{
if (factors.ContainsKey(xGaussian))
factors[xGaussian] += 1;
else
factors.Add(xGaussian, 1);
return factors;
}
ComplexNumber factor =
new ComplexNumber(realPart - i, imaginaryPart + i);
ComplexNumber quotient = (ComplexNumber)(xGaussian / factor);
quotient.getRealPart().reduce();
quotient.getImaginaryPart().reduce();
if (quotient.getRealPart().getDenominator() == 1 &&
quotient.getImaginaryPart().getDenominator() == 1)
{
if (factors.ContainsKey(factor))
factors[factor] += 1;
else
factors.Add(factor, 1);
xGaussian = (ComplexNumber)(xGaussian / factor);
continue;
}
factor = new ComplexNumber(realPart - i, -imaginaryPart - i);
quotient = (ComplexNumber)(xGaussian / factor);
quotient.getRealPart().reduce();
quotient.getImaginaryPart().reduce();
if (quotient.getRealPart().getDenominator() == 1 &&
quotient.getImaginaryPart().getDenominator() == 1)
{
if (factors.ContainsKey(factor))
factors[factor] += 1;
else
factors.Add(factor, 1);
xGaussian = (ComplexNumber)(xGaussian / factor);
continue;
}
++i;
}
++sumOfRealAndImaginary;
}
}
The ComplexNumber type is designed to behave the way complex numbers do in math (though limited to real and imaginary parts that are rational) so I'll type the value of a ComplexNumber object the same way as I would a complex number in math.
Note how sumOfRealAndImaginary is initialized to 2, and the only place it's changed is where it's incremented at the bottom of the while loop. In debug mode, when I pass getFactorization() the value 3+4i and step through the code at a sufficiently moderate speed, it returns at a time when sumOfRealAndImaginary = 3 . This is what I expect. However, when I run the program, also with 3+4i as the function argument, it doesn't return until sumOfRealAndImaginary = 126 , as can be seen from the WriteLine() call at the top of the while loop. In particular, the first if statement in the while loop, whose code block includes the function's return statement, takes many more passes to evaluate to true when running than when debugging. It should evaluate to true not only for the expected sumOfRealAndImaginary value of 3, but also for every value larger than that. Also, when I step through the code sufficiently quickly in debug mode, that if statement keeps evaluating to false until I slow down, at which point it evaluates to true on the next pass. So it would seem that whether the if statement evaluates correctly depends on how quickly the code is executed. What could cause this behavior?
Unfortunately, any compilable test program I can figure out how to make for getFactorization() would include the majority of the original program, so...here is a text file of the code for the whole thing, for if the problem depends on the other parts of my code that getFactorization() refers to, and in case people need to test it themselves firsthand. A command line input of (3+4i)^2 will cause getFactorization() to be called with an argument of 3+4i.
modified 5-Oct-17 12:53pm.
|
|
|
|
|
It happens because of reduce in Fraction (more accurately, because it gets called at some later time, instead of directly at construction). Likely (though this is hard to test) because single-stepping actually calls it (since the debugger calls ToString on locals to display them, and ToString does a reduce). Calling reduce late causes problems, like changing the hash value of objects or whatever, though GetHashCode does call reduce already. Nevertheless something goes wrong because of this, which I could fix by stopping all those random reduces and just reducing in the constructor.
I recommend making all of those types immutable, and reducing in the constructor of Fraction.
Bonus: I also recommend not using | to combine hash codes (which is very biased towards producing set bits in the result). The "basic choices" are XOR and addition, there are fancier combiners such as unchecked(x + 31 * y) . Choose basically whatever, just not OR. You don't need to call GetHashCode on an int.
Also your GCD-by-factorization is extreme overkill, just use the Euclidean algorithm.
modified 5-Oct-17 17:12pm.
|
|
|
|
|
Quote: Likely (though this is hard to test) because single-stepping actually calls it (since the debugger calls ToString on locals to display them, and ToString does a reduce).
I had noticed that what displays when I hover the cursor over a variable in debug mode is whatever the result of calling ToString on its value would be. I would have expected the IDE to effectively make a copy of the variable value and apply ToString to that so as not to impose any side effects a ToString override might have on the execution of the program itself. Is it, perhaps, very unusual to override ToString in a way that has side effects? The reason I did it here, for what it's worth, is so that Fraction objects only get reduced at times when they "need" to be, but you may be right that this causes problems. It's certainly worth it for me to try your suggestion and see if it fixes the problem. I would have thought reduce being called more often than I intended would be harmless as far as getFactorization and most other things are concerned, though. I'll have to think about whether it makes sense that it would cause the behavior I'm seeing, or if there's still an element to this that I don't understand.
Quote: Bonus: I also recommend not using | to combine hash codes (which is very biased towards producing set bits in the result).
Heh. I only used | in GetHashCode because at the time, all I was really interested in was the Equals overload, and | is what the MSDN documentation on the topic used. I'll look into ways to do it that are more proper at some point.
|
|
|
|
|
To be honest I don't fully understand what happened there either, it looks as though reducing multiple times (or never, in cases where it shouldn't be necessary) should be mostly harmless (except for overflow, which doesn't seem to happen in this test case).. but when I changed it to reducing in the constructor it behaved as expected, so I ended up blaming that anyway.
|
|
|
|
|
I made the change too and things are now working as expected (including for inputs that used to misbehave much worse than the one I described). It bothers me a little that I'm now doing more work reducing than is theoretically necessary, but I suppose viewing it as a relatively expensive operation will be less true if I implement a more efficient algorithm for it, as you point out is possible.
|
|
|
|
|
You could perhaps skip some unnecessary reductions in a more explicit way, though most of the ways to do that make it possible to hold an unreduced fraction and use it in ways that it isn't meant to be used. I'm think of approaches such as returning unreduced fractions from arithmetic operators, and having reduce return a new fraction. If you made reduced and unreduced fractions separate types, you could still maintain a safe interface, but it also complicates everything. I can't really think of a solution that is just all around a Great Solution, perhaps someone else has more inspiration?
TBH I would probably resort to just using plain ints in most of the math routines, so that from the outside all fractions are nice and reduced and no weird problems arise, but internally the cost of unnecessary reductions is not paid. Not a Great Solution since it breaks through the abstraction but I could live with that because it is contained. This approach probably allows the most optimization since everything is super explicit, so if that's the focus it may be reasonable.
With the Euclidean algorithm the cost of reducing is typically one or two divisions (a handful at worst) and a couple of branches, not ideal but probably not a huge deal, I don't know. Not as big a deal as factorization at least.
|
|
|
|
|
An experiment I ran:
using System;
namespace Test
{
class Foo
{
public int a = 2;
public override string ToString()
{
a = 3;
return a.ToString();
}
}
class Solver
{
public static void Main()
{
Foo x = new Foo();
Console.WriteLine(x.a);
}
}
}
This does indeed print 2 when run, but 3 when debugged, so the debugger definitely calls ToString directly on the object in the given code. While there are other details to fill in about what was happening in my program, this is one thing cleared up.
|
|
|
|
|
Hello everyone, first post here, so if you see errors on posting/explaining, make me know to fix it...
What i want to make it's form that parse an INTRANET webpage and bring me data back to show it on labels....
I have tried with HtlmAgilityPack, but it doesn't parse anything of that web, cause its intranet, and i'm doing something that don't fit well. It returns me an error like "specific node can't be null"...
Something like this:
public class Program
{
public static void Main()
{
var html = @"http://html-agility-pack.net/"; HERE GOES MY INTRANET URL, AND NOT THIS.
HtmlWeb web = new HtmlWeb();
var htmlDoc = web.Load(html);
var node = htmlDoc.DocumentNode.SelectSingleNode("//td/span");
}
}
Something like this:
https://imgur.com/uk4Wztd[^]
When click in the button, bring me the especific data.
|
|
|
|
|
Member 13447810 wrote: What i want to make it's form that parse an INTRANET webpage and bring me data back to show it on labels.... That makes no sense at all in my limited mind.
You have a webpage, shown in a browser. And now you want a WinForm to fetch those values?
Member 13447810 wrote: I have tried with HtlmAgilityPack, but it doesn't parse anything of that web, cause its intranet, and i'm doing something that don't fit well. Works as well with internet as well as intranet; there is no difference between those two on that level.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Eddy Vluggen wrote: That makes no sense at all in my limited mind.
You have a webpage, shown in a browser. And now you want a WinForm to fetch those values?
The problem is that people working here shouldn't use internet, but they do. So, we need to take them off of the browser, then putting it on a Winform will make it easier to block them from internet.
Any idea?
|
|
|
|
|